first commit
This commit is contained in:
commit
0e423e1115
15
.htaccess
Normal file
15
.htaccess
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
RewriteEngine On
|
||||||
|
|
||||||
|
# Put your installation directory here:
|
||||||
|
# If your URL is www.example.com/, use /
|
||||||
|
# If your URL is www.example.com/site_folder/, use /site_folder/
|
||||||
|
|
||||||
|
RewriteBase /cirestful
|
||||||
|
|
||||||
|
# Do not enable rewriting for files or directories that exist
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
|
|
||||||
|
# For reuests that are not actual files or directories,
|
||||||
|
# Rewrite to index.php/URL
|
||||||
|
RewriteRule ^(.*)$ index.php/$1 [PT,L]
|
223
README.md
Normal file
223
README.md
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
# CodeIgniter Rest Server
|
||||||
|
|
||||||
|
A fully RESTful server implementation for CodeIgniter using one library, one
|
||||||
|
config file and one controller.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
1. PHP 5.2 or greater
|
||||||
|
2. CodeIgniter 2.1.0 to 3.0-dev
|
||||||
|
|
||||||
|
_Note: for 1.7.x support download v2.2 from Downloads tab_
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Drag and drop the **application/libraries/Format.php** and **application/libraries/REST_Controller.php** files into your application's directories. Either autoload the `REST_Controller` class or `require_once` it at the top of your controllers to load it into the scope. Additionally, copy the **rest.php** file from **application/config** in your application's configuration directory.
|
||||||
|
|
||||||
|
## Handling Requests
|
||||||
|
|
||||||
|
When your controller extends from `REST_Controller`, the method names will be appended with the HTTP method used to access the request. If you're making an HTTP `GET` call to `/books`, for instance, it would call a `Books#index_get()` method.
|
||||||
|
|
||||||
|
This allows you to implement a RESTful interface easily:
|
||||||
|
|
||||||
|
class Books extends REST_Controller
|
||||||
|
{
|
||||||
|
public function index_get()
|
||||||
|
{
|
||||||
|
// Display all books
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index_post()
|
||||||
|
{
|
||||||
|
// Create a new book
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
`REST_Controller` also supports `PUT` and `DELETE` methods, allowing you to support a truly RESTful interface.
|
||||||
|
|
||||||
|
Accessing parameters is also easy. Simply use the name of the HTTP verb as a method:
|
||||||
|
|
||||||
|
$this->get('blah'); // GET param
|
||||||
|
$this->post('blah'); // POST param
|
||||||
|
$this->put('blah'); // PUT param
|
||||||
|
$this->delete('blah'); // DELETE param
|
||||||
|
|
||||||
|
## Content Types
|
||||||
|
|
||||||
|
`REST_Controller` supports a bunch of different request/response formats, including XML, JSON and serialised PHP. By default, the class will check the URL and look for a format either as an extension or as a separate segment.
|
||||||
|
|
||||||
|
This means your URLs can look like this:
|
||||||
|
|
||||||
|
http://example.com/books.json
|
||||||
|
http://example.com/books?format=json
|
||||||
|
|
||||||
|
This can be flaky with URI segments, so the recommend approach is using the HTTP `Accept` header:
|
||||||
|
|
||||||
|
$ curl -H "Accept: application/json" http://example.com
|
||||||
|
|
||||||
|
Any responses you make from the class (see [responses](#responses) for more on this) will be serialised in the designated format.
|
||||||
|
|
||||||
|
## Responses
|
||||||
|
|
||||||
|
The class provides a `response()` method that allows you to return data in the user's requested response format.
|
||||||
|
|
||||||
|
Returning any object / array / string / whatever is easy:
|
||||||
|
|
||||||
|
public function index_get()
|
||||||
|
{
|
||||||
|
$this->response($this->db->get('books')->result());
|
||||||
|
}
|
||||||
|
|
||||||
|
This will automatically return an `HTTP 200 OK` response. You can specify the status code in the second parameter:
|
||||||
|
|
||||||
|
public function index_post()
|
||||||
|
{
|
||||||
|
// ...create new book
|
||||||
|
|
||||||
|
$this->response($book, 201); // Send an HTTP 201 Created
|
||||||
|
}
|
||||||
|
|
||||||
|
If you don't specify a response code, and the data you respond with `== FALSE` (an empty array or string, for instance), the response code will automatically be set to `404 Not Found`:
|
||||||
|
|
||||||
|
$this->response(array()); // HTTP 404 Not Found
|
||||||
|
|
||||||
|
## Multilingual Support
|
||||||
|
|
||||||
|
If your application uses language files to support multiple locales, `REST_Controller` will automatically parse the HTTP `Accept-Language` header and provide the language(s) in your actions. This information can be found in the `$this->response->lang` object:
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
if (is_array($this->response->lang))
|
||||||
|
{
|
||||||
|
$this->load->language('application', $this->response->lang[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->load->language('application', $this->response->lang);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
## Authentication
|
||||||
|
|
||||||
|
This class also provides rudimentary support for HTTP basic authentication and/or the securer HTTP digest access authentication.
|
||||||
|
|
||||||
|
You can enable basic authentication by setting the `$config['rest_auth']` to `'basic'`. The `$config['rest_valid_logins']` directive can then be used to set the usernames and passwords able to log in to your system. The class will automatically send all the correct headers to trigger the authentication dialogue:
|
||||||
|
|
||||||
|
$config['rest_valid_logins'] = array( 'username' => 'password', 'other_person' => 'secure123' );
|
||||||
|
|
||||||
|
Enabling digest auth is similarly easy. Configure your desired logins in the config file like above, and set `$config['rest_auth']` to `'digest'`. The class will automatically send out the headers to enable digest auth.
|
||||||
|
|
||||||
|
Both methods of authentication can be secured further by using an IP whitelist. If you enable `$config['rest_ip_whitelist_enabled']` in your config file, you can then set a list of allowed IPs.
|
||||||
|
|
||||||
|
Any client connecting to your API will be checked against the whitelisted IP array. If they're on the list, they'll be allowed access. If not, sorry, no can do hombre. The whitelist is a comma-separated string:
|
||||||
|
|
||||||
|
$config['rest_ip_whitelist'] = '123.456.789.0, 987.654.32.1';
|
||||||
|
|
||||||
|
Your localhost IPs (`127.0.0.1` and `0.0.0.0`) are allowed by default.
|
||||||
|
|
||||||
|
## API Keys
|
||||||
|
|
||||||
|
In addition to the authentication methods above, the `REST_Controller` class also supports the use of API keys. Enabling API keys is easy. Turn it on in your **config/rest.php** file:
|
||||||
|
|
||||||
|
$config['rest_enable_keys'] = TRUE;
|
||||||
|
|
||||||
|
You'll need to create a new database table to store and access the keys. `REST_Controller` will automatically assume you have a table that looks like this:
|
||||||
|
|
||||||
|
CREATE TABLE `keys` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`key` varchar(40) NOT NULL,
|
||||||
|
`level` int(2) NOT NULL,
|
||||||
|
`ignore_limits` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
|
`date_created` int(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
The class will look for an HTTP header with the API key on each request. An invalid or missing API key will result in an `HTTP 403 Forbidden`.
|
||||||
|
|
||||||
|
By default, the HTTP will be `X-API-KEY`. This can be configured in **config/rest.php**.
|
||||||
|
|
||||||
|
$ curl -X POST -H "X-API-KEY: some_key_here" http://example.com/books
|
||||||
|
|
||||||
|
## Other Documentation / Tutorials
|
||||||
|
|
||||||
|
* [NetTuts: Working with RESTful Services in CodeIgniter](http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/)
|
||||||
|
|
||||||
|
## Change Log
|
||||||
|
|
||||||
|
### 2.6.2
|
||||||
|
|
||||||
|
* Update CodeIgniter files to 2.1.3
|
||||||
|
* Fixed issue #165
|
||||||
|
|
||||||
|
### 2.6.1
|
||||||
|
|
||||||
|
* Update CodeIgniter files to 2.1.2
|
||||||
|
* Log Table support for IPv6 & NULL parameters
|
||||||
|
* Abstract out the processes of firing a controller method within _remap() to an separate method
|
||||||
|
* Moved GET, POST, PUT, and DELETE parsing to separate methods, allowing them to be overridden as needed
|
||||||
|
* Small bugfix for a PHP 5.3 strlen error
|
||||||
|
* Fixed some PHP 5.4 warnings
|
||||||
|
* Fix for bug in Format.php's to_html() which failed to detect if $data was really a multidimensional array.
|
||||||
|
* Fix for empty node on XML output format, for false = 0, true = 1.
|
||||||
|
|
||||||
|
### 2.6.0
|
||||||
|
|
||||||
|
* Added loads of PHPDoc comments.
|
||||||
|
* Response where method doesn't exist is now "HTTP 405 Method Not Allowed", not "HTTP 404 Not Found".
|
||||||
|
* Compatible with PHP 5.4.
|
||||||
|
* Added support for gzip compression.
|
||||||
|
* Fix the apache\_request\_header function with CGI.
|
||||||
|
* Fixed up correctly .foo extensions to work when get arguments provided.
|
||||||
|
* Allows method emulation via X-HTTP-Method-Override
|
||||||
|
* Support for Backbone.emulateHTTP improved.
|
||||||
|
* Combine both URI segment and GET params instead of using one or the other
|
||||||
|
* Separate each piece of the WWW-Authenticate header for digest requests with a comma.
|
||||||
|
* Added IP whitelist option.
|
||||||
|
|
||||||
|
### 2.5
|
||||||
|
|
||||||
|
* Instead of just seeing item, item, item, the singular version of the basenode will be used if possible. [Example](http://d.pr/RS46).
|
||||||
|
* Re-factored to use the Format library, which will soon be merged with CodeIgniter.
|
||||||
|
* Fixed Limit bug (limit of 5 would allow 6 requests).
|
||||||
|
* Added logging for invalid API key requests.
|
||||||
|
* Changed serialize to serialized.
|
||||||
|
* Changed all visibility 'private' to 'protected'.
|
||||||
|
* MIME's with character encodings on the end will now work.
|
||||||
|
* Fixed PUT arguments. Once again just sending a body query string works. [Example](http://d.pr/cY0b)
|
||||||
|
* Fixed up all .foo extensions to work when no get arguments provided, and moved .html to Format library.
|
||||||
|
* Updated key.php example to use config_item('rest_keys_table') instead of hardcoded 'keys' table name.
|
||||||
|
* Updated REST_Controller to use config_item('rest_limits_table') instead of hardcoded 'limits'.
|
||||||
|
|
||||||
|
### 2.4
|
||||||
|
|
||||||
|
* Added support for UTF-8 characters in XML.
|
||||||
|
* Added JSONP as a return type.
|
||||||
|
* Loaded the Security lib before use in case it is not loaded in the application.
|
||||||
|
* Emulate the Request method for MooTools support.
|
||||||
|
* Upgraded everything to use CodeIgniter Reactor 2.0.0.
|
||||||
|
* Added the ability to set or override the Auth type per controller / method.
|
||||||
|
* Adding ability to only accept AJAX requests.
|
||||||
|
|
||||||
|
### 2.3
|
||||||
|
|
||||||
|
* Upgraded to CodeIgniter 2.0 and stopped supporting CodeIgniter 1.7.2.
|
||||||
|
* After $this->response() is called the controller will stop processing.
|
||||||
|
|
||||||
|
### 2.2
|
||||||
|
|
||||||
|
* Added config options to set table names for keys, limits and logs.
|
||||||
|
* FALSE values were coming out as empty strings in xml or rawxml mode, now they will be 0/1.
|
||||||
|
* key => FALSE can now be used to override the keys_enabled option for a specific method, and level is now optional. If no level is set it will assume the method has a level of 0.
|
||||||
|
* Fixed issue where calls to ->get('foo') would error is foo was not set. Reported by Paul Barto.
|
||||||
|
|
||||||
|
## Contributions
|
||||||
|
|
||||||
|
This project has been funded and made possible through my clients kindly allowing me to
|
||||||
|
open-source the functionality as I build it into their projects. I am no longer actively developing
|
||||||
|
features for this as I no longer require it, but I will continue to maintain pull requests and try to
|
||||||
|
fix issues as and when they are reported (within a week or two).
|
||||||
|
|
||||||
|
Pull Requests are the best way to fix bugs or add features. I know loads of you use this, so please
|
||||||
|
contribute if you have improvements to be made and I'll keep releasing versions over time.
|
1
application/cache/.htaccess
vendored
Normal file
1
application/cache/.htaccess
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
deny from all
|
10
application/cache/index.html
vendored
Normal file
10
application/cache/index.html
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
116
application/config/autoload.php
Normal file
116
application/config/autoload.php
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| AUTO-LOADER
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file specifies which systems should be loaded by default.
|
||||||
|
|
|
||||||
|
| In order to keep the framework as light-weight as possible only the
|
||||||
|
| absolute minimal resources are loaded by default. For example,
|
||||||
|
| the database is not connected to automatically since no assumption
|
||||||
|
| is made regarding whether you intend to use it. This file lets
|
||||||
|
| you globally define which systems you would like loaded with every
|
||||||
|
| request.
|
||||||
|
|
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Instructions
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| These are the things you can load automatically:
|
||||||
|
|
|
||||||
|
| 1. Packages
|
||||||
|
| 2. Libraries
|
||||||
|
| 3. Helper files
|
||||||
|
| 4. Custom config files
|
||||||
|
| 5. Language files
|
||||||
|
| 6. Models
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Packges
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['packages'] = array(APPPATH.'third_party', '/usr/local/shared');
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
$autoload['packages'] = array(APPPATH.'third_party');
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Libraries
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| These are the classes located in the system/libraries folder
|
||||||
|
| or in your application/libraries folder.
|
||||||
|
|
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['libraries'] = array('database', 'session', 'xmlrpc');
|
||||||
|
*/
|
||||||
|
|
||||||
|
$autoload['libraries'] = array('database');
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Helper Files
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['helper'] = array('url', 'file');
|
||||||
|
*/
|
||||||
|
|
||||||
|
$autoload['helper'] = array('url');
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Config files
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['config'] = array('config1', 'config2');
|
||||||
|
|
|
||||||
|
| NOTE: This item is intended for use ONLY if you have created custom
|
||||||
|
| config files. Otherwise, leave it blank.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
$autoload['config'] = array();
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Language files
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['language'] = array('lang1', 'lang2');
|
||||||
|
|
|
||||||
|
| NOTE: Do not include the "_lang" part of your file. For example
|
||||||
|
| "codeigniter_lang.php" would be referenced as array('codeigniter');
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
$autoload['language'] = array();
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Auto-load Models
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Prototype:
|
||||||
|
|
|
||||||
|
| $autoload['model'] = array('model1', 'model2');
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
$autoload['model'] = array();
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file autoload.php */
|
||||||
|
/* Location: ./application/config/autoload.php */
|
360
application/config/config.php
Normal file
360
application/config/config.php
Normal file
@ -0,0 +1,360 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Base Site URL
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| URL to your CodeIgniter root. Typically this will be your base URL,
|
||||||
|
| WITH a trailing slash:
|
||||||
|
|
|
||||||
|
| http://example.com/
|
||||||
|
|
|
||||||
|
| If this is not set then CodeIgniter will guess the protocol, domain and
|
||||||
|
| path to your installation.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['base_url'] = 'http://localhost:8080/cirestful';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Index File
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Typically this will be your index.php file, unless you've renamed it to
|
||||||
|
| something else. If you are using mod_rewrite to remove the page set this
|
||||||
|
| variable so that it is blank.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['index_page'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| URI PROTOCOL
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This item determines which server global should be used to retrieve the
|
||||||
|
| URI string. The default setting of 'AUTO' works for most servers.
|
||||||
|
| If your links do not seem to work, try one of the other delicious flavors:
|
||||||
|
|
|
||||||
|
| 'AUTO' Default - auto detects
|
||||||
|
| 'PATH_INFO' Uses the PATH_INFO
|
||||||
|
| 'QUERY_STRING' Uses the QUERY_STRING
|
||||||
|
| 'REQUEST_URI' Uses the REQUEST_URI
|
||||||
|
| 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['uri_protocol'] = 'AUTO';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| URL suffix
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This option allows you to add a suffix to all URLs generated by CodeIgniter.
|
||||||
|
| For more information please see the user guide:
|
||||||
|
|
|
||||||
|
| http://codeigniter.com/user_guide/general/urls.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
$config['url_suffix'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Default Language
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This determines which set of language files should be used. Make sure
|
||||||
|
| there is an available translation if you intend to use something other
|
||||||
|
| than english.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['language'] = 'english';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Default Character Set
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This determines which character set is used by default in various methods
|
||||||
|
| that require a character set to be provided.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['charset'] = 'UTF-8';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Enable/Disable System Hooks
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If you would like to use the 'hooks' feature you must enable it by
|
||||||
|
| setting this variable to TRUE (boolean). See the user guide for details.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['enable_hooks'] = FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Class Extension Prefix
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This item allows you to set the filename/classname prefix when extending
|
||||||
|
| native libraries. For more information please see the user guide:
|
||||||
|
|
|
||||||
|
| http://codeigniter.com/user_guide/general/core_classes.html
|
||||||
|
| http://codeigniter.com/user_guide/general/creating_libraries.html
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['subclass_prefix'] = 'MY_';
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Allowed URL Characters
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This lets you specify with a regular expression which characters are permitted
|
||||||
|
| within your URLs. When someone tries to submit a URL with disallowed
|
||||||
|
| characters they will get a warning message.
|
||||||
|
|
|
||||||
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
|
||||||
|
| as few characters as possible. By default only these are allowed: a-z 0-9~%.:_-
|
||||||
|
|
|
||||||
|
| Leave blank to allow all characters -- but only if you are insane.
|
||||||
|
|
|
||||||
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Enable Query Strings
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| By default CodeIgniter uses search-engine friendly segment based URLs:
|
||||||
|
| example.com/who/what/where/
|
||||||
|
|
|
||||||
|
| By default CodeIgniter enables access to the $_GET array. If for some
|
||||||
|
| reason you would like to disable it, set 'allow_get_array' to FALSE.
|
||||||
|
|
|
||||||
|
| You can optionally enable standard query string based URLs:
|
||||||
|
| example.com?who=me&what=something&where=here
|
||||||
|
|
|
||||||
|
| Options are: TRUE or FALSE (boolean)
|
||||||
|
|
|
||||||
|
| The other items let you set the query string 'words' that will
|
||||||
|
| invoke your controllers and its functions:
|
||||||
|
| example.com/index.php?c=controller&m=function
|
||||||
|
|
|
||||||
|
| Please note that some of the helpers won't work as expected when
|
||||||
|
| this feature is enabled, since CodeIgniter is designed primarily to
|
||||||
|
| use segment based URLs.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['allow_get_array'] = TRUE;
|
||||||
|
$config['enable_query_strings'] = FALSE;
|
||||||
|
$config['controller_trigger'] = 'c';
|
||||||
|
$config['function_trigger'] = 'm';
|
||||||
|
$config['directory_trigger'] = 'd'; // experimental not currently in use
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Error Logging Threshold
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If you have enabled error logging, you can set an error threshold to
|
||||||
|
| determine what gets logged. Threshold options are:
|
||||||
|
| You can enable error logging by setting a threshold over zero. The
|
||||||
|
| threshold determines what gets logged. Threshold options are:
|
||||||
|
|
|
||||||
|
| 0 = Disables logging, Error logging TURNED OFF
|
||||||
|
| 1 = Error Messages (including PHP errors)
|
||||||
|
| 2 = Debug Messages
|
||||||
|
| 3 = Informational Messages
|
||||||
|
| 4 = All Messages
|
||||||
|
|
|
||||||
|
| For a live site you'll usually only enable Errors (1) to be logged otherwise
|
||||||
|
| your log files will fill up very fast.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['log_threshold'] = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Error Logging Directory Path
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Leave this BLANK unless you would like to set something other than the default
|
||||||
|
| application/logs/ folder. Use a full server path with trailing slash.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['log_path'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Date Format for Logs
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Each item that is logged has an associated date. You can use PHP date
|
||||||
|
| codes to set your own date formatting
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['log_date_format'] = 'Y-m-d H:i:s';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Cache Directory Path
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Leave this BLANK unless you would like to set something other than the default
|
||||||
|
| system/cache/ folder. Use a full server path with trailing slash.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['cache_path'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Encryption Key
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If you use the Encryption class or the Session class you
|
||||||
|
| MUST set an encryption key. See the user guide for info.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['encryption_key'] = 'restfull-ci';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Session Variables
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| 'sess_cookie_name' = the name you want for the cookie
|
||||||
|
| 'sess_expiration' = the number of SECONDS you want the session to last.
|
||||||
|
| by default sessions last 7200 seconds (two hours). Set to zero for no expiration.
|
||||||
|
| 'sess_expire_on_close' = Whether to cause the session to expire automatically
|
||||||
|
| when the browser window is closed
|
||||||
|
| 'sess_encrypt_cookie' = Whether to encrypt the cookie
|
||||||
|
| 'sess_use_database' = Whether to save the session data to a database
|
||||||
|
| 'sess_table_name' = The name of the session database table
|
||||||
|
| 'sess_match_ip' = Whether to match the user's IP address when reading the session data
|
||||||
|
| 'sess_match_useragent' = Whether to match the User Agent when reading the session data
|
||||||
|
| 'sess_time_to_update' = how many seconds between CI refreshing Session Information
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['sess_cookie_name'] = 'ci_session';
|
||||||
|
$config['sess_expiration'] = 7200;
|
||||||
|
$config['sess_expire_on_close'] = FALSE;
|
||||||
|
$config['sess_encrypt_cookie'] = FALSE;
|
||||||
|
$config['sess_use_database'] = FALSE;
|
||||||
|
$config['sess_table_name'] = 'ci_sessions';
|
||||||
|
$config['sess_match_ip'] = FALSE;
|
||||||
|
$config['sess_match_useragent'] = TRUE;
|
||||||
|
$config['sess_time_to_update'] = 300;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Cookie Related Variables
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| 'cookie_prefix' = Set a prefix if you need to avoid collisions
|
||||||
|
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
|
||||||
|
| 'cookie_path' = Typically will be a forward slash
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['cookie_prefix'] = '';
|
||||||
|
$config['cookie_domain'] = '';
|
||||||
|
$config['cookie_path'] = '/';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Global XSS Filtering
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Determines whether the XSS filter is always active when GET, POST or
|
||||||
|
| COOKIE data is encountered
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['global_xss_filtering'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Cross Site Request Forgery
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
|
||||||
|
| checked on a submitted form. If you are accepting user data, it is strongly
|
||||||
|
| recommended CSRF protection be enabled.
|
||||||
|
|
|
||||||
|
| 'csrf_token_name' = The token name
|
||||||
|
| 'csrf_cookie_name' = The cookie name
|
||||||
|
| 'csrf_expire' = The number in seconds the token should expire.
|
||||||
|
*/
|
||||||
|
$config['csrf_protection'] = FALSE;
|
||||||
|
$config['csrf_token_name'] = 'csrf_test_name';
|
||||||
|
$config['csrf_cookie_name'] = 'csrf_cookie_name';
|
||||||
|
$config['csrf_expire'] = 7200;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Output Compression
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Enables Gzip output compression for faster page loads. When enabled,
|
||||||
|
| the output class will test whether your server supports Gzip.
|
||||||
|
| Even if it does, however, not all browsers support compression
|
||||||
|
| so enable only if you are reasonably sure your visitors can handle it.
|
||||||
|
|
|
||||||
|
| VERY IMPORTANT: If you are getting a blank page when compression is enabled it
|
||||||
|
| means you are prematurely outputting something to your browser. It could
|
||||||
|
| even be a line of whitespace at the end of one of your scripts. For
|
||||||
|
| compression to work, nothing can be sent before the output buffer is called
|
||||||
|
| by the output class. Do not 'echo' any values with compression enabled.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['compress_output'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Master Time Reference
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Options are 'local' or 'gmt'. This pref tells the system whether to use
|
||||||
|
| your server's local time as the master 'now' reference, or convert it to
|
||||||
|
| GMT. See the 'date helper' page of the user guide for information
|
||||||
|
| regarding date handling.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['time_reference'] = 'local';
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Rewrite PHP Short Tags
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If your PHP installation does not have short tag support enabled CI
|
||||||
|
| can rewrite the tags on-the-fly, enabling you to utilize that syntax
|
||||||
|
| in your view files. Options are TRUE or FALSE (boolean)
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rewrite_short_tags'] = FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Reverse Proxy IPs
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If your server is behind a reverse proxy, you must whitelist the proxy IP
|
||||||
|
| addresses from which CodeIgniter should trust the HTTP_X_FORWARDED_FOR
|
||||||
|
| header in order to properly identify the visitor's IP address.
|
||||||
|
| Comma-delimited, e.g. '10.0.1.200,10.0.1.201'
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['proxy_ips'] = '';
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file config.php */
|
||||||
|
/* Location: ./application/config/config.php */
|
41
application/config/constants.php
Normal file
41
application/config/constants.php
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| File and Directory Modes
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| These prefs are used when checking and setting modes when working
|
||||||
|
| with the file system. The defaults are fine on servers with proper
|
||||||
|
| security, but you may wish (or even need) to change the values in
|
||||||
|
| certain environments (Apache running a separate process for each
|
||||||
|
| user, PHP under CGI with Apache suEXEC, etc.). Octal values should
|
||||||
|
| always be used to set the mode correctly.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
define('FILE_READ_MODE', 0644);
|
||||||
|
define('FILE_WRITE_MODE', 0666);
|
||||||
|
define('DIR_READ_MODE', 0755);
|
||||||
|
define('DIR_WRITE_MODE', 0777);
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| File Stream Modes
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| These modes are used when working with fopen()/popen()
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('FOPEN_READ', 'rb');
|
||||||
|
define('FOPEN_READ_WRITE', 'r+b');
|
||||||
|
define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care
|
||||||
|
define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care
|
||||||
|
define('FOPEN_WRITE_CREATE', 'ab');
|
||||||
|
define('FOPEN_READ_WRITE_CREATE', 'a+b');
|
||||||
|
define('FOPEN_WRITE_CREATE_STRICT', 'xb');
|
||||||
|
define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file constants.php */
|
||||||
|
/* Location: ./application/config/constants.php */
|
62
application/config/database.php
Normal file
62
application/config/database.php
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| DATABASE CONNECTIVITY SETTINGS
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file will contain the settings needed to access your database.
|
||||||
|
|
|
||||||
|
| For complete instructions please consult the 'Database Connection'
|
||||||
|
| page of the User Guide.
|
||||||
|
|
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| EXPLANATION OF VARIABLES
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| ['hostname'] The hostname of your database server.
|
||||||
|
| ['username'] The username used to connect to the database
|
||||||
|
| ['password'] The password used to connect to the database
|
||||||
|
| ['database'] The name of the database you want to connect to
|
||||||
|
| ['dbdriver'] The database type. ie: mysql. Currently supported:
|
||||||
|
mysql, mysqli, postgre, odbc, mssql, sqlite, oci8
|
||||||
|
| ['dbprefix'] You can add an optional prefix, which will be added
|
||||||
|
| to the table name when using the Active Record class
|
||||||
|
| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
|
||||||
|
| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
|
||||||
|
| ['cache_on'] TRUE/FALSE - Enables/disables query caching
|
||||||
|
| ['cachedir'] The path to the folder where cache files should be stored
|
||||||
|
| ['char_set'] The character set used in communicating with the database
|
||||||
|
| ['dbcollat'] The character collation used in communicating with the database
|
||||||
|
| ['swap_pre'] A default table prefix that should be swapped with the dbprefix
|
||||||
|
| ['autoinit'] Whether or not to automatically initialize the database.
|
||||||
|
| ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
|
||||||
|
| - good for ensuring strict SQL while developing
|
||||||
|
|
|
||||||
|
| The $active_group variable lets you choose which connection group to
|
||||||
|
| make active. By default there is only one group (the 'default' group).
|
||||||
|
|
|
||||||
|
| The $active_record variables lets you determine whether or not to load
|
||||||
|
| the active record class
|
||||||
|
*/
|
||||||
|
|
||||||
|
$active_group = 'default';
|
||||||
|
$active_record = TRUE;
|
||||||
|
|
||||||
|
$db['default']['hostname'] = 'localhost';
|
||||||
|
$db['default']['username'] = 'root';
|
||||||
|
$db['default']['password'] = '';
|
||||||
|
$db['default']['database'] = 'barang';
|
||||||
|
$db['default']['dbdriver'] = 'mysql';
|
||||||
|
$db['default']['dbprefix'] = '';
|
||||||
|
$db['default']['pconnect'] = TRUE;
|
||||||
|
$db['default']['db_debug'] = TRUE;
|
||||||
|
$db['default']['cache_on'] = FALSE;
|
||||||
|
$db['default']['cachedir'] = '';
|
||||||
|
$db['default']['char_set'] = 'utf8';
|
||||||
|
$db['default']['dbcollat'] = 'utf8_general_ci';
|
||||||
|
$db['default']['swap_pre'] = '';
|
||||||
|
$db['default']['autoinit'] = TRUE;
|
||||||
|
$db['default']['stricton'] = FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file database.php */
|
||||||
|
/* Location: ./application/config/database.php */
|
15
application/config/doctypes.php
Normal file
15
application/config/doctypes.php
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
$_doctypes = array(
|
||||||
|
'xhtml11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
|
||||||
|
'xhtml1-strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
|
||||||
|
'xhtml1-trans' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
|
||||||
|
'xhtml1-frame' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
|
||||||
|
'html5' => '<!DOCTYPE html>',
|
||||||
|
'html4-strict' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
|
||||||
|
'html4-trans' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
|
||||||
|
'html4-frame' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">'
|
||||||
|
);
|
||||||
|
|
||||||
|
/* End of file doctypes.php */
|
||||||
|
/* Location: ./application/config/doctypes.php */
|
64
application/config/foreign_chars.php
Normal file
64
application/config/foreign_chars.php
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| Foreign Characters
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file contains an array of foreign characters for transliteration
|
||||||
|
| conversion used by the Text helper
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$foreign_characters = array(
|
||||||
|
'/ä|æ|ǽ/' => 'ae',
|
||||||
|
'/ö|œ/' => 'oe',
|
||||||
|
'/ü/' => 'ue',
|
||||||
|
'/Ä/' => 'Ae',
|
||||||
|
'/Ü/' => 'Ue',
|
||||||
|
'/Ö/' => 'Oe',
|
||||||
|
'/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ/' => 'A',
|
||||||
|
'/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª/' => 'a',
|
||||||
|
'/Ç|Ć|Ĉ|Ċ|Č/' => 'C',
|
||||||
|
'/ç|ć|ĉ|ċ|č/' => 'c',
|
||||||
|
'/Ð|Ď|Đ/' => 'D',
|
||||||
|
'/ð|ď|đ/' => 'd',
|
||||||
|
'/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě/' => 'E',
|
||||||
|
'/è|é|ê|ë|ē|ĕ|ė|ę|ě/' => 'e',
|
||||||
|
'/Ĝ|Ğ|Ġ|Ģ/' => 'G',
|
||||||
|
'/ĝ|ğ|ġ|ģ/' => 'g',
|
||||||
|
'/Ĥ|Ħ/' => 'H',
|
||||||
|
'/ĥ|ħ/' => 'h',
|
||||||
|
'/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ/' => 'I',
|
||||||
|
'/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı/' => 'i',
|
||||||
|
'/Ĵ/' => 'J',
|
||||||
|
'/ĵ/' => 'j',
|
||||||
|
'/Ķ/' => 'K',
|
||||||
|
'/ķ/' => 'k',
|
||||||
|
'/Ĺ|Ļ|Ľ|Ŀ|Ł/' => 'L',
|
||||||
|
'/ĺ|ļ|ľ|ŀ|ł/' => 'l',
|
||||||
|
'/Ñ|Ń|Ņ|Ň/' => 'N',
|
||||||
|
'/ñ|ń|ņ|ň|ʼn/' => 'n',
|
||||||
|
'/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ/' => 'O',
|
||||||
|
'/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º/' => 'o',
|
||||||
|
'/Ŕ|Ŗ|Ř/' => 'R',
|
||||||
|
'/ŕ|ŗ|ř/' => 'r',
|
||||||
|
'/Ś|Ŝ|Ş|Š/' => 'S',
|
||||||
|
'/ś|ŝ|ş|š|ſ/' => 's',
|
||||||
|
'/Ţ|Ť|Ŧ/' => 'T',
|
||||||
|
'/ţ|ť|ŧ/' => 't',
|
||||||
|
'/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ/' => 'U',
|
||||||
|
'/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ/' => 'u',
|
||||||
|
'/Ý|Ÿ|Ŷ/' => 'Y',
|
||||||
|
'/ý|ÿ|ŷ/' => 'y',
|
||||||
|
'/Ŵ/' => 'W',
|
||||||
|
'/ŵ/' => 'w',
|
||||||
|
'/Ź|Ż|Ž/' => 'Z',
|
||||||
|
'/ź|ż|ž/' => 'z',
|
||||||
|
'/Æ|Ǽ/' => 'AE',
|
||||||
|
'/ß/'=> 'ss',
|
||||||
|
'/IJ/' => 'IJ',
|
||||||
|
'/ij/' => 'ij',
|
||||||
|
'/Œ/' => 'OE',
|
||||||
|
'/ƒ/' => 'f'
|
||||||
|
);
|
||||||
|
|
||||||
|
/* End of file foreign_chars.php */
|
||||||
|
/* Location: ./application/config/foreign_chars.php */
|
16
application/config/hooks.php
Normal file
16
application/config/hooks.php
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| Hooks
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| This file lets you define "hooks" to extend CI without hacking the core
|
||||||
|
| files. Please see the user guide for info:
|
||||||
|
|
|
||||||
|
| http://codeigniter.com/user_guide/general/hooks.html
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file hooks.php */
|
||||||
|
/* Location: ./application/config/hooks.php */
|
10
application/config/index.html
Normal file
10
application/config/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
21
application/config/ldap.php
Normal file
21
application/config/ldap.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$config['binduser'] = 'cn=Authentication,ou=Services,dc=example,dc=org';
|
||||||
|
$config['basedn'] = 'dc=example,dc=org';
|
||||||
|
$config['bindpw'] = 'E984asdy2';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The host name parameter can be a space separated list of host names.
|
||||||
|
* This means that the LDAP code will talk to a backup server if the main server is not operational.
|
||||||
|
* There will be a delay while the code times out trying to talk to the main server but things will still work.
|
||||||
|
*/
|
||||||
|
|
||||||
|
$config['server'] = 'ldapserver1.example.org ldapserver2.example.org';
|
||||||
|
$config['port'] = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Controls the LDAP_OPT_NETWORK_TIMEOUT option, this is how long the code will attempt to talk to the primary server if it is unreachable.
|
||||||
|
*/
|
||||||
|
|
||||||
|
$config['timeout'] = 5;
|
||||||
|
?>
|
106
application/config/mimes.php
Normal file
106
application/config/mimes.php
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| MIME TYPES
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file contains an array of mime types. It is used by the
|
||||||
|
| Upload class to help identify allowed file types.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
$mimes = array( 'hqx' => 'application/mac-binhex40',
|
||||||
|
'cpt' => 'application/mac-compactpro',
|
||||||
|
'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel'),
|
||||||
|
'bin' => 'application/macbinary',
|
||||||
|
'dms' => 'application/octet-stream',
|
||||||
|
'lha' => 'application/octet-stream',
|
||||||
|
'lzh' => 'application/octet-stream',
|
||||||
|
'exe' => array('application/octet-stream', 'application/x-msdownload'),
|
||||||
|
'class' => 'application/octet-stream',
|
||||||
|
'psd' => 'application/x-photoshop',
|
||||||
|
'so' => 'application/octet-stream',
|
||||||
|
'sea' => 'application/octet-stream',
|
||||||
|
'dll' => 'application/octet-stream',
|
||||||
|
'oda' => 'application/oda',
|
||||||
|
'pdf' => array('application/pdf', 'application/x-download'),
|
||||||
|
'ai' => 'application/postscript',
|
||||||
|
'eps' => 'application/postscript',
|
||||||
|
'ps' => 'application/postscript',
|
||||||
|
'smi' => 'application/smil',
|
||||||
|
'smil' => 'application/smil',
|
||||||
|
'mif' => 'application/vnd.mif',
|
||||||
|
'xls' => array('application/excel', 'application/vnd.ms-excel', 'application/msexcel'),
|
||||||
|
'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint'),
|
||||||
|
'wbxml' => 'application/wbxml',
|
||||||
|
'wmlc' => 'application/wmlc',
|
||||||
|
'dcr' => 'application/x-director',
|
||||||
|
'dir' => 'application/x-director',
|
||||||
|
'dxr' => 'application/x-director',
|
||||||
|
'dvi' => 'application/x-dvi',
|
||||||
|
'gtar' => 'application/x-gtar',
|
||||||
|
'gz' => 'application/x-gzip',
|
||||||
|
'php' => 'application/x-httpd-php',
|
||||||
|
'php4' => 'application/x-httpd-php',
|
||||||
|
'php3' => 'application/x-httpd-php',
|
||||||
|
'phtml' => 'application/x-httpd-php',
|
||||||
|
'phps' => 'application/x-httpd-php-source',
|
||||||
|
'js' => 'application/x-javascript',
|
||||||
|
'swf' => 'application/x-shockwave-flash',
|
||||||
|
'sit' => 'application/x-stuffit',
|
||||||
|
'tar' => 'application/x-tar',
|
||||||
|
'tgz' => array('application/x-tar', 'application/x-gzip-compressed'),
|
||||||
|
'xhtml' => 'application/xhtml+xml',
|
||||||
|
'xht' => 'application/xhtml+xml',
|
||||||
|
'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed'),
|
||||||
|
'mid' => 'audio/midi',
|
||||||
|
'midi' => 'audio/midi',
|
||||||
|
'mpga' => 'audio/mpeg',
|
||||||
|
'mp2' => 'audio/mpeg',
|
||||||
|
'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'),
|
||||||
|
'aif' => 'audio/x-aiff',
|
||||||
|
'aiff' => 'audio/x-aiff',
|
||||||
|
'aifc' => 'audio/x-aiff',
|
||||||
|
'ram' => 'audio/x-pn-realaudio',
|
||||||
|
'rm' => 'audio/x-pn-realaudio',
|
||||||
|
'rpm' => 'audio/x-pn-realaudio-plugin',
|
||||||
|
'ra' => 'audio/x-realaudio',
|
||||||
|
'rv' => 'video/vnd.rn-realvideo',
|
||||||
|
'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'),
|
||||||
|
'bmp' => array('image/bmp', 'image/x-windows-bmp'),
|
||||||
|
'gif' => 'image/gif',
|
||||||
|
'jpeg' => array('image/jpeg', 'image/pjpeg'),
|
||||||
|
'jpg' => array('image/jpeg', 'image/pjpeg'),
|
||||||
|
'jpe' => array('image/jpeg', 'image/pjpeg'),
|
||||||
|
'png' => array('image/png', 'image/x-png'),
|
||||||
|
'tiff' => 'image/tiff',
|
||||||
|
'tif' => 'image/tiff',
|
||||||
|
'css' => 'text/css',
|
||||||
|
'html' => 'text/html',
|
||||||
|
'htm' => 'text/html',
|
||||||
|
'shtml' => 'text/html',
|
||||||
|
'txt' => 'text/plain',
|
||||||
|
'text' => 'text/plain',
|
||||||
|
'log' => array('text/plain', 'text/x-log'),
|
||||||
|
'rtx' => 'text/richtext',
|
||||||
|
'rtf' => 'text/rtf',
|
||||||
|
'xml' => 'text/xml',
|
||||||
|
'xsl' => 'text/xml',
|
||||||
|
'mpeg' => 'video/mpeg',
|
||||||
|
'mpg' => 'video/mpeg',
|
||||||
|
'mpe' => 'video/mpeg',
|
||||||
|
'qt' => 'video/quicktime',
|
||||||
|
'mov' => 'video/quicktime',
|
||||||
|
'avi' => 'video/x-msvideo',
|
||||||
|
'movie' => 'video/x-sgi-movie',
|
||||||
|
'doc' => 'application/msword',
|
||||||
|
'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip'),
|
||||||
|
'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip'),
|
||||||
|
'word' => array('application/msword', 'application/octet-stream'),
|
||||||
|
'xl' => 'application/excel',
|
||||||
|
'eml' => 'message/rfc822',
|
||||||
|
'json' => array('application/json', 'text/json')
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file mimes.php */
|
||||||
|
/* Location: ./application/config/mimes.php */
|
17
application/config/profiler.php
Normal file
17
application/config/profiler.php
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| Profiler Sections
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| This file lets you determine whether or not various sections of Profiler
|
||||||
|
| data are displayed when the Profiler is enabled.
|
||||||
|
| Please see the user guide for info:
|
||||||
|
|
|
||||||
|
| http://codeigniter.com/user_guide/general/profiling.html
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file profiler.php */
|
||||||
|
/* Location: ./application/config/profiler.php */
|
341
application/config/rest.php
Normal file
341
application/config/rest.php
Normal file
@ -0,0 +1,341 @@
|
|||||||
|
<?php defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| HTTP protocol
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Should the service accept only HTTPS requests or not?
|
||||||
|
|
|
||||||
|
| Default: FALSE
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['force_https'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Format
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| What format should the data be returned in by default?
|
||||||
|
|
|
||||||
|
| Default: xml
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_default_format'] = 'xml';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Enable emulate request
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Should we enable emulation of the request (e.g. used in Mootools request)?
|
||||||
|
|
|
||||||
|
| Default: false
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['enable_emulate_request'] = TRUE;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Realm
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Name for the password protected REST API displayed on login dialogs
|
||||||
|
|
|
||||||
|
| E.g: My Secret REST API
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_realm'] = 'REST API';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Login
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Is login required and if so, which type of login?
|
||||||
|
|
|
||||||
|
| '' = no login required, 'basic' = unsecure login, 'digest' = more secure login
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_auth'] = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Login
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Is login required and if so, which user store do we use?
|
||||||
|
|
|
||||||
|
| '' = use config based users, 'ldap' = use LDAP authencation
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['auth_source'] = 'ldap';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Override auth types for specific class/method
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Set specific authentication types for methods within a class (controller)
|
||||||
|
|
|
||||||
|
| Set as many config entries as needed. Any methods not set will use the default 'rest_auth' config value.
|
||||||
|
|
|
||||||
|
| example:
|
||||||
|
|
|
||||||
|
| $config['auth_override_class_method']['deals']['view'] = 'none';
|
||||||
|
| $config['auth_override_class_method']['deals']['insert'] = 'digest';
|
||||||
|
| $config['auth_override_class_method']['accounts']['user'] = 'basic';
|
||||||
|
|
|
||||||
|
| Here 'deals' and 'accounts' are controller names, 'view', 'insert' and 'user' are methods within. (NOTE: leave off the '_get' or '_post' from the end of the method name)
|
||||||
|
| Acceptable values are; 'none', 'digest' and 'basic'.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
// $config['auth_override_class_method']['deals']['view'] = 'none';
|
||||||
|
// $config['auth_override_class_method']['deals']['insert'] = 'digest';
|
||||||
|
// $config['auth_override_class_method']['accounts']['user'] = 'basic';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Login usernames
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Array of usernames and passwords for login, if ldap is configured this is ignored
|
||||||
|
|
|
||||||
|
| array('admin' => '1234')
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_valid_logins'] = array('admin' => '1234');
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Global IP Whitelisting
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Limit connections to your REST server to whitelisted IP addresses.
|
||||||
|
|
|
||||||
|
| Usage:
|
||||||
|
| 1. Set to true *and* select an auth option for extreme security (client's IP
|
||||||
|
| address must be in whitelist and they must also log in)
|
||||||
|
| 2. Set to true with auth set to false to allow whitelisted IPs access with no login.
|
||||||
|
| 3. Set to false here but set 'auth_override_class_method' to 'whitelist' to
|
||||||
|
| restrict certain methods to IPs in your whitelist
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_ip_whitelist_enabled'] = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST IP Whitelist
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Limit connections to your REST server to a comma separated
|
||||||
|
| list of IP addresses
|
||||||
|
|
|
||||||
|
| Example: $config['rest_ip_whitelist'] = '123.456.789.0, 987.654.32.1';
|
||||||
|
|
|
||||||
|
| 127.0.0.1 and 0.0.0.0 are allowed by default.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_ip_whitelist'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Database Group
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Connect to a database group for keys, logging, etc. It will only connect
|
||||||
|
| if you have any of these features enabled.
|
||||||
|
|
|
||||||
|
| 'default'
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_database_group'] = 'default';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST API Keys Table Name
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| The table name in your database that stores API Keys.
|
||||||
|
|
|
||||||
|
| 'keys'
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_keys_table'] = 'keys';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Enable Keys
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| When set to true REST_Controller will look for a key and match it to the DB.
|
||||||
|
| If no key is provided, the request will return an error.
|
||||||
|
|
|
||||||
|
| FALSE
|
||||||
|
|
||||||
|
CREATE TABLE `keys` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`key` varchar(40) NOT NULL,
|
||||||
|
`level` int(2) NOT NULL,
|
||||||
|
`ignore_limits` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
|
`is_private_key` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
|
`ip_addresses` TEXT NULL DEFAULT NULL,
|
||||||
|
`date_created` int(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_enable_keys'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Table Key Column Name
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If you are not using the default table schema as shown above, what is the
|
||||||
|
| name of the db column that holds the api key value?
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_key_column'] = 'key';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Key Length
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| How long should created keys be? Double check this in your db schema.
|
||||||
|
|
|
||||||
|
| Default: 32
|
||||||
|
| Max: 40
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_key_length'] = 40;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST API Key Variable
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Which variable will provide us the API Key
|
||||||
|
|
|
||||||
|
| Default: X-API-KEY
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_key_name'] = 'X-API-KEY';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST API Logs Table Name
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| The table name in your database that stores logs.
|
||||||
|
|
|
||||||
|
| 'logs'
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_logs_table'] = 'logs';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Enable Logging
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| When set to true REST_Controller will log actions based on key, date,
|
||||||
|
| time and IP address. This is a general rule that can be overridden in the
|
||||||
|
| $this->method array in each controller.
|
||||||
|
|
|
||||||
|
| FALSE
|
||||||
|
|
|
||||||
|
CREATE TABLE `logs` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`uri` varchar(255) NOT NULL,
|
||||||
|
`method` varchar(6) NOT NULL,
|
||||||
|
`params` text DEFAULT NULL,
|
||||||
|
`api_key` varchar(40) NOT NULL,
|
||||||
|
`ip_address` varchar(45) NOT NULL,
|
||||||
|
`time` int(11) NOT NULL,
|
||||||
|
`authorized` tinyint(1) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_enable_logging'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST API Param Log Format
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| When set to true API log params will be stored in the database as JSON,
|
||||||
|
| when false they will be php serialized.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_logs_json_params'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST API Limits Table Name
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| The table name in your database that stores limits.
|
||||||
|
|
|
||||||
|
| 'logs'
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_limits_table'] = 'limits';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Enable Limits
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| When set to true REST_Controller will count the number of uses of each method
|
||||||
|
| by an API key each hour. This is a general rule that can be overridden in the
|
||||||
|
| $this->method array in each controller.
|
||||||
|
|
|
||||||
|
| FALSE
|
||||||
|
|
|
||||||
|
CREATE TABLE `limits` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`uri` varchar(255) NOT NULL,
|
||||||
|
`count` int(10) NOT NULL,
|
||||||
|
`hour_started` int(11) NOT NULL,
|
||||||
|
`api_key` varchar(40) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_enable_limits'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST Ignore HTTP Accept
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Set to TRUE to ignore the HTTP Accept and speed up each request a little.
|
||||||
|
| Only do this if you are using the $this->rest_format or /format/xml in URLs
|
||||||
|
|
|
||||||
|
| FALSE
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_ignore_http_accept'] = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| REST AJAX Only
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Set to TRUE to only allow AJAX requests. If TRUE and the request is not
|
||||||
|
| coming from AJAX, a 505 response with the error message "Only AJAX
|
||||||
|
| requests are accepted." will be returned. This is good for production
|
||||||
|
| environments. Set to FALSE to also accept HTTP requests.
|
||||||
|
|
|
||||||
|
| FALSE
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['rest_ajax_only'] = FALSE;
|
||||||
|
|
||||||
|
/* End of file config.php */
|
||||||
|
/* Location: ./system/application/config/rest.php */
|
46
application/config/routes.php
Normal file
46
application/config/routes.php
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| URI ROUTING
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| This file lets you re-map URI requests to specific controller functions.
|
||||||
|
|
|
||||||
|
| Typically there is a one-to-one relationship between a URL string
|
||||||
|
| and its corresponding controller class/method. The segments in a
|
||||||
|
| URL normally follow this pattern:
|
||||||
|
|
|
||||||
|
| example.com/class/method/id/
|
||||||
|
|
|
||||||
|
| In some instances, however, you may want to remap this relationship
|
||||||
|
| so that a different class/function is called than the one
|
||||||
|
| corresponding to the URL.
|
||||||
|
|
|
||||||
|
| Please see the user guide for complete details:
|
||||||
|
|
|
||||||
|
| http://codeigniter.com/user_guide/general/routing.html
|
||||||
|
|
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
| RESERVED ROUTES
|
||||||
|
| -------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| There area two reserved routes:
|
||||||
|
|
|
||||||
|
| $route['default_controller'] = 'welcome';
|
||||||
|
|
|
||||||
|
| This route indicates which controller class should be loaded if the
|
||||||
|
| URI contains no data. In the above example, the "welcome" class
|
||||||
|
| would be loaded.
|
||||||
|
|
|
||||||
|
| $route['404_override'] = 'errors/page_missing';
|
||||||
|
|
|
||||||
|
| This route will tell the Router what URI segments to use if those provided
|
||||||
|
| in the URL cannot be matched to a valid route.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
$route['default_controller'] = "welcome";
|
||||||
|
$route['404_override'] = '';
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file routes.php */
|
||||||
|
/* Location: ./application/config/routes.php */
|
66
application/config/smileys.php
Normal file
66
application/config/smileys.php
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| SMILEYS
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file contains an array of smileys for use with the emoticon helper.
|
||||||
|
| Individual images can be used to replace multiple simileys. For example:
|
||||||
|
| :-) and :) use the same image replacement.
|
||||||
|
|
|
||||||
|
| Please see user guide for more info:
|
||||||
|
| http://codeigniter.com/user_guide/helpers/smiley_helper.html
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
$smileys = array(
|
||||||
|
|
||||||
|
// smiley image name width height alt
|
||||||
|
|
||||||
|
':-)' => array('grin.gif', '19', '19', 'grin'),
|
||||||
|
':lol:' => array('lol.gif', '19', '19', 'LOL'),
|
||||||
|
':cheese:' => array('cheese.gif', '19', '19', 'cheese'),
|
||||||
|
':)' => array('smile.gif', '19', '19', 'smile'),
|
||||||
|
';-)' => array('wink.gif', '19', '19', 'wink'),
|
||||||
|
';)' => array('wink.gif', '19', '19', 'wink'),
|
||||||
|
':smirk:' => array('smirk.gif', '19', '19', 'smirk'),
|
||||||
|
':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'),
|
||||||
|
':-S' => array('confused.gif', '19', '19', 'confused'),
|
||||||
|
':wow:' => array('surprise.gif', '19', '19', 'surprised'),
|
||||||
|
':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'),
|
||||||
|
':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'),
|
||||||
|
'%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'),
|
||||||
|
';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'),
|
||||||
|
':P' => array('raspberry.gif', '19', '19', 'raspberry'),
|
||||||
|
':blank:' => array('blank.gif', '19', '19', 'blank stare'),
|
||||||
|
':long:' => array('longface.gif', '19', '19', 'long face'),
|
||||||
|
':ohh:' => array('ohh.gif', '19', '19', 'ohh'),
|
||||||
|
':grrr:' => array('grrr.gif', '19', '19', 'grrr'),
|
||||||
|
':gulp:' => array('gulp.gif', '19', '19', 'gulp'),
|
||||||
|
'8-/' => array('ohoh.gif', '19', '19', 'oh oh'),
|
||||||
|
':down:' => array('downer.gif', '19', '19', 'downer'),
|
||||||
|
':red:' => array('embarrassed.gif', '19', '19', 'red face'),
|
||||||
|
':sick:' => array('sick.gif', '19', '19', 'sick'),
|
||||||
|
':shut:' => array('shuteye.gif', '19', '19', 'shut eye'),
|
||||||
|
':-/' => array('hmm.gif', '19', '19', 'hmmm'),
|
||||||
|
'>:(' => array('mad.gif', '19', '19', 'mad'),
|
||||||
|
':mad:' => array('mad.gif', '19', '19', 'mad'),
|
||||||
|
'>:-(' => array('angry.gif', '19', '19', 'angry'),
|
||||||
|
':angry:' => array('angry.gif', '19', '19', 'angry'),
|
||||||
|
':zip:' => array('zip.gif', '19', '19', 'zipper'),
|
||||||
|
':kiss:' => array('kiss.gif', '19', '19', 'kiss'),
|
||||||
|
':ahhh:' => array('shock.gif', '19', '19', 'shock'),
|
||||||
|
':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'),
|
||||||
|
':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'),
|
||||||
|
':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'),
|
||||||
|
':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'),
|
||||||
|
':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'),
|
||||||
|
':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'),
|
||||||
|
':vampire:' => array('vampire.gif', '19', '19', 'vampire'),
|
||||||
|
':snake:' => array('snake.gif', '19', '19', 'snake'),
|
||||||
|
':exclaim:' => array('exclaim.gif', '19', '19', 'excaim'),
|
||||||
|
':question:' => array('question.gif', '19', '19', 'question') // no comma after last item
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
/* End of file smileys.php */
|
||||||
|
/* Location: ./application/config/smileys.php */
|
178
application/config/user_agents.php
Normal file
178
application/config/user_agents.php
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/*
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| USER AGENT TYPES
|
||||||
|
| -------------------------------------------------------------------
|
||||||
|
| This file contains four arrays of user agent data. It is used by the
|
||||||
|
| User Agent Class to help identify browser, platform, robot, and
|
||||||
|
| mobile device data. The array keys are used to identify the device
|
||||||
|
| and the array values are used to set the actual name of the item.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
$platforms = array (
|
||||||
|
'windows nt 6.0' => 'Windows Longhorn',
|
||||||
|
'windows nt 5.2' => 'Windows 2003',
|
||||||
|
'windows nt 5.0' => 'Windows 2000',
|
||||||
|
'windows nt 5.1' => 'Windows XP',
|
||||||
|
'windows nt 4.0' => 'Windows NT 4.0',
|
||||||
|
'winnt4.0' => 'Windows NT 4.0',
|
||||||
|
'winnt 4.0' => 'Windows NT',
|
||||||
|
'winnt' => 'Windows NT',
|
||||||
|
'windows 98' => 'Windows 98',
|
||||||
|
'win98' => 'Windows 98',
|
||||||
|
'windows 95' => 'Windows 95',
|
||||||
|
'win95' => 'Windows 95',
|
||||||
|
'windows' => 'Unknown Windows OS',
|
||||||
|
'os x' => 'Mac OS X',
|
||||||
|
'ppc mac' => 'Power PC Mac',
|
||||||
|
'freebsd' => 'FreeBSD',
|
||||||
|
'ppc' => 'Macintosh',
|
||||||
|
'linux' => 'Linux',
|
||||||
|
'debian' => 'Debian',
|
||||||
|
'sunos' => 'Sun Solaris',
|
||||||
|
'beos' => 'BeOS',
|
||||||
|
'apachebench' => 'ApacheBench',
|
||||||
|
'aix' => 'AIX',
|
||||||
|
'irix' => 'Irix',
|
||||||
|
'osf' => 'DEC OSF',
|
||||||
|
'hp-ux' => 'HP-UX',
|
||||||
|
'netbsd' => 'NetBSD',
|
||||||
|
'bsdi' => 'BSDi',
|
||||||
|
'openbsd' => 'OpenBSD',
|
||||||
|
'gnu' => 'GNU/Linux',
|
||||||
|
'unix' => 'Unknown Unix OS'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// The order of this array should NOT be changed. Many browsers return
|
||||||
|
// multiple browser types so we want to identify the sub-type first.
|
||||||
|
$browsers = array(
|
||||||
|
'Flock' => 'Flock',
|
||||||
|
'Chrome' => 'Chrome',
|
||||||
|
'Opera' => 'Opera',
|
||||||
|
'MSIE' => 'Internet Explorer',
|
||||||
|
'Internet Explorer' => 'Internet Explorer',
|
||||||
|
'Shiira' => 'Shiira',
|
||||||
|
'Firefox' => 'Firefox',
|
||||||
|
'Chimera' => 'Chimera',
|
||||||
|
'Phoenix' => 'Phoenix',
|
||||||
|
'Firebird' => 'Firebird',
|
||||||
|
'Camino' => 'Camino',
|
||||||
|
'Netscape' => 'Netscape',
|
||||||
|
'OmniWeb' => 'OmniWeb',
|
||||||
|
'Safari' => 'Safari',
|
||||||
|
'Mozilla' => 'Mozilla',
|
||||||
|
'Konqueror' => 'Konqueror',
|
||||||
|
'icab' => 'iCab',
|
||||||
|
'Lynx' => 'Lynx',
|
||||||
|
'Links' => 'Links',
|
||||||
|
'hotjava' => 'HotJava',
|
||||||
|
'amaya' => 'Amaya',
|
||||||
|
'IBrowse' => 'IBrowse'
|
||||||
|
);
|
||||||
|
|
||||||
|
$mobiles = array(
|
||||||
|
// legacy array, old values commented out
|
||||||
|
'mobileexplorer' => 'Mobile Explorer',
|
||||||
|
// 'openwave' => 'Open Wave',
|
||||||
|
// 'opera mini' => 'Opera Mini',
|
||||||
|
// 'operamini' => 'Opera Mini',
|
||||||
|
// 'elaine' => 'Palm',
|
||||||
|
'palmsource' => 'Palm',
|
||||||
|
// 'digital paths' => 'Palm',
|
||||||
|
// 'avantgo' => 'Avantgo',
|
||||||
|
// 'xiino' => 'Xiino',
|
||||||
|
'palmscape' => 'Palmscape',
|
||||||
|
// 'nokia' => 'Nokia',
|
||||||
|
// 'ericsson' => 'Ericsson',
|
||||||
|
// 'blackberry' => 'BlackBerry',
|
||||||
|
// 'motorola' => 'Motorola'
|
||||||
|
|
||||||
|
// Phones and Manufacturers
|
||||||
|
'motorola' => "Motorola",
|
||||||
|
'nokia' => "Nokia",
|
||||||
|
'palm' => "Palm",
|
||||||
|
'iphone' => "Apple iPhone",
|
||||||
|
'ipad' => "iPad",
|
||||||
|
'ipod' => "Apple iPod Touch",
|
||||||
|
'sony' => "Sony Ericsson",
|
||||||
|
'ericsson' => "Sony Ericsson",
|
||||||
|
'blackberry' => "BlackBerry",
|
||||||
|
'cocoon' => "O2 Cocoon",
|
||||||
|
'blazer' => "Treo",
|
||||||
|
'lg' => "LG",
|
||||||
|
'amoi' => "Amoi",
|
||||||
|
'xda' => "XDA",
|
||||||
|
'mda' => "MDA",
|
||||||
|
'vario' => "Vario",
|
||||||
|
'htc' => "HTC",
|
||||||
|
'samsung' => "Samsung",
|
||||||
|
'sharp' => "Sharp",
|
||||||
|
'sie-' => "Siemens",
|
||||||
|
'alcatel' => "Alcatel",
|
||||||
|
'benq' => "BenQ",
|
||||||
|
'ipaq' => "HP iPaq",
|
||||||
|
'mot-' => "Motorola",
|
||||||
|
'playstation portable' => "PlayStation Portable",
|
||||||
|
'hiptop' => "Danger Hiptop",
|
||||||
|
'nec-' => "NEC",
|
||||||
|
'panasonic' => "Panasonic",
|
||||||
|
'philips' => "Philips",
|
||||||
|
'sagem' => "Sagem",
|
||||||
|
'sanyo' => "Sanyo",
|
||||||
|
'spv' => "SPV",
|
||||||
|
'zte' => "ZTE",
|
||||||
|
'sendo' => "Sendo",
|
||||||
|
|
||||||
|
// Operating Systems
|
||||||
|
'symbian' => "Symbian",
|
||||||
|
'SymbianOS' => "SymbianOS",
|
||||||
|
'elaine' => "Palm",
|
||||||
|
'palm' => "Palm",
|
||||||
|
'series60' => "Symbian S60",
|
||||||
|
'windows ce' => "Windows CE",
|
||||||
|
|
||||||
|
// Browsers
|
||||||
|
'obigo' => "Obigo",
|
||||||
|
'netfront' => "Netfront Browser",
|
||||||
|
'openwave' => "Openwave Browser",
|
||||||
|
'mobilexplorer' => "Mobile Explorer",
|
||||||
|
'operamini' => "Opera Mini",
|
||||||
|
'opera mini' => "Opera Mini",
|
||||||
|
|
||||||
|
// Other
|
||||||
|
'digital paths' => "Digital Paths",
|
||||||
|
'avantgo' => "AvantGo",
|
||||||
|
'xiino' => "Xiino",
|
||||||
|
'novarra' => "Novarra Transcoder",
|
||||||
|
'vodafone' => "Vodafone",
|
||||||
|
'docomo' => "NTT DoCoMo",
|
||||||
|
'o2' => "O2",
|
||||||
|
|
||||||
|
// Fallback
|
||||||
|
'mobile' => "Generic Mobile",
|
||||||
|
'wireless' => "Generic Mobile",
|
||||||
|
'j2me' => "Generic Mobile",
|
||||||
|
'midp' => "Generic Mobile",
|
||||||
|
'cldc' => "Generic Mobile",
|
||||||
|
'up.link' => "Generic Mobile",
|
||||||
|
'up.browser' => "Generic Mobile",
|
||||||
|
'smartphone' => "Generic Mobile",
|
||||||
|
'cellphone' => "Generic Mobile"
|
||||||
|
);
|
||||||
|
|
||||||
|
// There are hundreds of bots but these are the most common.
|
||||||
|
$robots = array(
|
||||||
|
'googlebot' => 'Googlebot',
|
||||||
|
'msnbot' => 'MSNBot',
|
||||||
|
'slurp' => 'Inktomi Slurp',
|
||||||
|
'yahoo' => 'Yahoo',
|
||||||
|
'askjeeves' => 'AskJeeves',
|
||||||
|
'fastcrawler' => 'FastCrawler',
|
||||||
|
'infoseek' => 'InfoSeek Robot 1.0',
|
||||||
|
'lycos' => 'Lycos'
|
||||||
|
);
|
||||||
|
|
||||||
|
/* End of file user_agents.php */
|
||||||
|
/* Location: ./application/config/user_agents.php */
|
74
application/controllers/api/barang.php
Normal file
74
application/controllers/api/barang.php
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
<?php defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example
|
||||||
|
*
|
||||||
|
* This is an example of a few basic user interaction methods you could use
|
||||||
|
* all done with a hardcoded array.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Rest Server
|
||||||
|
* @category Controller
|
||||||
|
* @author Phil Sturgeon
|
||||||
|
* @link http://philsturgeon.co.uk/code/
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This can be removed if you use __autoload() in config.php OR use Modular Extensions
|
||||||
|
require APPPATH.'/libraries/REST_Controller.php';
|
||||||
|
class Barang extends REST_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->load->model(array('barang_model'));
|
||||||
|
}
|
||||||
|
function a_barang_get() {
|
||||||
|
if(!$this->get('id')) { $this->response(NULL, 400);}
|
||||||
|
else {
|
||||||
|
$query = $this->barang_model->get_barang_by($this->get('id'));
|
||||||
|
if($query) { $this->response($query, 200);}
|
||||||
|
else { $this->response(array('error' => 'User could not be found'), 404); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function all_barang_get() {
|
||||||
|
$query = $this->barang_model->get_barang_all();
|
||||||
|
if($query) { $this->response($query, 200);}
|
||||||
|
else { $this->response(array('error' => 'User could not be found'), 404); }
|
||||||
|
}
|
||||||
|
function add_barang_post() {
|
||||||
|
$data = array( 'id' => '',
|
||||||
|
'nama' => $this->post('nama_barang'),
|
||||||
|
'harga' => $this->post('harga'));
|
||||||
|
|
||||||
|
$quer = $this->barang_model->simpan_barang($data);
|
||||||
|
|
||||||
|
if($quer) {
|
||||||
|
$this->response(array( 'succes' => 'yes'), 200);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$this->response($quer, 404);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function update_barang_post(){
|
||||||
|
$data = array( 'id' => '',
|
||||||
|
'nama'=> $this->post->('nama_barang'),
|
||||||
|
'harga'=> $this->post('harga'));
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
function update_barang_post() {
|
||||||
|
$data = array( 'nama' => $this->post('nama'),
|
||||||
|
'harga' => $this->post('harga'))
|
||||||
|
$id = $this->get('id');
|
||||||
|
$query = $this->barang_model->update_barang($data, $id);
|
||||||
|
$this->response($query, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
function del_barang_delete(){
|
||||||
|
$id = $this->get('id');
|
||||||
|
$query = $this->mbarang->del_barang($id); echo "";
|
||||||
|
$this->response($query, 200);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
95
application/controllers/api/example.php
Normal file
95
application/controllers/api/example.php
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<?php defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example
|
||||||
|
*
|
||||||
|
* This is an example of a few basic user interaction methods you could use
|
||||||
|
* all done with a hardcoded array.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Rest Server
|
||||||
|
* @category Controller
|
||||||
|
* @author Phil Sturgeon
|
||||||
|
* @link http://philsturgeon.co.uk/code/
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This can be removed if you use __autoload() in config.php OR use Modular Extensions
|
||||||
|
require APPPATH.'/libraries/REST_Controller.php';
|
||||||
|
|
||||||
|
class Example extends REST_Controller
|
||||||
|
{
|
||||||
|
function user_get()
|
||||||
|
{
|
||||||
|
if(!$this->get('id'))
|
||||||
|
{
|
||||||
|
$this->response(NULL, 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// $user = $this->some_model->getSomething( $this->get('id') );
|
||||||
|
$users = array(
|
||||||
|
1 => array('id' => 1, 'name' => 'Some Guy', 'email' => 'example1@example.com', 'fact' => 'Loves swimming'),
|
||||||
|
2 => array('id' => 2, 'name' => 'Person Face', 'email' => 'example2@example.com', 'fact' => 'Has a huge face'),
|
||||||
|
3 => array('id' => 3, 'name' => 'Scotty', 'email' => 'example3@example.com', 'fact' => 'Is a Scott!', array('hobbies' => array('fartings', 'bikes'))),
|
||||||
|
);
|
||||||
|
|
||||||
|
$user = @$users[$this->get('id')];
|
||||||
|
|
||||||
|
if($user)
|
||||||
|
{
|
||||||
|
$this->response($user, 200); // 200 being the HTTP response code
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->response(array('error' => 'User could not be found'), 404);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function user_post()
|
||||||
|
{
|
||||||
|
//$this->some_model->updateUser( $this->get('id') );
|
||||||
|
$message = array('id' => $this->get('id'), 'name' => $this->post('name'), 'email' => $this->post('email'), 'message' => 'ADDED!');
|
||||||
|
|
||||||
|
$this->response($message, 200); // 200 being the HTTP response code
|
||||||
|
}
|
||||||
|
|
||||||
|
function user_delete()
|
||||||
|
{
|
||||||
|
//$this->some_model->deletesomething( $this->get('id') );
|
||||||
|
$message = array('id' => $this->get('id'), 'message' => 'DELETED!');
|
||||||
|
|
||||||
|
$this->response($message, 200); // 200 being the HTTP response code
|
||||||
|
}
|
||||||
|
|
||||||
|
function users_get()
|
||||||
|
{
|
||||||
|
//$users = $this->some_model->getSomething( $this->get('limit') );
|
||||||
|
$users = array(
|
||||||
|
array('id' => 1, 'name' => 'Some Guy', 'email' => 'example1@example.com'),
|
||||||
|
array('id' => 2, 'name' => 'Person Face', 'email' => 'example2@example.com'),
|
||||||
|
3 => array('id' => 3, 'name' => 'Scotty', 'email' => 'example3@example.com', 'fact' => array('hobbies' => array('fartings', 'bikes'))),
|
||||||
|
);
|
||||||
|
|
||||||
|
if($users)
|
||||||
|
{
|
||||||
|
$this->response($users, 200); // 200 being the HTTP response code
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->response(array('error' => 'Couldn\'t find any users!'), 404);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function send_post()
|
||||||
|
{
|
||||||
|
var_dump($this->request->body);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function send_put()
|
||||||
|
{
|
||||||
|
var_dump($this->put('foo'));
|
||||||
|
}
|
||||||
|
}
|
251
application/controllers/api/key.php
Normal file
251
application/controllers/api/key.php
Normal file
@ -0,0 +1,251 @@
|
|||||||
|
<?php defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keys Controller
|
||||||
|
*
|
||||||
|
* This is a basic Key Management REST controller to make and delete keys.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Rest Server
|
||||||
|
* @category Controller
|
||||||
|
* @author Phil Sturgeon
|
||||||
|
* @link http://philsturgeon.co.uk/code/
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This can be removed if you use __autoload() in config.php
|
||||||
|
require(APPPATH.'/libraries/REST_Controller.php');
|
||||||
|
|
||||||
|
class Key extends REST_Controller
|
||||||
|
{
|
||||||
|
protected $methods = array(
|
||||||
|
'index_put' => array('level' => 10, 'limit' => 10),
|
||||||
|
'index_delete' => array('level' => 10),
|
||||||
|
'level_post' => array('level' => 10),
|
||||||
|
'regenerate_post' => array('level' => 10),
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Key Create
|
||||||
|
*
|
||||||
|
* Insert a key into the database.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function index_put()
|
||||||
|
{
|
||||||
|
// Build a new key
|
||||||
|
$key = self::_generate_key();
|
||||||
|
|
||||||
|
// If no key level provided, give them a rubbish one
|
||||||
|
$level = $this->put('level') ? $this->put('level') : 1;
|
||||||
|
$ignore_limits = $this->put('ignore_limits') ? $this->put('ignore_limits') : 1;
|
||||||
|
|
||||||
|
// Insert the new key
|
||||||
|
if (self::_insert_key($key, array('level' => $level, 'ignore_limits' => $ignore_limits)))
|
||||||
|
{
|
||||||
|
$this->response(array('status' => 1, 'key' => $key), 201); // 201 = Created
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->response(array('status' => 0, 'error' => 'Could not save the key.'), 500); // 500 = Internal Server Error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Key Delete
|
||||||
|
*
|
||||||
|
* Remove a key from the database to stop it working.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function index_delete()
|
||||||
|
{
|
||||||
|
$key = $this->delete('key');
|
||||||
|
|
||||||
|
// Does this key even exist?
|
||||||
|
if ( ! self::_key_exists($key))
|
||||||
|
{
|
||||||
|
// NOOOOOOOOO!
|
||||||
|
$this->response(array('status' => 0, 'error' => 'Invalid API Key.'), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kill it
|
||||||
|
self::_delete_key($key);
|
||||||
|
|
||||||
|
// Tell em we killed it
|
||||||
|
$this->response(array('status' => 1, 'success' => 'API Key was deleted.'), 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update Key
|
||||||
|
*
|
||||||
|
* Change the level
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function level_post()
|
||||||
|
{
|
||||||
|
$key = $this->post('key');
|
||||||
|
$new_level = $this->post('level');
|
||||||
|
|
||||||
|
// Does this key even exist?
|
||||||
|
if ( ! self::_key_exists($key))
|
||||||
|
{
|
||||||
|
// NOOOOOOOOO!
|
||||||
|
$this->response(array('error' => 'Invalid API Key.'), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the key level
|
||||||
|
if (self::_update_key($key, array('level' => $new_level)))
|
||||||
|
{
|
||||||
|
$this->response(array('status' => 1, 'success' => 'API Key was updated.'), 200); // 200 = OK
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->response(array('status' => 0, 'error' => 'Could not update the key level.'), 500); // 500 = Internal Server Error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update Key
|
||||||
|
*
|
||||||
|
* Change the level
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function suspend_post()
|
||||||
|
{
|
||||||
|
$key = $this->post('key');
|
||||||
|
|
||||||
|
// Does this key even exist?
|
||||||
|
if ( ! self::_key_exists($key))
|
||||||
|
{
|
||||||
|
// NOOOOOOOOO!
|
||||||
|
$this->response(array('error' => 'Invalid API Key.'), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the key level
|
||||||
|
if (self::_update_key($key, array('level' => 0)))
|
||||||
|
{
|
||||||
|
$this->response(array('status' => 1, 'success' => 'Key was suspended.'), 200); // 200 = OK
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->response(array('status' => 0, 'error' => 'Could not suspend the user.'), 500); // 500 = Internal Server Error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regenerate Key
|
||||||
|
*
|
||||||
|
* Remove a key from the database to stop it working.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function regenerate_post()
|
||||||
|
{
|
||||||
|
$old_key = $this->post('key');
|
||||||
|
$key_details = self::_get_key($old_key);
|
||||||
|
|
||||||
|
// The key wasnt found
|
||||||
|
if ( ! $key_details)
|
||||||
|
{
|
||||||
|
// NOOOOOOOOO!
|
||||||
|
$this->response(array('status' => 0, 'error' => 'Invalid API Key.'), 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build a new key
|
||||||
|
$new_key = self::_generate_key();
|
||||||
|
|
||||||
|
// Insert the new key
|
||||||
|
if (self::_insert_key($new_key, array('level' => $key_details->level, 'ignore_limits' => $key_details->ignore_limits)))
|
||||||
|
{
|
||||||
|
// Suspend old key
|
||||||
|
self::_update_key($old_key, array('level' => 0));
|
||||||
|
|
||||||
|
$this->response(array('status' => 1, 'key' => $new_key), 201); // 201 = Created
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->response(array('status' => 0, 'error' => 'Could not save the key.'), 500); // 500 = Internal Server Error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/* Helper Methods */
|
||||||
|
|
||||||
|
private function _generate_key()
|
||||||
|
{
|
||||||
|
//$this->load->helper('security');
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
$salt = do_hash(time().mt_rand());
|
||||||
|
$new_key = substr($salt, 0, config_item('rest_key_length'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Already in the DB? Fail. Try again
|
||||||
|
while (self::_key_exists($new_key));
|
||||||
|
|
||||||
|
return $new_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/* Private Data Methods */
|
||||||
|
|
||||||
|
private function _get_key($key)
|
||||||
|
{
|
||||||
|
return $this->db->where('key', $key)->get(config_item('rest_keys_table'))->row();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
private function _key_exists($key)
|
||||||
|
{
|
||||||
|
return $this->db->where('key', $key)->count_all_results(config_item('rest_keys_table')) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
private function _insert_key($key, $data)
|
||||||
|
{
|
||||||
|
|
||||||
|
$data['key'] = $key;
|
||||||
|
$data['date_created'] = function_exists('now') ? now() : time();
|
||||||
|
|
||||||
|
return $this->db->set($data)->insert(config_item('rest_keys_table'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
private function _update_key($key, $data)
|
||||||
|
{
|
||||||
|
return $this->db->where('key', $key)->update(config_item('rest_keys_table'), $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
private function _delete_key($key)
|
||||||
|
{
|
||||||
|
return $this->db->where('key', $key)->delete(config_item('rest_keys_table'));
|
||||||
|
}
|
||||||
|
}
|
14
application/controllers/barangaja.php
Normal file
14
application/controllers/barangaja.php
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class Barangaja extends CI_Controller{
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
}
|
||||||
|
function index(){
|
||||||
|
$this->load->view('add');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
10
application/controllers/index.html
Normal file
10
application/controllers/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
18
application/controllers/welcome.php
Normal file
18
application/controllers/welcome.php
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
class Welcome extends CI_Controller {
|
||||||
|
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
function index()
|
||||||
|
{
|
||||||
|
$this->load->helper('url');
|
||||||
|
$this->load->view('welcome_message');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file welcome.php */
|
||||||
|
/* Location: ./system/application/controllers/welcome.php */
|
10
application/core/index.html
Normal file
10
application/core/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
34
application/errors/error_404.php
Normal file
34
application/errors/error_404.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>404 Page Not Found</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: #fff;
|
||||||
|
margin: 40px;
|
||||||
|
font-family: Lucida Grande, Verdana, Sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content {
|
||||||
|
border: #999 1px solid;
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 20px 20px 12px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #990000;
|
||||||
|
margin: 0 0 4px 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="content">
|
||||||
|
<h1><?php echo $heading; ?></h1>
|
||||||
|
<?php echo $message; ?>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
34
application/errors/error_db.php
Normal file
34
application/errors/error_db.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Database Error</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: #fff;
|
||||||
|
margin: 40px;
|
||||||
|
font-family: Lucida Grande, Verdana, Sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content {
|
||||||
|
border: #999 1px solid;
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 20px 20px 12px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #990000;
|
||||||
|
margin: 0 0 4px 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="content">
|
||||||
|
<h1><?php echo $heading; ?></h1>
|
||||||
|
<?php echo $message; ?>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
34
application/errors/error_general.php
Normal file
34
application/errors/error_general.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Error</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: #fff;
|
||||||
|
margin: 40px;
|
||||||
|
font-family: Lucida Grande, Verdana, Sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content {
|
||||||
|
border: #999 1px solid;
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 20px 20px 12px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #990000;
|
||||||
|
margin: 0 0 4px 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="content">
|
||||||
|
<h1><?php echo $heading; ?></h1>
|
||||||
|
<?php echo $message; ?>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
10
application/errors/error_php.php
Normal file
10
application/errors/error_php.php
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">
|
||||||
|
|
||||||
|
<h4>A PHP Error was encountered</h4>
|
||||||
|
|
||||||
|
<p>Severity: <?php echo $severity; ?></p>
|
||||||
|
<p>Message: <?php echo $message; ?></p>
|
||||||
|
<p>Filename: <?php echo $filepath; ?></p>
|
||||||
|
<p>Line Number: <?php echo $line; ?></p>
|
||||||
|
|
||||||
|
</div>
|
10
application/errors/index.html
Normal file
10
application/errors/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
10
application/helpers/index.html
Normal file
10
application/helpers/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
10
application/hooks/index.html
Normal file
10
application/hooks/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
10
application/index.html
Normal file
10
application/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
10
application/language/english/index.html
Normal file
10
application/language/english/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
270
application/libraries/Format.php
Normal file
270
application/libraries/Format.php
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Format class
|
||||||
|
*
|
||||||
|
* Help convert between various formats such as XML, JSON, CSV, etc.
|
||||||
|
*
|
||||||
|
* @author Phil Sturgeon
|
||||||
|
* @license http://philsturgeon.co.uk/code/dbad-license
|
||||||
|
*/
|
||||||
|
class Format {
|
||||||
|
|
||||||
|
// Array to convert
|
||||||
|
protected $_data = array();
|
||||||
|
|
||||||
|
// View filename
|
||||||
|
protected $_from_type = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an instance of the Format object.
|
||||||
|
*
|
||||||
|
* echo $this->format->factory(array('foo' => 'bar'))->to_xml();
|
||||||
|
*
|
||||||
|
* @param mixed general date to be converted
|
||||||
|
* @param string data format the file was provided in
|
||||||
|
* @return Factory
|
||||||
|
*/
|
||||||
|
public function factory($data, $from_type = null)
|
||||||
|
{
|
||||||
|
// Stupid stuff to emulate the "new static()" stuff in this libraries PHP 5.3 equivalent
|
||||||
|
$class = __CLASS__;
|
||||||
|
return new $class($data, $from_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do not use this directly, call factory()
|
||||||
|
*/
|
||||||
|
public function __construct($data = null, $from_type = null)
|
||||||
|
{
|
||||||
|
get_instance()->load->helper('inflector');
|
||||||
|
|
||||||
|
// If the provided data is already formatted we should probably convert it to an array
|
||||||
|
if ($from_type !== null)
|
||||||
|
{
|
||||||
|
if (method_exists($this, '_from_' . $from_type))
|
||||||
|
{
|
||||||
|
$data = call_user_func(array($this, '_from_' . $from_type), $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception('Format class does not support conversion from "' . $from_type . '".');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_data = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FORMATING OUTPUT ---------------------------------------------------------
|
||||||
|
|
||||||
|
public function to_array($data = null)
|
||||||
|
{
|
||||||
|
// If not just null, but nothing is provided
|
||||||
|
if ($data === null and ! func_num_args())
|
||||||
|
{
|
||||||
|
$data = $this->_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
$array = array();
|
||||||
|
|
||||||
|
foreach ((array) $data as $key => $value)
|
||||||
|
{
|
||||||
|
if (is_object($value) or is_array($value))
|
||||||
|
{
|
||||||
|
$array[$key] = $this->to_array($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$array[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format XML for output
|
||||||
|
public function to_xml($data = null, $structure = null, $basenode = 'xml')
|
||||||
|
{
|
||||||
|
if ($data === null and ! func_num_args())
|
||||||
|
{
|
||||||
|
$data = $this->_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// turn off compatibility mode as simple xml throws a wobbly if you don't.
|
||||||
|
if (ini_get('zend.ze1_compatibility_mode') == 1)
|
||||||
|
{
|
||||||
|
ini_set('zend.ze1_compatibility_mode', 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($structure === null)
|
||||||
|
{
|
||||||
|
$structure = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><$basenode />");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force it to be something useful
|
||||||
|
if ( ! is_array($data) AND ! is_object($data))
|
||||||
|
{
|
||||||
|
$data = (array) $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($data as $key => $value)
|
||||||
|
{
|
||||||
|
|
||||||
|
//change false/true to 0/1
|
||||||
|
if(is_bool($value))
|
||||||
|
{
|
||||||
|
$value = (int) $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// no numeric keys in our xml please!
|
||||||
|
if (is_numeric($key))
|
||||||
|
{
|
||||||
|
// make string key...
|
||||||
|
$key = (singular($basenode) != $basenode) ? singular($basenode) : 'item';
|
||||||
|
}
|
||||||
|
|
||||||
|
// replace anything not alpha numeric
|
||||||
|
$key = preg_replace('/[^a-z_\-0-9]/i', '', $key);
|
||||||
|
|
||||||
|
// if there is another array found recursively call this function
|
||||||
|
if (is_array($value) || is_object($value))
|
||||||
|
{
|
||||||
|
$node = $structure->addChild($key);
|
||||||
|
|
||||||
|
// recursive call.
|
||||||
|
$this->to_xml($value, $node, $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// add single node.
|
||||||
|
$value = htmlspecialchars(html_entity_decode($value, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, "UTF-8");
|
||||||
|
|
||||||
|
$structure->addChild($key, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $structure->asXML();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format HTML for output
|
||||||
|
public function to_html()
|
||||||
|
{
|
||||||
|
$data = $this->_data;
|
||||||
|
|
||||||
|
// Multi-dimensional array
|
||||||
|
if (isset($data[0]) && is_array($data[0]))
|
||||||
|
{
|
||||||
|
$headings = array_keys($data[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Single array
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$headings = array_keys($data);
|
||||||
|
$data = array($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ci = get_instance();
|
||||||
|
$ci->load->library('table');
|
||||||
|
|
||||||
|
$ci->table->set_heading($headings);
|
||||||
|
|
||||||
|
foreach ($data as &$row)
|
||||||
|
{
|
||||||
|
$ci->table->add_row($row);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ci->table->generate();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format CSV for output
|
||||||
|
public function to_csv()
|
||||||
|
{
|
||||||
|
$data = $this->_data;
|
||||||
|
|
||||||
|
// Multi-dimensional array
|
||||||
|
if (isset($data[0]) && is_array($data[0]))
|
||||||
|
{
|
||||||
|
$headings = array_keys($data[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Single array
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$headings = array_keys($data);
|
||||||
|
$data = array($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
$output = implode(',', $headings).PHP_EOL;
|
||||||
|
foreach ($data as &$row)
|
||||||
|
{
|
||||||
|
$output .= '"'.implode('","', $row).'"'.PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode as JSON
|
||||||
|
public function to_json()
|
||||||
|
{
|
||||||
|
return json_encode($this->_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode as Serialized array
|
||||||
|
public function to_serialized()
|
||||||
|
{
|
||||||
|
return serialize($this->_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output as a string representing the PHP structure
|
||||||
|
public function to_php()
|
||||||
|
{
|
||||||
|
return var_export($this->_data, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format XML for output
|
||||||
|
protected function _from_xml($string)
|
||||||
|
{
|
||||||
|
return $string ? (array) simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA) : array();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format CSV for output
|
||||||
|
// This function is DODGY! Not perfect CSV support but works with my REST_Controller
|
||||||
|
protected function _from_csv($string)
|
||||||
|
{
|
||||||
|
$data = array();
|
||||||
|
|
||||||
|
// Splits
|
||||||
|
$rows = explode("\n", trim($string));
|
||||||
|
$headings = explode(',', array_shift($rows));
|
||||||
|
foreach ($rows as $row)
|
||||||
|
{
|
||||||
|
// The substr removes " from start and end
|
||||||
|
$data_fields = explode('","', trim(substr($row, 1, -1)));
|
||||||
|
|
||||||
|
if (count($data_fields) == count($headings))
|
||||||
|
{
|
||||||
|
$data[] = array_combine($headings, $data_fields);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode as JSON
|
||||||
|
private function _from_json($string)
|
||||||
|
{
|
||||||
|
return json_decode(trim($string));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode as Serialized array
|
||||||
|
private function _from_serialize($string)
|
||||||
|
{
|
||||||
|
return unserialize(trim($string));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file format.php */
|
1270
application/libraries/REST_Controller.php
Normal file
1270
application/libraries/REST_Controller.php
Normal file
File diff suppressed because it is too large
Load Diff
10
application/libraries/index.html
Normal file
10
application/libraries/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
10
application/logs/index.html
Normal file
10
application/logs/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
40
application/models/barang_model.php
Normal file
40
application/models/barang_model.php
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
class barang_model extends CI_Model{
|
||||||
|
|
||||||
|
function get_barang_all()
|
||||||
|
{
|
||||||
|
$query=$this->db->query("SELECT * FROM barang ORDER BY id DESC");
|
||||||
|
return $query->result();
|
||||||
|
}
|
||||||
|
function get_barang_by($id){
|
||||||
|
$query=$this->db->query("SELECT * FROM barang WHERE id='$id'");
|
||||||
|
return $query->result();
|
||||||
|
}
|
||||||
|
function update_barang($id)
|
||||||
|
{
|
||||||
|
$q="SELECT * FROM barang WHERE id='$id'";
|
||||||
|
$query=$this->db->query($q);
|
||||||
|
return $query->row();
|
||||||
|
}
|
||||||
|
function simpan_update_barang($id, $nama, $harga)
|
||||||
|
{
|
||||||
|
$data = array(
|
||||||
|
'id' => $id,
|
||||||
|
'nama' => $nama,
|
||||||
|
'harga' => $harga
|
||||||
|
);
|
||||||
|
$this->db->where('id', $id);
|
||||||
|
$this->db->update('barang', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function delete_barang($id)
|
||||||
|
{
|
||||||
|
$query=$this->db->query("DELETE FROM barang WHERE id='$id'");
|
||||||
|
}
|
||||||
|
|
||||||
|
function simpan_barang($simpan_data)
|
||||||
|
{
|
||||||
|
$this->db->insert('barang', $simpan_data);
|
||||||
|
return $this->db->affected_rows();
|
||||||
|
}
|
||||||
|
}
|
10
application/models/index.html
Normal file
10
application/models/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
69
application/models/mbarang.php
Normal file
69
application/models/mbarang.php
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<?php defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example
|
||||||
|
*
|
||||||
|
* This is an example of a few basic user interaction methods you could use
|
||||||
|
* all done with a hardcoded array.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Rest Server
|
||||||
|
* @category Controller
|
||||||
|
* @author Phil Sturgeon
|
||||||
|
* @link http://philsturgeon.co.uk/code/
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This can be removed if you use __autoload() in config.php OR use Modular Extensions
|
||||||
|
|
||||||
|
class Mbarang extends CI_Model
|
||||||
|
{
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
function insert($insert){
|
||||||
|
if($this->db->insert('barang',$insert)){
|
||||||
|
return TRUE;
|
||||||
|
}else{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function update($id,$update){
|
||||||
|
if($this->db->update('barang',$update,'id = \''.$id.'\'')){
|
||||||
|
return TRUE;
|
||||||
|
}else{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function delete($id){
|
||||||
|
$delete['id_file'] = $id;
|
||||||
|
if($this->db->delete('barang',$delete)){
|
||||||
|
return TRUE;
|
||||||
|
}else{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function select($select=NULL,$awal=0,$akhir=10){
|
||||||
|
//if(! is_null($select))$this->db->like($select);
|
||||||
|
$query = $this->db->get('barang',$akhir,$awal);
|
||||||
|
return $query->result();
|
||||||
|
}
|
||||||
|
function view($select=NULL){
|
||||||
|
//if(! is_null($select))$this->db->like($select);
|
||||||
|
$query = $this->db->get('barang');
|
||||||
|
$arr = $query->result_array();
|
||||||
|
if($query->num_rows > 0){
|
||||||
|
return $arr[0];
|
||||||
|
}else{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function penerima($idu){
|
||||||
|
$this->db->where('id <>',$idu);
|
||||||
|
$query = $this->db->get('barang');
|
||||||
|
return $query->result();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* End of file mbarang.php */
|
||||||
|
/* Location: ./application/controllers/welcome.php */
|
10
application/third_party/index.html
vendored
Normal file
10
application/third_party/index.html
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
18
application/views/add.php
Normal file
18
application/views/add.php
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
<form action="<?php echo base_url().'api/barang/add_barang' ?> " method="post">
|
||||||
|
<table class="add" cellspacing="20">
|
||||||
|
<tr>
|
||||||
|
<td>Nama Barang</td>
|
||||||
|
<td colspan="3"><input type="text" name="nama_barang" value="" class="input"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Harga</td>
|
||||||
|
<td colspan="3"><input type="text" name="harga" value="" class="input"/></td>
|
||||||
|
</tr>
|
||||||
|
<tr><td></td>
|
||||||
|
<td></td>
|
||||||
|
<td><input type="submit" name="submit" value="Simpan"/></td>
|
||||||
|
<td><button type="button" name="Cancel" value="OK">Cancel</button></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
10
application/views/index.html
Normal file
10
application/views/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
89
application/views/welcome_message.php
Normal file
89
application/views/welcome_message.php
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Welcome to CodeIgniter</title>
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: #fff;
|
||||||
|
margin: 40px;
|
||||||
|
font-family: Lucida Grande, Verdana, Sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #4F5155;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #003399;
|
||||||
|
background-color: transparent;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: #444;
|
||||||
|
background-color: transparent;
|
||||||
|
border-bottom: 1px solid #D0D0D0;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 24px 0 2px 0;
|
||||||
|
padding: 5px 0 6px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
font-family: Monaco, Verdana, Sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
border: 1px solid #D0D0D0;
|
||||||
|
color: #002166;
|
||||||
|
display: block;
|
||||||
|
margin: 14px 0 14px 0;
|
||||||
|
padding: 12px 10px 12px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>Welcome to CodeIgniter!</h1>
|
||||||
|
|
||||||
|
<p>The page you are looking at is being generated dynamically by CodeIgniter.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><a href="<?php echo site_url('api/example/users');?>">Users</a> - defaulting to XML</li>
|
||||||
|
<li><a href="<?php echo site_url('api/example/users/format/csv');?>">Users</a> - get it in CSV</li>
|
||||||
|
<li><a href="<?php echo site_url('api/example/user/id/1');?>">User #1</a> - defaulting to XML</li>
|
||||||
|
<li><a href="<?php echo site_url('api/example/user/id/1/format/json');?>">User #1</a> - get it in JSON</li>
|
||||||
|
<li><a id="ajax" href="<?php echo site_url('api/example/users/format/json');?>">Users</a> - get it in JSON (AJAX request)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>If you are exploring CodeIgniter for the very first time, you should start by reading the <a href="user_guide/">User Guide</a>.</p>
|
||||||
|
|
||||||
|
<p><br />Page rendered in {elapsed_time} seconds</p>
|
||||||
|
|
||||||
|
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(function(){
|
||||||
|
// Bind a click event to the 'ajax' object id
|
||||||
|
$("#ajax").bind("click", function( evt ){
|
||||||
|
// Javascript needs totake over. So stop the browser from redirecting the page
|
||||||
|
evt.preventDefault();
|
||||||
|
// AJAX request to get the data
|
||||||
|
$.ajax({
|
||||||
|
// URL from the link that was clicked on
|
||||||
|
url: $(this).attr("href"),
|
||||||
|
// Success function. the 'data' parameter is an array of objects that can be looped over
|
||||||
|
success: function(data, textStatus, jqXHR){
|
||||||
|
alert('Successful AJAX request!');
|
||||||
|
},
|
||||||
|
// Failed to load request. This could be caused by any number of problems like server issues, bad links, etc.
|
||||||
|
error: function(jqXHR, textStatus, errorThrown){
|
||||||
|
alert('Oh no! A problem with the AJAX request!');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
205
index.php
Normal file
205
index.php
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
* APPLICATION ENVIRONMENT
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* You can load different configurations depending on your
|
||||||
|
* current environment. Setting the environment also influences
|
||||||
|
* things like logging and error reporting.
|
||||||
|
*
|
||||||
|
* This can be set to anything, but default usage is:
|
||||||
|
*
|
||||||
|
* development
|
||||||
|
* testing
|
||||||
|
* production
|
||||||
|
*
|
||||||
|
* NOTE: If you change these, also change the error_reporting() code below
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
define('ENVIRONMENT', 'development');
|
||||||
|
/*
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
* ERROR REPORTING
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Different environments will require different levels of error reporting.
|
||||||
|
* By default development will show errors but testing and live will hide them.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (defined('ENVIRONMENT'))
|
||||||
|
{
|
||||||
|
switch (ENVIRONMENT)
|
||||||
|
{
|
||||||
|
case 'development':
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'testing':
|
||||||
|
case 'production':
|
||||||
|
error_reporting(0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
exit('The application environment is not set correctly.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
* SYSTEM FOLDER NAME
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* This variable must contain the name of your "system" folder.
|
||||||
|
* Include the path if the folder is not in the same directory
|
||||||
|
* as this file.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
$system_path = 'system';
|
||||||
|
|
||||||
|
/*
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
* APPLICATION FOLDER NAME
|
||||||
|
*---------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* If you want this front controller to use a different "application"
|
||||||
|
* folder then the default one you can set its name here. The folder
|
||||||
|
* can also be renamed or relocated anywhere on your server. If
|
||||||
|
* you do, use a full server path. For more info please see the user guide:
|
||||||
|
* http://codeigniter.com/user_guide/general/managing_apps.html
|
||||||
|
*
|
||||||
|
* NO TRAILING SLASH!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
$application_folder = 'application';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* DEFAULT CONTROLLER
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Normally you will set your default controller in the routes.php file.
|
||||||
|
* You can, however, force a custom routing by hard-coding a
|
||||||
|
* specific controller class/function here. For most applications, you
|
||||||
|
* WILL NOT set your routing here, but it's an option for those
|
||||||
|
* special instances where you might want to override the standard
|
||||||
|
* routing in a specific front controller that shares a common CI installation.
|
||||||
|
*
|
||||||
|
* IMPORTANT: If you set the routing here, NO OTHER controller will be
|
||||||
|
* callable. In essence, this preference limits your application to ONE
|
||||||
|
* specific controller. Leave the function name blank if you need
|
||||||
|
* to call functions dynamically via the URI.
|
||||||
|
*
|
||||||
|
* Un-comment the $routing array below to use this feature
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
// The directory name, relative to the "controllers" folder. Leave blank
|
||||||
|
// if your controller is not in a sub-folder within the "controllers" folder
|
||||||
|
// $routing['directory'] = '';
|
||||||
|
|
||||||
|
// The controller class file name. Example: Mycontroller
|
||||||
|
// $routing['controller'] = '';
|
||||||
|
|
||||||
|
// The controller function you wish to be called.
|
||||||
|
// $routing['function'] = '';
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* -------------------------------------------------------------------
|
||||||
|
* CUSTOM CONFIG VALUES
|
||||||
|
* -------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* The $assign_to_config array below will be passed dynamically to the
|
||||||
|
* config class when initialized. This allows you to set custom config
|
||||||
|
* items or override any default config values found in the config.php file.
|
||||||
|
* This can be handy as it permits you to share one application between
|
||||||
|
* multiple front controller files, with each file containing different
|
||||||
|
* config values.
|
||||||
|
*
|
||||||
|
* Un-comment the $assign_to_config array below to use this feature
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
// $assign_to_config['name_of_config_item'] = 'value of config item';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// END OF USER CONFIGURABLE SETTINGS. DO NOT EDIT BELOW THIS LINE
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ---------------------------------------------------------------
|
||||||
|
* Resolve the system path for increased reliability
|
||||||
|
* ---------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Set the current directory correctly for CLI requests
|
||||||
|
if (defined('STDIN'))
|
||||||
|
{
|
||||||
|
chdir(dirname(__FILE__));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (realpath($system_path) !== FALSE)
|
||||||
|
{
|
||||||
|
$system_path = realpath($system_path).'/';
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure there's a trailing slash
|
||||||
|
$system_path = rtrim($system_path, '/').'/';
|
||||||
|
|
||||||
|
// Is the system path correct?
|
||||||
|
if ( ! is_dir($system_path))
|
||||||
|
{
|
||||||
|
exit("Your system folder path does not appear to be set correctly. Please open the following file and correct this: ".pathinfo(__FILE__, PATHINFO_BASENAME));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* -------------------------------------------------------------------
|
||||||
|
* Now that we know the path, set the main path constants
|
||||||
|
* -------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
// The name of THIS file
|
||||||
|
define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
|
||||||
|
|
||||||
|
// The PHP file extension
|
||||||
|
// this global constant is deprecated.
|
||||||
|
define('EXT', '.php');
|
||||||
|
|
||||||
|
// Path to the system folder
|
||||||
|
define('BASEPATH', str_replace("\\", "/", $system_path));
|
||||||
|
|
||||||
|
// Path to the front controller (this file)
|
||||||
|
define('FCPATH', str_replace(SELF, '', __FILE__));
|
||||||
|
|
||||||
|
// Name of the "system folder"
|
||||||
|
define('SYSDIR', trim(strrchr(trim(BASEPATH, '/'), '/'), '/'));
|
||||||
|
|
||||||
|
|
||||||
|
// The path to the "application" folder
|
||||||
|
if (is_dir($application_folder))
|
||||||
|
{
|
||||||
|
define('APPPATH', $application_folder.'/');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( ! is_dir(BASEPATH.$application_folder.'/'))
|
||||||
|
{
|
||||||
|
exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF);
|
||||||
|
}
|
||||||
|
|
||||||
|
define('APPPATH', BASEPATH.$application_folder.'/');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
* LOAD THE BOOTSTRAP FILE
|
||||||
|
* --------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* And away we go...
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
require_once BASEPATH.'core/CodeIgniter.php';
|
||||||
|
|
||||||
|
/* End of file index.php */
|
||||||
|
/* Location: ./index.php */
|
51
license.txt
Normal file
51
license.txt
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
This license is a legal agreement between you and EllisLab Inc. for the use
|
||||||
|
of CodeIgniter Software (the "Software"). By obtaining the Software you
|
||||||
|
agree to comply with the terms and conditions of this license.
|
||||||
|
|
||||||
|
PERMITTED USE
|
||||||
|
You are permitted to use, copy, modify, and distribute the Software and its
|
||||||
|
documentation, with or without modification, for any purpose, provided that
|
||||||
|
the following conditions are met:
|
||||||
|
|
||||||
|
1. A copy of this license agreement must be included with the distribution.
|
||||||
|
|
||||||
|
2. Redistributions of source code must retain the above copyright notice in
|
||||||
|
all source code files.
|
||||||
|
|
||||||
|
3. Redistributions in binary form must reproduce the above copyright notice
|
||||||
|
in the documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
4. Any files that have been modified must carry notices stating the nature
|
||||||
|
of the change and the names of those who changed them.
|
||||||
|
|
||||||
|
5. Products derived from the Software must include an acknowledgment that
|
||||||
|
they are derived from CodeIgniter in their documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
6. Products derived from the Software may not be called "CodeIgniter",
|
||||||
|
nor may "CodeIgniter" appear in their name, without prior written
|
||||||
|
permission from EllisLab, Inc.
|
||||||
|
|
||||||
|
INDEMNITY
|
||||||
|
You agree to indemnify and hold harmless the authors of the Software and
|
||||||
|
any contributors for any direct, indirect, incidental, or consequential
|
||||||
|
third-party claims, actions or suits, as well as any related expenses,
|
||||||
|
liabilities, damages, settlements or fees arising from your use or misuse
|
||||||
|
of the Software, or a violation of any terms of this license.
|
||||||
|
|
||||||
|
DISCLAIMER OF WARRANTY
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR
|
||||||
|
IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF QUALITY, PERFORMANCE,
|
||||||
|
NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
LIMITATIONS OF LIABILITY
|
||||||
|
YOU ASSUME ALL RISK ASSOCIATED WITH THE INSTALLATION AND USE OF THE SOFTWARE.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS OF THE SOFTWARE BE LIABLE
|
||||||
|
FOR CLAIMS, DAMAGES OR OTHER LIABILITY ARISING FROM, OUT OF, OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE. LICENSE HOLDERS ARE SOLELY RESPONSIBLE FOR DETERMINING THE
|
||||||
|
APPROPRIATENESS OF USE AND ASSUME ALL RISKS ASSOCIATED WITH ITS USE, INCLUDING
|
||||||
|
BUT NOT LIMITED TO THE RISKS OF PROGRAM ERRORS, DAMAGE TO EQUIPMENT, LOSS OF
|
||||||
|
DATA OR SOFTWARE PROGRAMS, OR UNAVAILABILITY OR INTERRUPTION OF OPERATIONS.
|
1
system/.htaccess
Normal file
1
system/.htaccess
Normal file
@ -0,0 +1 @@
|
|||||||
|
Deny from all
|
118
system/core/Benchmark.php
Normal file
118
system/core/Benchmark.php
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter Benchmark Class
|
||||||
|
*
|
||||||
|
* This class enables you to mark points and calculate the time difference
|
||||||
|
* between them. Memory consumption can also be displayed.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category Libraries
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/libraries/benchmark.html
|
||||||
|
*/
|
||||||
|
class CI_Benchmark {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of all benchmark markers and when they were added
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
var $marker = array();
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a benchmark marker
|
||||||
|
*
|
||||||
|
* Multiple calls to this function can be made so that several
|
||||||
|
* execution points can be timed
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string $name name of the marker
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function mark($name)
|
||||||
|
{
|
||||||
|
$this->marker[$name] = microtime();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the time difference between two marked points.
|
||||||
|
*
|
||||||
|
* If the first parameter is empty this function instead returns the
|
||||||
|
* {elapsed_time} pseudo-variable. This permits the full system
|
||||||
|
* execution time to be shown in a template. The output class will
|
||||||
|
* swap the real value for this variable.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string a particular marked point
|
||||||
|
* @param string a particular marked point
|
||||||
|
* @param integer the number of decimal places
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
|
||||||
|
{
|
||||||
|
if ($point1 == '')
|
||||||
|
{
|
||||||
|
return '{elapsed_time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! isset($this->marker[$point1]))
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! isset($this->marker[$point2]))
|
||||||
|
{
|
||||||
|
$this->marker[$point2] = microtime();
|
||||||
|
}
|
||||||
|
|
||||||
|
list($sm, $ss) = explode(' ', $this->marker[$point1]);
|
||||||
|
list($em, $es) = explode(' ', $this->marker[$point2]);
|
||||||
|
|
||||||
|
return number_format(($em + $es) - ($sm + $ss), $decimals);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Memory Usage
|
||||||
|
*
|
||||||
|
* This function returns the {memory_usage} pseudo-variable.
|
||||||
|
* This permits it to be put it anywhere in a template
|
||||||
|
* without the memory being calculated until the end.
|
||||||
|
* The output class will swap the real value for this variable.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function memory_usage()
|
||||||
|
{
|
||||||
|
return '{memory_usage}';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// END CI_Benchmark class
|
||||||
|
|
||||||
|
/* End of file Benchmark.php */
|
||||||
|
/* Location: ./system/core/Benchmark.php */
|
402
system/core/CodeIgniter.php
Normal file
402
system/core/CodeIgniter.php
Normal file
@ -0,0 +1,402 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* System Initialization File
|
||||||
|
*
|
||||||
|
* Loads the base classes and executes the request.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage codeigniter
|
||||||
|
* @category Front-controller
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter Version
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
define('CI_VERSION', '2.1.3');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter Branch (Core = TRUE, Reactor = FALSE)
|
||||||
|
*
|
||||||
|
* @var boolean
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
define('CI_CORE', FALSE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Load the global functions
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
require(BASEPATH.'core/Common.php');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Load the framework constants
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php'))
|
||||||
|
{
|
||||||
|
require(APPPATH.'config/'.ENVIRONMENT.'/constants.php');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
require(APPPATH.'config/constants.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Define a custom error handler so we can log PHP errors
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
set_error_handler('_exception_handler');
|
||||||
|
|
||||||
|
if ( ! is_php('5.3'))
|
||||||
|
{
|
||||||
|
@set_magic_quotes_runtime(0); // Kill magic quotes
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Set the subclass_prefix
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Normally the "subclass_prefix" is set in the config file.
|
||||||
|
* The subclass prefix allows CI to know if a core class is
|
||||||
|
* being extended via a library in the local application
|
||||||
|
* "libraries" folder. Since CI allows config items to be
|
||||||
|
* overriden via data set in the main index. php file,
|
||||||
|
* before proceeding we need to know if a subclass_prefix
|
||||||
|
* override exists. If so, we will set this value now,
|
||||||
|
* before any classes are loaded
|
||||||
|
* Note: Since the config file data is cached it doesn't
|
||||||
|
* hurt to load it here.
|
||||||
|
*/
|
||||||
|
if (isset($assign_to_config['subclass_prefix']) AND $assign_to_config['subclass_prefix'] != '')
|
||||||
|
{
|
||||||
|
get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix']));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Set a liberal script execution time limit
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0)
|
||||||
|
{
|
||||||
|
@set_time_limit(300);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Start the timer... tick tock tick tock...
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$BM =& load_class('Benchmark', 'core');
|
||||||
|
$BM->mark('total_execution_time_start');
|
||||||
|
$BM->mark('loading_time:_base_classes_start');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Instantiate the hooks class
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$EXT =& load_class('Hooks', 'core');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Is there a "pre_system" hook?
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$EXT->_call_hook('pre_system');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Instantiate the config class
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$CFG =& load_class('Config', 'core');
|
||||||
|
|
||||||
|
// Do we have any manually set config items in the index.php file?
|
||||||
|
if (isset($assign_to_config))
|
||||||
|
{
|
||||||
|
$CFG->_assign_to_config($assign_to_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Instantiate the UTF-8 class
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Note: Order here is rather important as the UTF-8
|
||||||
|
* class needs to be used very early on, but it cannot
|
||||||
|
* properly determine if UTf-8 can be supported until
|
||||||
|
* after the Config class is instantiated.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
$UNI =& load_class('Utf8', 'core');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Instantiate the URI class
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$URI =& load_class('URI', 'core');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Instantiate the routing class and set the routing
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$RTR =& load_class('Router', 'core');
|
||||||
|
$RTR->_set_routing();
|
||||||
|
|
||||||
|
// Set any routing overrides that may exist in the main index file
|
||||||
|
if (isset($routing))
|
||||||
|
{
|
||||||
|
$RTR->_set_overrides($routing);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Instantiate the output class
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$OUT =& load_class('Output', 'core');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Is there a valid cache file? If so, we're done...
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
if ($EXT->_call_hook('cache_override') === FALSE)
|
||||||
|
{
|
||||||
|
if ($OUT->_display_cache($CFG, $URI) == TRUE)
|
||||||
|
{
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* -----------------------------------------------------
|
||||||
|
* Load the security class for xss and csrf support
|
||||||
|
* -----------------------------------------------------
|
||||||
|
*/
|
||||||
|
$SEC =& load_class('Security', 'core');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Load the Input class and sanitize globals
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$IN =& load_class('Input', 'core');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Load the Language class
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$LANG =& load_class('Lang', 'core');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Load the app controller and local controller
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
// Load the base controller class
|
||||||
|
require BASEPATH.'core/Controller.php';
|
||||||
|
|
||||||
|
function &get_instance()
|
||||||
|
{
|
||||||
|
return CI_Controller::get_instance();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
|
||||||
|
{
|
||||||
|
require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the local application controller
|
||||||
|
// Note: The Router class automatically validates the controller path using the router->_validate_request().
|
||||||
|
// If this include fails it means that the default controller in the Routes.php file is not resolving to something valid.
|
||||||
|
if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php'))
|
||||||
|
{
|
||||||
|
show_error('Unable to load your default controller. Please make sure the controller specified in your Routes.php file is valid.');
|
||||||
|
}
|
||||||
|
|
||||||
|
include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php');
|
||||||
|
|
||||||
|
// Set a mark point for benchmarking
|
||||||
|
$BM->mark('loading_time:_base_classes_end');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Security check
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*
|
||||||
|
* None of the functions in the app controller or the
|
||||||
|
* loader class can be called via the URI, nor can
|
||||||
|
* controller functions that begin with an underscore
|
||||||
|
*/
|
||||||
|
$class = $RTR->fetch_class();
|
||||||
|
$method = $RTR->fetch_method();
|
||||||
|
|
||||||
|
if ( ! class_exists($class)
|
||||||
|
OR strncmp($method, '_', 1) == 0
|
||||||
|
OR in_array(strtolower($method), array_map('strtolower', get_class_methods('CI_Controller')))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if ( ! empty($RTR->routes['404_override']))
|
||||||
|
{
|
||||||
|
$x = explode('/', $RTR->routes['404_override']);
|
||||||
|
$class = $x[0];
|
||||||
|
$method = (isset($x[1]) ? $x[1] : 'index');
|
||||||
|
if ( ! class_exists($class))
|
||||||
|
{
|
||||||
|
if ( ! file_exists(APPPATH.'controllers/'.$class.'.php'))
|
||||||
|
{
|
||||||
|
show_404("{$class}/{$method}");
|
||||||
|
}
|
||||||
|
|
||||||
|
include_once(APPPATH.'controllers/'.$class.'.php');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
show_404("{$class}/{$method}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Is there a "pre_controller" hook?
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$EXT->_call_hook('pre_controller');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Instantiate the requested controller
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
// Mark a start point so we can benchmark the controller
|
||||||
|
$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');
|
||||||
|
|
||||||
|
$CI = new $class();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Is there a "post_controller_constructor" hook?
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$EXT->_call_hook('post_controller_constructor');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Call the requested method
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
// Is there a "remap" function? If so, we call it instead
|
||||||
|
if (method_exists($CI, '_remap'))
|
||||||
|
{
|
||||||
|
$CI->_remap($method, array_slice($URI->rsegments, 2));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// is_callable() returns TRUE on some versions of PHP 5 for private and protected
|
||||||
|
// methods, so we'll use this workaround for consistent behavior
|
||||||
|
if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI))))
|
||||||
|
{
|
||||||
|
// Check and see if we are using a 404 override and use it.
|
||||||
|
if ( ! empty($RTR->routes['404_override']))
|
||||||
|
{
|
||||||
|
$x = explode('/', $RTR->routes['404_override']);
|
||||||
|
$class = $x[0];
|
||||||
|
$method = (isset($x[1]) ? $x[1] : 'index');
|
||||||
|
if ( ! class_exists($class))
|
||||||
|
{
|
||||||
|
if ( ! file_exists(APPPATH.'controllers/'.$class.'.php'))
|
||||||
|
{
|
||||||
|
show_404("{$class}/{$method}");
|
||||||
|
}
|
||||||
|
|
||||||
|
include_once(APPPATH.'controllers/'.$class.'.php');
|
||||||
|
unset($CI);
|
||||||
|
$CI = new $class();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
show_404("{$class}/{$method}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the requested method.
|
||||||
|
// Any URI segments present (besides the class/function) will be passed to the method for convenience
|
||||||
|
call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Mark a benchmark end point
|
||||||
|
$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Is there a "post_controller" hook?
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$EXT->_call_hook('post_controller');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Send the final rendered output to the browser
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
if ($EXT->_call_hook('display_override') === FALSE)
|
||||||
|
{
|
||||||
|
$OUT->_display();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Is there a "post_system" hook?
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
$EXT->_call_hook('post_system');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Close the DB connection if one exists
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
if (class_exists('CI_DB') AND isset($CI->db))
|
||||||
|
{
|
||||||
|
$CI->db->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file CodeIgniter.php */
|
||||||
|
/* Location: ./system/core/CodeIgniter.php */
|
564
system/core/Common.php
Normal file
564
system/core/Common.php
Normal file
@ -0,0 +1,564 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Common Functions
|
||||||
|
*
|
||||||
|
* Loads the base classes and executes the request.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage codeigniter
|
||||||
|
* @category Common Functions
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the current version of PHP is greater then the supplied value
|
||||||
|
*
|
||||||
|
* Since there are a few places where we conditionally test for PHP > 5
|
||||||
|
* we'll set a static variable.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return bool TRUE if the current version is $version or higher
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('is_php'))
|
||||||
|
{
|
||||||
|
function is_php($version = '5.0.0')
|
||||||
|
{
|
||||||
|
static $_is_php;
|
||||||
|
$version = (string)$version;
|
||||||
|
|
||||||
|
if ( ! isset($_is_php[$version]))
|
||||||
|
{
|
||||||
|
$_is_php[$version] = (version_compare(PHP_VERSION, $version) < 0) ? FALSE : TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $_is_php[$version];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for file writability
|
||||||
|
*
|
||||||
|
* is_writable() returns TRUE on Windows servers when you really can't write to
|
||||||
|
* the file, based on the read-only attribute. is_writable() is also unreliable
|
||||||
|
* on Unix servers if safe_mode is on.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('is_really_writable'))
|
||||||
|
{
|
||||||
|
function is_really_writable($file)
|
||||||
|
{
|
||||||
|
// If we're on a Unix server with safe_mode off we call is_writable
|
||||||
|
if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
|
||||||
|
{
|
||||||
|
return is_writable($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For windows servers and safe_mode "on" installations we'll actually
|
||||||
|
// write a file then read it. Bah...
|
||||||
|
if (is_dir($file))
|
||||||
|
{
|
||||||
|
$file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));
|
||||||
|
|
||||||
|
if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose($fp);
|
||||||
|
@chmod($file, DIR_WRITE_MODE);
|
||||||
|
@unlink($file);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose($fp);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class registry
|
||||||
|
*
|
||||||
|
* This function acts as a singleton. If the requested class does not
|
||||||
|
* exist it is instantiated and set to a static variable. If it has
|
||||||
|
* previously been instantiated the variable is returned.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the class name being requested
|
||||||
|
* @param string the directory where the class should be found
|
||||||
|
* @param string the class name prefix
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('load_class'))
|
||||||
|
{
|
||||||
|
function &load_class($class, $directory = 'libraries', $prefix = 'CI_')
|
||||||
|
{
|
||||||
|
static $_classes = array();
|
||||||
|
|
||||||
|
// Does the class exist? If so, we're done...
|
||||||
|
if (isset($_classes[$class]))
|
||||||
|
{
|
||||||
|
return $_classes[$class];
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = FALSE;
|
||||||
|
|
||||||
|
// Look for the class first in the local application/libraries folder
|
||||||
|
// then in the native system/libraries folder
|
||||||
|
foreach (array(APPPATH, BASEPATH) as $path)
|
||||||
|
{
|
||||||
|
if (file_exists($path.$directory.'/'.$class.'.php'))
|
||||||
|
{
|
||||||
|
$name = $prefix.$class;
|
||||||
|
|
||||||
|
if (class_exists($name) === FALSE)
|
||||||
|
{
|
||||||
|
require($path.$directory.'/'.$class.'.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is the request a class extension? If so we load it too
|
||||||
|
if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'))
|
||||||
|
{
|
||||||
|
$name = config_item('subclass_prefix').$class;
|
||||||
|
|
||||||
|
if (class_exists($name) === FALSE)
|
||||||
|
{
|
||||||
|
require(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Did we find the class?
|
||||||
|
if ($name === FALSE)
|
||||||
|
{
|
||||||
|
// Note: We use exit() rather then show_error() in order to avoid a
|
||||||
|
// self-referencing loop with the Excptions class
|
||||||
|
exit('Unable to locate the specified class: '.$class.'.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep track of what we just loaded
|
||||||
|
is_loaded($class);
|
||||||
|
|
||||||
|
$_classes[$class] = new $name();
|
||||||
|
return $_classes[$class];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keeps track of which libraries have been loaded. This function is
|
||||||
|
* called by the load_class() function above
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('is_loaded'))
|
||||||
|
{
|
||||||
|
function &is_loaded($class = '')
|
||||||
|
{
|
||||||
|
static $_is_loaded = array();
|
||||||
|
|
||||||
|
if ($class != '')
|
||||||
|
{
|
||||||
|
$_is_loaded[strtolower($class)] = $class;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $_is_loaded;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the main config.php file
|
||||||
|
*
|
||||||
|
* This function lets us grab the config file even if the Config class
|
||||||
|
* hasn't been instantiated yet
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('get_config'))
|
||||||
|
{
|
||||||
|
function &get_config($replace = array())
|
||||||
|
{
|
||||||
|
static $_config;
|
||||||
|
|
||||||
|
if (isset($_config))
|
||||||
|
{
|
||||||
|
return $_config[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is the config file in the environment folder?
|
||||||
|
if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php'))
|
||||||
|
{
|
||||||
|
$file_path = APPPATH.'config/config.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch the config file
|
||||||
|
if ( ! file_exists($file_path))
|
||||||
|
{
|
||||||
|
exit('The configuration file does not exist.');
|
||||||
|
}
|
||||||
|
|
||||||
|
require($file_path);
|
||||||
|
|
||||||
|
// Does the $config array exist in the file?
|
||||||
|
if ( ! isset($config) OR ! is_array($config))
|
||||||
|
{
|
||||||
|
exit('Your config file does not appear to be formatted correctly.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Are any values being dynamically replaced?
|
||||||
|
if (count($replace) > 0)
|
||||||
|
{
|
||||||
|
foreach ($replace as $key => $val)
|
||||||
|
{
|
||||||
|
if (isset($config[$key]))
|
||||||
|
{
|
||||||
|
$config[$key] = $val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $_config[0] =& $config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the specified config item
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('config_item'))
|
||||||
|
{
|
||||||
|
function config_item($item)
|
||||||
|
{
|
||||||
|
static $_config_item = array();
|
||||||
|
|
||||||
|
if ( ! isset($_config_item[$item]))
|
||||||
|
{
|
||||||
|
$config =& get_config();
|
||||||
|
|
||||||
|
if ( ! isset($config[$item]))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
$_config_item[$item] = $config[$item];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $_config_item[$item];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error Handler
|
||||||
|
*
|
||||||
|
* This function lets us invoke the exception class and
|
||||||
|
* display errors using the standard error template located
|
||||||
|
* in application/errors/errors.php
|
||||||
|
* This function will send the error page directly to the
|
||||||
|
* browser and exit.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('show_error'))
|
||||||
|
{
|
||||||
|
function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered')
|
||||||
|
{
|
||||||
|
$_error =& load_class('Exceptions', 'core');
|
||||||
|
echo $_error->show_error($heading, $message, 'error_general', $status_code);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 404 Page Handler
|
||||||
|
*
|
||||||
|
* This function is similar to the show_error() function above
|
||||||
|
* However, instead of the standard error template it displays
|
||||||
|
* 404 errors.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('show_404'))
|
||||||
|
{
|
||||||
|
function show_404($page = '', $log_error = TRUE)
|
||||||
|
{
|
||||||
|
$_error =& load_class('Exceptions', 'core');
|
||||||
|
$_error->show_404($page, $log_error);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error Logging Interface
|
||||||
|
*
|
||||||
|
* We use this as a simple mechanism to access the logging
|
||||||
|
* class and send messages to be logged.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('log_message'))
|
||||||
|
{
|
||||||
|
function log_message($level = 'error', $message, $php_error = FALSE)
|
||||||
|
{
|
||||||
|
static $_log;
|
||||||
|
|
||||||
|
if (config_item('log_threshold') == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_log =& load_class('Log');
|
||||||
|
$_log->write_log($level, $message, $php_error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set HTTP Status Header
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param int the status code
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('set_status_header'))
|
||||||
|
{
|
||||||
|
function set_status_header($code = 200, $text = '')
|
||||||
|
{
|
||||||
|
$stati = array(
|
||||||
|
200 => 'OK',
|
||||||
|
201 => 'Created',
|
||||||
|
202 => 'Accepted',
|
||||||
|
203 => 'Non-Authoritative Information',
|
||||||
|
204 => 'No Content',
|
||||||
|
205 => 'Reset Content',
|
||||||
|
206 => 'Partial Content',
|
||||||
|
|
||||||
|
300 => 'Multiple Choices',
|
||||||
|
301 => 'Moved Permanently',
|
||||||
|
302 => 'Found',
|
||||||
|
304 => 'Not Modified',
|
||||||
|
305 => 'Use Proxy',
|
||||||
|
307 => 'Temporary Redirect',
|
||||||
|
|
||||||
|
400 => 'Bad Request',
|
||||||
|
401 => 'Unauthorized',
|
||||||
|
403 => 'Forbidden',
|
||||||
|
404 => 'Not Found',
|
||||||
|
405 => 'Method Not Allowed',
|
||||||
|
406 => 'Not Acceptable',
|
||||||
|
407 => 'Proxy Authentication Required',
|
||||||
|
408 => 'Request Timeout',
|
||||||
|
409 => 'Conflict',
|
||||||
|
410 => 'Gone',
|
||||||
|
411 => 'Length Required',
|
||||||
|
412 => 'Precondition Failed',
|
||||||
|
413 => 'Request Entity Too Large',
|
||||||
|
414 => 'Request-URI Too Long',
|
||||||
|
415 => 'Unsupported Media Type',
|
||||||
|
416 => 'Requested Range Not Satisfiable',
|
||||||
|
417 => 'Expectation Failed',
|
||||||
|
|
||||||
|
500 => 'Internal Server Error',
|
||||||
|
501 => 'Not Implemented',
|
||||||
|
502 => 'Bad Gateway',
|
||||||
|
503 => 'Service Unavailable',
|
||||||
|
504 => 'Gateway Timeout',
|
||||||
|
505 => 'HTTP Version Not Supported'
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($code == '' OR ! is_numeric($code))
|
||||||
|
{
|
||||||
|
show_error('Status codes must be numeric', 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($stati[$code]) AND $text == '')
|
||||||
|
{
|
||||||
|
$text = $stati[$code];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($text == '')
|
||||||
|
{
|
||||||
|
show_error('No status text available. Please check your status code number or supply your own message text.', 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
$server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : FALSE;
|
||||||
|
|
||||||
|
if (substr(php_sapi_name(), 0, 3) == 'cgi')
|
||||||
|
{
|
||||||
|
header("Status: {$code} {$text}", TRUE);
|
||||||
|
}
|
||||||
|
elseif ($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0')
|
||||||
|
{
|
||||||
|
header($server_protocol." {$code} {$text}", TRUE, $code);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
header("HTTP/1.1 {$code} {$text}", TRUE, $code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exception Handler
|
||||||
|
*
|
||||||
|
* This is the custom exception handler that is declaired at the top
|
||||||
|
* of Codeigniter.php. The main reason we use this is to permit
|
||||||
|
* PHP errors to be logged in our own log files since the user may
|
||||||
|
* not have access to server logs. Since this function
|
||||||
|
* effectively intercepts PHP errors, however, we also need
|
||||||
|
* to display errors based on the current error_reporting level.
|
||||||
|
* We do that with the use of a PHP error template.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('_exception_handler'))
|
||||||
|
{
|
||||||
|
function _exception_handler($severity, $message, $filepath, $line)
|
||||||
|
{
|
||||||
|
// We don't bother with "strict" notices since they tend to fill up
|
||||||
|
// the log file with excess information that isn't normally very helpful.
|
||||||
|
// For example, if you are running PHP 5 and you use version 4 style
|
||||||
|
// class functions (without prefixes like "public", "private", etc.)
|
||||||
|
// you'll get notices telling you that these have been deprecated.
|
||||||
|
if ($severity == E_STRICT)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_error =& load_class('Exceptions', 'core');
|
||||||
|
|
||||||
|
// Should we display the error? We'll get the current error_reporting
|
||||||
|
// level and add its bits with the severity bits to find out.
|
||||||
|
if (($severity & error_reporting()) == $severity)
|
||||||
|
{
|
||||||
|
$_error->show_php_error($severity, $message, $filepath, $line);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Should we log the error? No? We're done...
|
||||||
|
if (config_item('log_threshold') == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$_error->log_exception($severity, $message, $filepath, $line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove Invisible Characters
|
||||||
|
*
|
||||||
|
* This prevents sandwiching null characters
|
||||||
|
* between ascii characters, like Java\0script.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('remove_invisible_characters'))
|
||||||
|
{
|
||||||
|
function remove_invisible_characters($str, $url_encoded = TRUE)
|
||||||
|
{
|
||||||
|
$non_displayables = array();
|
||||||
|
|
||||||
|
// every control character except newline (dec 10)
|
||||||
|
// carriage return (dec 13), and horizontal tab (dec 09)
|
||||||
|
|
||||||
|
if ($url_encoded)
|
||||||
|
{
|
||||||
|
$non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15
|
||||||
|
$non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31
|
||||||
|
}
|
||||||
|
|
||||||
|
$non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
$str = preg_replace($non_displayables, '', $str, -1, $count);
|
||||||
|
}
|
||||||
|
while ($count);
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns HTML escaped variable
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param mixed
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
if ( ! function_exists('html_escape'))
|
||||||
|
{
|
||||||
|
function html_escape($var)
|
||||||
|
{
|
||||||
|
if (is_array($var))
|
||||||
|
{
|
||||||
|
return array_map('html_escape', $var);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return htmlspecialchars($var, ENT_QUOTES, config_item('charset'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file Common.php */
|
||||||
|
/* Location: ./system/core/Common.php */
|
379
system/core/Config.php
Normal file
379
system/core/Config.php
Normal file
@ -0,0 +1,379 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter Config Class
|
||||||
|
*
|
||||||
|
* This class contains functions that enable config files to be managed
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category Libraries
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/libraries/config.html
|
||||||
|
*/
|
||||||
|
class CI_Config {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of all loaded config values
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
var $config = array();
|
||||||
|
/**
|
||||||
|
* List of all loaded config files
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
var $is_loaded = array();
|
||||||
|
/**
|
||||||
|
* List of paths to search when trying to load a config file
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
var $_config_paths = array(APPPATH);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* Sets the $config data from the primary config.php file as a class variable
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the config file name
|
||||||
|
* @param boolean if configuration values should be loaded into their own section
|
||||||
|
* @param boolean true if errors should just return false, false if an error message should be displayed
|
||||||
|
* @return boolean if the file was successfully loaded or not
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
$this->config =& get_config();
|
||||||
|
log_message('debug', "Config Class Initialized");
|
||||||
|
|
||||||
|
// Set the base_url automatically if none was provided
|
||||||
|
if ($this->config['base_url'] == '')
|
||||||
|
{
|
||||||
|
if (isset($_SERVER['HTTP_HOST']))
|
||||||
|
{
|
||||||
|
$base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
|
||||||
|
$base_url .= '://'. $_SERVER['HTTP_HOST'];
|
||||||
|
$base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$base_url = 'http://localhost/';
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->set_item('base_url', $base_url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load Config File
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the config file name
|
||||||
|
* @param boolean if configuration values should be loaded into their own section
|
||||||
|
* @param boolean true if errors should just return false, false if an error message should be displayed
|
||||||
|
* @return boolean if the file was loaded correctly
|
||||||
|
*/
|
||||||
|
function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
|
||||||
|
{
|
||||||
|
$file = ($file == '') ? 'config' : str_replace('.php', '', $file);
|
||||||
|
$found = FALSE;
|
||||||
|
$loaded = FALSE;
|
||||||
|
|
||||||
|
$check_locations = defined('ENVIRONMENT')
|
||||||
|
? array(ENVIRONMENT.'/'.$file, $file)
|
||||||
|
: array($file);
|
||||||
|
|
||||||
|
foreach ($this->_config_paths as $path)
|
||||||
|
{
|
||||||
|
foreach ($check_locations as $location)
|
||||||
|
{
|
||||||
|
$file_path = $path.'config/'.$location.'.php';
|
||||||
|
|
||||||
|
if (in_array($file_path, $this->is_loaded, TRUE))
|
||||||
|
{
|
||||||
|
$loaded = TRUE;
|
||||||
|
continue 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file_exists($file_path))
|
||||||
|
{
|
||||||
|
$found = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($found === FALSE)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
include($file_path);
|
||||||
|
|
||||||
|
if ( ! isset($config) OR ! is_array($config))
|
||||||
|
{
|
||||||
|
if ($fail_gracefully === TRUE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($use_sections === TRUE)
|
||||||
|
{
|
||||||
|
if (isset($this->config[$file]))
|
||||||
|
{
|
||||||
|
$this->config[$file] = array_merge($this->config[$file], $config);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->config[$file] = $config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->config = array_merge($this->config, $config);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->is_loaded[] = $file_path;
|
||||||
|
unset($config);
|
||||||
|
|
||||||
|
$loaded = TRUE;
|
||||||
|
log_message('debug', 'Config file loaded: '.$file_path);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($loaded === FALSE)
|
||||||
|
{
|
||||||
|
if ($fail_gracefully === TRUE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
show_error('The configuration file '.$file.'.php does not exist.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a config file item
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the config item name
|
||||||
|
* @param string the index name
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function item($item, $index = '')
|
||||||
|
{
|
||||||
|
if ($index == '')
|
||||||
|
{
|
||||||
|
if ( ! isset($this->config[$item]))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$pref = $this->config[$item];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( ! isset($this->config[$index]))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! isset($this->config[$index][$item]))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$pref = $this->config[$index][$item];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $pref;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a config file item - adds slash after item (if item is not empty)
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the config item name
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function slash_item($item)
|
||||||
|
{
|
||||||
|
if ( ! isset($this->config[$item]))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if( trim($this->config[$item]) == '')
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtrim($this->config[$item], '/').'/';
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Site URL
|
||||||
|
* Returns base_url . index_page [. uri_string]
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the URI string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function site_url($uri = '')
|
||||||
|
{
|
||||||
|
if ($uri == '')
|
||||||
|
{
|
||||||
|
return $this->slash_item('base_url').$this->item('index_page');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->item('enable_query_strings') == FALSE)
|
||||||
|
{
|
||||||
|
$suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix');
|
||||||
|
return $this->slash_item('base_url').$this->slash_item('index_page').$this->_uri_string($uri).$suffix;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return $this->slash_item('base_url').$this->item('index_page').'?'.$this->_uri_string($uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base URL
|
||||||
|
* Returns base_url [. uri_string]
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string $uri
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function base_url($uri = '')
|
||||||
|
{
|
||||||
|
return $this->slash_item('base_url').ltrim($this->_uri_string($uri), '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build URI string for use in Config::site_url() and Config::base_url()
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param $uri
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _uri_string($uri)
|
||||||
|
{
|
||||||
|
if ($this->item('enable_query_strings') == FALSE)
|
||||||
|
{
|
||||||
|
if (is_array($uri))
|
||||||
|
{
|
||||||
|
$uri = implode('/', $uri);
|
||||||
|
}
|
||||||
|
$uri = trim($uri, '/');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (is_array($uri))
|
||||||
|
{
|
||||||
|
$i = 0;
|
||||||
|
$str = '';
|
||||||
|
foreach ($uri as $key => $val)
|
||||||
|
{
|
||||||
|
$prefix = ($i == 0) ? '' : '&';
|
||||||
|
$str .= $prefix.$key.'='.$val;
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
$uri = $str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* System URL
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function system_url()
|
||||||
|
{
|
||||||
|
$x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH));
|
||||||
|
return $this->slash_item('base_url').end($x).'/';
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a config file item
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the config item key
|
||||||
|
* @param string the config item value
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function set_item($item, $value)
|
||||||
|
{
|
||||||
|
$this->config[$item] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assign to Config
|
||||||
|
*
|
||||||
|
* This function is called by the front controller (CodeIgniter.php)
|
||||||
|
* after the Config class is instantiated. It permits config items
|
||||||
|
* to be assigned or overriden by variables contained in the index.php file
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param array
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _assign_to_config($items = array())
|
||||||
|
{
|
||||||
|
if (is_array($items))
|
||||||
|
{
|
||||||
|
foreach ($items as $key => $val)
|
||||||
|
{
|
||||||
|
$this->set_item($key, $val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// END CI_Config class
|
||||||
|
|
||||||
|
/* End of file Config.php */
|
||||||
|
/* Location: ./system/core/Config.php */
|
64
system/core/Controller.php
Normal file
64
system/core/Controller.php
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter Application Controller Class
|
||||||
|
*
|
||||||
|
* This class object is the super class that every library in
|
||||||
|
* CodeIgniter will be assigned to.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category Libraries
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/general/controllers.html
|
||||||
|
*/
|
||||||
|
class CI_Controller {
|
||||||
|
|
||||||
|
private static $instance;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
self::$instance =& $this;
|
||||||
|
|
||||||
|
// Assign all the class objects that were instantiated by the
|
||||||
|
// bootstrap file (CodeIgniter.php) to local class variables
|
||||||
|
// so that CI can run as one big super object.
|
||||||
|
foreach (is_loaded() as $var => $class)
|
||||||
|
{
|
||||||
|
$this->$var =& load_class($class);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->load =& load_class('Loader', 'core');
|
||||||
|
|
||||||
|
$this->load->initialize();
|
||||||
|
|
||||||
|
log_message('debug', "Controller Class Initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function &get_instance()
|
||||||
|
{
|
||||||
|
return self::$instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// END Controller class
|
||||||
|
|
||||||
|
/* End of file Controller.php */
|
||||||
|
/* Location: ./system/core/Controller.php */
|
193
system/core/Exceptions.php
Normal file
193
system/core/Exceptions.php
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exceptions Class
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category Exceptions
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/libraries/exceptions.html
|
||||||
|
*/
|
||||||
|
class CI_Exceptions {
|
||||||
|
var $action;
|
||||||
|
var $severity;
|
||||||
|
var $message;
|
||||||
|
var $filename;
|
||||||
|
var $line;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Nesting level of the output buffering mechanism
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $ob_level;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List if available error levels
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $levels = array(
|
||||||
|
E_ERROR => 'Error',
|
||||||
|
E_WARNING => 'Warning',
|
||||||
|
E_PARSE => 'Parsing Error',
|
||||||
|
E_NOTICE => 'Notice',
|
||||||
|
E_CORE_ERROR => 'Core Error',
|
||||||
|
E_CORE_WARNING => 'Core Warning',
|
||||||
|
E_COMPILE_ERROR => 'Compile Error',
|
||||||
|
E_COMPILE_WARNING => 'Compile Warning',
|
||||||
|
E_USER_ERROR => 'User Error',
|
||||||
|
E_USER_WARNING => 'User Warning',
|
||||||
|
E_USER_NOTICE => 'User Notice',
|
||||||
|
E_STRICT => 'Runtime Notice'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->ob_level = ob_get_level();
|
||||||
|
// Note: Do not log messages from this constructor.
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exception Logger
|
||||||
|
*
|
||||||
|
* This function logs PHP generated error messages
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the error severity
|
||||||
|
* @param string the error string
|
||||||
|
* @param string the error filepath
|
||||||
|
* @param string the error line number
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function log_exception($severity, $message, $filepath, $line)
|
||||||
|
{
|
||||||
|
$severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];
|
||||||
|
|
||||||
|
log_message('error', 'Severity: '.$severity.' --> '.$message. ' '.$filepath.' '.$line, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 404 Page Not Found Handler
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the page
|
||||||
|
* @param bool log error yes/no
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function show_404($page = '', $log_error = TRUE)
|
||||||
|
{
|
||||||
|
$heading = "404 Page Not Found";
|
||||||
|
$message = "The page you requested was not found.";
|
||||||
|
|
||||||
|
// By default we log this, but allow a dev to skip it
|
||||||
|
if ($log_error)
|
||||||
|
{
|
||||||
|
log_message('error', '404 Page Not Found --> '.$page);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo $this->show_error($heading, $message, 'error_404', 404);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* General Error Page
|
||||||
|
*
|
||||||
|
* This function takes an error message as input
|
||||||
|
* (either as a string or an array) and displays
|
||||||
|
* it using the specified template.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the heading
|
||||||
|
* @param string the message
|
||||||
|
* @param string the template name
|
||||||
|
* @param int the status code
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function show_error($heading, $message, $template = 'error_general', $status_code = 500)
|
||||||
|
{
|
||||||
|
set_status_header($status_code);
|
||||||
|
|
||||||
|
$message = '<p>'.implode('</p><p>', ( ! is_array($message)) ? array($message) : $message).'</p>';
|
||||||
|
|
||||||
|
if (ob_get_level() > $this->ob_level + 1)
|
||||||
|
{
|
||||||
|
ob_end_flush();
|
||||||
|
}
|
||||||
|
ob_start();
|
||||||
|
include(APPPATH.'errors/'.$template.'.php');
|
||||||
|
$buffer = ob_get_contents();
|
||||||
|
ob_end_clean();
|
||||||
|
return $buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Native PHP error handler
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the error severity
|
||||||
|
* @param string the error string
|
||||||
|
* @param string the error filepath
|
||||||
|
* @param string the error line number
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function show_php_error($severity, $message, $filepath, $line)
|
||||||
|
{
|
||||||
|
$severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];
|
||||||
|
|
||||||
|
$filepath = str_replace("\\", "/", $filepath);
|
||||||
|
|
||||||
|
// For safety reasons we do not show the full file path
|
||||||
|
if (FALSE !== strpos($filepath, '/'))
|
||||||
|
{
|
||||||
|
$x = explode('/', $filepath);
|
||||||
|
$filepath = $x[count($x)-2].'/'.end($x);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ob_get_level() > $this->ob_level + 1)
|
||||||
|
{
|
||||||
|
ob_end_flush();
|
||||||
|
}
|
||||||
|
ob_start();
|
||||||
|
include(APPPATH.'errors/error_php.php');
|
||||||
|
$buffer = ob_get_contents();
|
||||||
|
ob_end_clean();
|
||||||
|
echo $buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
// END Exceptions Class
|
||||||
|
|
||||||
|
/* End of file Exceptions.php */
|
||||||
|
/* Location: ./system/core/Exceptions.php */
|
248
system/core/Hooks.php
Normal file
248
system/core/Hooks.php
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter Hooks Class
|
||||||
|
*
|
||||||
|
* Provides a mechanism to extend the base system without hacking.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category Libraries
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/libraries/encryption.html
|
||||||
|
*/
|
||||||
|
class CI_Hooks {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines wether hooks are enabled
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
var $enabled = FALSE;
|
||||||
|
/**
|
||||||
|
* List of all hooks set in config/hooks.php
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
var $hooks = array();
|
||||||
|
/**
|
||||||
|
* Determines wether hook is in progress, used to prevent infinte loops
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
var $in_progress = FALSE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
$this->_initialize();
|
||||||
|
log_message('debug', "Hooks Class Initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the Hooks Preferences
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _initialize()
|
||||||
|
{
|
||||||
|
$CFG =& load_class('Config', 'core');
|
||||||
|
|
||||||
|
// If hooks are not enabled in the config file
|
||||||
|
// there is nothing else to do
|
||||||
|
|
||||||
|
if ($CFG->item('enable_hooks') == FALSE)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grab the "hooks" definition file.
|
||||||
|
// If there are no hooks, we're done.
|
||||||
|
|
||||||
|
if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'))
|
||||||
|
{
|
||||||
|
include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php');
|
||||||
|
}
|
||||||
|
elseif (is_file(APPPATH.'config/hooks.php'))
|
||||||
|
{
|
||||||
|
include(APPPATH.'config/hooks.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( ! isset($hook) OR ! is_array($hook))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->hooks =& $hook;
|
||||||
|
$this->enabled = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call Hook
|
||||||
|
*
|
||||||
|
* Calls a particular hook
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the hook name
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function _call_hook($which = '')
|
||||||
|
{
|
||||||
|
if ( ! $this->enabled OR ! isset($this->hooks[$which]))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($this->hooks[$which][0]) AND is_array($this->hooks[$which][0]))
|
||||||
|
{
|
||||||
|
foreach ($this->hooks[$which] as $val)
|
||||||
|
{
|
||||||
|
$this->_run_hook($val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->_run_hook($this->hooks[$which]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run Hook
|
||||||
|
*
|
||||||
|
* Runs a particular hook
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param array the hook details
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _run_hook($data)
|
||||||
|
{
|
||||||
|
if ( ! is_array($data))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------
|
||||||
|
// Safety - Prevents run-away loops
|
||||||
|
// -----------------------------------
|
||||||
|
|
||||||
|
// If the script being called happens to have the same
|
||||||
|
// hook call within it a loop can happen
|
||||||
|
|
||||||
|
if ($this->in_progress == TRUE)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------
|
||||||
|
// Set file path
|
||||||
|
// -----------------------------------
|
||||||
|
|
||||||
|
if ( ! isset($data['filepath']) OR ! isset($data['filename']))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$filepath = APPPATH.$data['filepath'].'/'.$data['filename'];
|
||||||
|
|
||||||
|
if ( ! file_exists($filepath))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------
|
||||||
|
// Set class/function name
|
||||||
|
// -----------------------------------
|
||||||
|
|
||||||
|
$class = FALSE;
|
||||||
|
$function = FALSE;
|
||||||
|
$params = '';
|
||||||
|
|
||||||
|
if (isset($data['class']) AND $data['class'] != '')
|
||||||
|
{
|
||||||
|
$class = $data['class'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($data['function']))
|
||||||
|
{
|
||||||
|
$function = $data['function'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($data['params']))
|
||||||
|
{
|
||||||
|
$params = $data['params'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($class === FALSE AND $function === FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------
|
||||||
|
// Set the in_progress flag
|
||||||
|
// -----------------------------------
|
||||||
|
|
||||||
|
$this->in_progress = TRUE;
|
||||||
|
|
||||||
|
// -----------------------------------
|
||||||
|
// Call the requested class and/or function
|
||||||
|
// -----------------------------------
|
||||||
|
|
||||||
|
if ($class !== FALSE)
|
||||||
|
{
|
||||||
|
if ( ! class_exists($class))
|
||||||
|
{
|
||||||
|
require($filepath);
|
||||||
|
}
|
||||||
|
|
||||||
|
$HOOK = new $class;
|
||||||
|
$HOOK->$function($params);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( ! function_exists($function))
|
||||||
|
{
|
||||||
|
require($filepath);
|
||||||
|
}
|
||||||
|
|
||||||
|
$function($params);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->in_progress = FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// END CI_Hooks class
|
||||||
|
|
||||||
|
/* End of file Hooks.php */
|
||||||
|
/* Location: ./system/core/Hooks.php */
|
849
system/core/Input.php
Normal file
849
system/core/Input.php
Normal file
@ -0,0 +1,849 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Input Class
|
||||||
|
*
|
||||||
|
* Pre-processes global input data for security
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category Input
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/libraries/input.html
|
||||||
|
*/
|
||||||
|
class CI_Input {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IP address of the current user
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
var $ip_address = FALSE;
|
||||||
|
/**
|
||||||
|
* user agent (web browser) being used by the current user
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
var $user_agent = FALSE;
|
||||||
|
/**
|
||||||
|
* If FALSE, then $_GET will be set to an empty array
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
var $_allow_get_array = TRUE;
|
||||||
|
/**
|
||||||
|
* If TRUE, then newlines are standardized
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
var $_standardize_newlines = TRUE;
|
||||||
|
/**
|
||||||
|
* Determines whether the XSS filter is always active when GET, POST or COOKIE data is encountered
|
||||||
|
* Set automatically based on config setting
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
var $_enable_xss = FALSE;
|
||||||
|
/**
|
||||||
|
* Enables a CSRF cookie token to be set.
|
||||||
|
* Set automatically based on config setting
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
var $_enable_csrf = FALSE;
|
||||||
|
/**
|
||||||
|
* List of all HTTP request headers
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $headers = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* Sets whether to globally enable the XSS processing
|
||||||
|
* and whether to allow the $_GET array
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
log_message('debug', "Input Class Initialized");
|
||||||
|
|
||||||
|
$this->_allow_get_array = (config_item('allow_get_array') === TRUE);
|
||||||
|
$this->_enable_xss = (config_item('global_xss_filtering') === TRUE);
|
||||||
|
$this->_enable_csrf = (config_item('csrf_protection') === TRUE);
|
||||||
|
|
||||||
|
global $SEC;
|
||||||
|
$this->security =& $SEC;
|
||||||
|
|
||||||
|
// Do we need the UTF-8 class?
|
||||||
|
if (UTF8_ENABLED === TRUE)
|
||||||
|
{
|
||||||
|
global $UNI;
|
||||||
|
$this->uni =& $UNI;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sanitize global arrays
|
||||||
|
$this->_sanitize_globals();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch from array
|
||||||
|
*
|
||||||
|
* This is a helper function to retrieve values from global arrays
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param array
|
||||||
|
* @param string
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)
|
||||||
|
{
|
||||||
|
if ( ! isset($array[$index]))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($xss_clean === TRUE)
|
||||||
|
{
|
||||||
|
return $this->security->xss_clean($array[$index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $array[$index];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch an item from the GET array
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function get($index = NULL, $xss_clean = FALSE)
|
||||||
|
{
|
||||||
|
// Check if a field has been provided
|
||||||
|
if ($index === NULL AND ! empty($_GET))
|
||||||
|
{
|
||||||
|
$get = array();
|
||||||
|
|
||||||
|
// loop through the full _GET array
|
||||||
|
foreach (array_keys($_GET) as $key)
|
||||||
|
{
|
||||||
|
$get[$key] = $this->_fetch_from_array($_GET, $key, $xss_clean);
|
||||||
|
}
|
||||||
|
return $get;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_fetch_from_array($_GET, $index, $xss_clean);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch an item from the POST array
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function post($index = NULL, $xss_clean = FALSE)
|
||||||
|
{
|
||||||
|
// Check if a field has been provided
|
||||||
|
if ($index === NULL AND ! empty($_POST))
|
||||||
|
{
|
||||||
|
$post = array();
|
||||||
|
|
||||||
|
// Loop through the full _POST array and return it
|
||||||
|
foreach (array_keys($_POST) as $key)
|
||||||
|
{
|
||||||
|
$post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);
|
||||||
|
}
|
||||||
|
return $post;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_fetch_from_array($_POST, $index, $xss_clean);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch an item from either the GET array or the POST
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string The index key
|
||||||
|
* @param bool XSS cleaning
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function get_post($index = '', $xss_clean = FALSE)
|
||||||
|
{
|
||||||
|
if ( ! isset($_POST[$index]) )
|
||||||
|
{
|
||||||
|
return $this->get($index, $xss_clean);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return $this->post($index, $xss_clean);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch an item from the COOKIE array
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function cookie($index = '', $xss_clean = FALSE)
|
||||||
|
{
|
||||||
|
return $this->_fetch_from_array($_COOKIE, $index, $xss_clean);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set cookie
|
||||||
|
*
|
||||||
|
* Accepts six parameter, or you can submit an associative
|
||||||
|
* array in the first parameter containing all the values.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param mixed
|
||||||
|
* @param string the value of the cookie
|
||||||
|
* @param string the number of seconds until expiration
|
||||||
|
* @param string the cookie domain. Usually: .yourdomain.com
|
||||||
|
* @param string the cookie path
|
||||||
|
* @param string the cookie prefix
|
||||||
|
* @param bool true makes the cookie secure
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE)
|
||||||
|
{
|
||||||
|
if (is_array($name))
|
||||||
|
{
|
||||||
|
// always leave 'name' in last place, as the loop will break otherwise, due to $$item
|
||||||
|
foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'name') as $item)
|
||||||
|
{
|
||||||
|
if (isset($name[$item]))
|
||||||
|
{
|
||||||
|
$$item = $name[$item];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($prefix == '' AND config_item('cookie_prefix') != '')
|
||||||
|
{
|
||||||
|
$prefix = config_item('cookie_prefix');
|
||||||
|
}
|
||||||
|
if ($domain == '' AND config_item('cookie_domain') != '')
|
||||||
|
{
|
||||||
|
$domain = config_item('cookie_domain');
|
||||||
|
}
|
||||||
|
if ($path == '/' AND config_item('cookie_path') != '/')
|
||||||
|
{
|
||||||
|
$path = config_item('cookie_path');
|
||||||
|
}
|
||||||
|
if ($secure == FALSE AND config_item('cookie_secure') != FALSE)
|
||||||
|
{
|
||||||
|
$secure = config_item('cookie_secure');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! is_numeric($expire))
|
||||||
|
{
|
||||||
|
$expire = time() - 86500;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$expire = ($expire > 0) ? time() + $expire : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
setcookie($prefix.$name, $value, $expire, $path, $domain, $secure);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch an item from the SERVER array
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function server($index = '', $xss_clean = FALSE)
|
||||||
|
{
|
||||||
|
return $this->_fetch_from_array($_SERVER, $index, $xss_clean);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch the IP Address
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function ip_address()
|
||||||
|
{
|
||||||
|
if ($this->ip_address !== FALSE)
|
||||||
|
{
|
||||||
|
return $this->ip_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
$proxy_ips = config_item('proxy_ips');
|
||||||
|
if ( ! empty($proxy_ips))
|
||||||
|
{
|
||||||
|
$proxy_ips = explode(',', str_replace(' ', '', $proxy_ips));
|
||||||
|
foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP') as $header)
|
||||||
|
{
|
||||||
|
if (($spoof = $this->server($header)) !== FALSE)
|
||||||
|
{
|
||||||
|
// Some proxies typically list the whole chain of IP
|
||||||
|
// addresses through which the client has reached us.
|
||||||
|
// e.g. client_ip, proxy_ip1, proxy_ip2, etc.
|
||||||
|
if (strpos($spoof, ',') !== FALSE)
|
||||||
|
{
|
||||||
|
$spoof = explode(',', $spoof, 2);
|
||||||
|
$spoof = $spoof[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $this->valid_ip($spoof))
|
||||||
|
{
|
||||||
|
$spoof = FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->ip_address = ($spoof !== FALSE && in_array($_SERVER['REMOTE_ADDR'], $proxy_ips, TRUE))
|
||||||
|
? $spoof : $_SERVER['REMOTE_ADDR'];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->ip_address = $_SERVER['REMOTE_ADDR'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $this->valid_ip($this->ip_address))
|
||||||
|
{
|
||||||
|
$this->ip_address = '0.0.0.0';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->ip_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate IP Address
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param string ipv4 or ipv6
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function valid_ip($ip, $which = '')
|
||||||
|
{
|
||||||
|
$which = strtolower($which);
|
||||||
|
|
||||||
|
// First check if filter_var is available
|
||||||
|
if (is_callable('filter_var'))
|
||||||
|
{
|
||||||
|
switch ($which) {
|
||||||
|
case 'ipv4':
|
||||||
|
$flag = FILTER_FLAG_IPV4;
|
||||||
|
break;
|
||||||
|
case 'ipv6':
|
||||||
|
$flag = FILTER_FLAG_IPV6;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$flag = '';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (bool) filter_var($ip, FILTER_VALIDATE_IP, $flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($which !== 'ipv6' && $which !== 'ipv4')
|
||||||
|
{
|
||||||
|
if (strpos($ip, ':') !== FALSE)
|
||||||
|
{
|
||||||
|
$which = 'ipv6';
|
||||||
|
}
|
||||||
|
elseif (strpos($ip, '.') !== FALSE)
|
||||||
|
{
|
||||||
|
$which = 'ipv4';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$func = '_valid_'.$which;
|
||||||
|
return $this->$func($ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate IPv4 Address
|
||||||
|
*
|
||||||
|
* Updated version suggested by Geert De Deckere
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param string
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
protected function _valid_ipv4($ip)
|
||||||
|
{
|
||||||
|
$ip_segments = explode('.', $ip);
|
||||||
|
|
||||||
|
// Always 4 segments needed
|
||||||
|
if (count($ip_segments) !== 4)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
// IP can not start with 0
|
||||||
|
if ($ip_segments[0][0] == '0')
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check each segment
|
||||||
|
foreach ($ip_segments as $segment)
|
||||||
|
{
|
||||||
|
// IP segments must be digits and can not be
|
||||||
|
// longer than 3 digits or greater then 255
|
||||||
|
if ($segment == '' OR preg_match("/[^0-9]/", $segment) OR $segment > 255 OR strlen($segment) > 3)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate IPv6 Address
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param string
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
protected function _valid_ipv6($str)
|
||||||
|
{
|
||||||
|
// 8 groups, separated by :
|
||||||
|
// 0-ffff per group
|
||||||
|
// one set of consecutive 0 groups can be collapsed to ::
|
||||||
|
|
||||||
|
$groups = 8;
|
||||||
|
$collapsed = FALSE;
|
||||||
|
|
||||||
|
$chunks = array_filter(
|
||||||
|
preg_split('/(:{1,2})/', $str, NULL, PREG_SPLIT_DELIM_CAPTURE)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Rule out easy nonsense
|
||||||
|
if (current($chunks) == ':' OR end($chunks) == ':')
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PHP supports IPv4-mapped IPv6 addresses, so we'll expect those as well
|
||||||
|
if (strpos(end($chunks), '.') !== FALSE)
|
||||||
|
{
|
||||||
|
$ipv4 = array_pop($chunks);
|
||||||
|
|
||||||
|
if ( ! $this->_valid_ipv4($ipv4))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$groups--;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ($seg = array_pop($chunks))
|
||||||
|
{
|
||||||
|
if ($seg[0] == ':')
|
||||||
|
{
|
||||||
|
if (--$groups == 0)
|
||||||
|
{
|
||||||
|
return FALSE; // too many groups
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen($seg) > 2)
|
||||||
|
{
|
||||||
|
return FALSE; // long separator
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($seg == '::')
|
||||||
|
{
|
||||||
|
if ($collapsed)
|
||||||
|
{
|
||||||
|
return FALSE; // multiple collapsed
|
||||||
|
}
|
||||||
|
|
||||||
|
$collapsed = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif (preg_match("/[^0-9a-f]/i", $seg) OR strlen($seg) > 4)
|
||||||
|
{
|
||||||
|
return FALSE; // invalid segment
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $collapsed OR $groups == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User Agent
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function user_agent()
|
||||||
|
{
|
||||||
|
if ($this->user_agent !== FALSE)
|
||||||
|
{
|
||||||
|
return $this->user_agent;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->user_agent = ( ! isset($_SERVER['HTTP_USER_AGENT'])) ? FALSE : $_SERVER['HTTP_USER_AGENT'];
|
||||||
|
|
||||||
|
return $this->user_agent;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sanitize Globals
|
||||||
|
*
|
||||||
|
* This function does the following:
|
||||||
|
*
|
||||||
|
* Unsets $_GET data (if query strings are not enabled)
|
||||||
|
*
|
||||||
|
* Unsets all globals if register_globals is enabled
|
||||||
|
*
|
||||||
|
* Standardizes newline characters to \n
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _sanitize_globals()
|
||||||
|
{
|
||||||
|
// It would be "wrong" to unset any of these GLOBALS.
|
||||||
|
$protected = array('_SERVER', '_GET', '_POST', '_FILES', '_REQUEST',
|
||||||
|
'_SESSION', '_ENV', 'GLOBALS', 'HTTP_RAW_POST_DATA',
|
||||||
|
'system_folder', 'application_folder', 'BM', 'EXT',
|
||||||
|
'CFG', 'URI', 'RTR', 'OUT', 'IN');
|
||||||
|
|
||||||
|
// Unset globals for securiy.
|
||||||
|
// This is effectively the same as register_globals = off
|
||||||
|
foreach (array($_GET, $_POST, $_COOKIE) as $global)
|
||||||
|
{
|
||||||
|
if ( ! is_array($global))
|
||||||
|
{
|
||||||
|
if ( ! in_array($global, $protected))
|
||||||
|
{
|
||||||
|
global $$global;
|
||||||
|
$$global = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach ($global as $key => $val)
|
||||||
|
{
|
||||||
|
if ( ! in_array($key, $protected))
|
||||||
|
{
|
||||||
|
global $$key;
|
||||||
|
$$key = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is $_GET data allowed? If not we'll set the $_GET to an empty array
|
||||||
|
if ($this->_allow_get_array == FALSE)
|
||||||
|
{
|
||||||
|
$_GET = array();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (is_array($_GET) AND count($_GET) > 0)
|
||||||
|
{
|
||||||
|
foreach ($_GET as $key => $val)
|
||||||
|
{
|
||||||
|
$_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean $_POST Data
|
||||||
|
if (is_array($_POST) AND count($_POST) > 0)
|
||||||
|
{
|
||||||
|
foreach ($_POST as $key => $val)
|
||||||
|
{
|
||||||
|
$_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean $_COOKIE Data
|
||||||
|
if (is_array($_COOKIE) AND count($_COOKIE) > 0)
|
||||||
|
{
|
||||||
|
// Also get rid of specially treated cookies that might be set by a server
|
||||||
|
// or silly application, that are of no use to a CI application anyway
|
||||||
|
// but that when present will trip our 'Disallowed Key Characters' alarm
|
||||||
|
// http://www.ietf.org/rfc/rfc2109.txt
|
||||||
|
// note that the key names below are single quoted strings, and are not PHP variables
|
||||||
|
unset($_COOKIE['$Version']);
|
||||||
|
unset($_COOKIE['$Path']);
|
||||||
|
unset($_COOKIE['$Domain']);
|
||||||
|
|
||||||
|
foreach ($_COOKIE as $key => $val)
|
||||||
|
{
|
||||||
|
$_COOKIE[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sanitize PHP_SELF
|
||||||
|
$_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']);
|
||||||
|
|
||||||
|
|
||||||
|
// CSRF Protection check on HTTP requests
|
||||||
|
if ($this->_enable_csrf == TRUE && ! $this->is_cli_request())
|
||||||
|
{
|
||||||
|
$this->security->csrf_verify();
|
||||||
|
}
|
||||||
|
|
||||||
|
log_message('debug', "Global POST and COOKIE data sanitized");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean Input Data
|
||||||
|
*
|
||||||
|
* This is a helper function. It escapes data and
|
||||||
|
* standardizes newline characters to \n
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _clean_input_data($str)
|
||||||
|
{
|
||||||
|
if (is_array($str))
|
||||||
|
{
|
||||||
|
$new_array = array();
|
||||||
|
foreach ($str as $key => $val)
|
||||||
|
{
|
||||||
|
$new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
|
||||||
|
}
|
||||||
|
return $new_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We strip slashes if magic quotes is on to keep things consistent
|
||||||
|
|
||||||
|
NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and
|
||||||
|
it will probably not exist in future versions at all.
|
||||||
|
*/
|
||||||
|
if ( ! is_php('5.4') && get_magic_quotes_gpc())
|
||||||
|
{
|
||||||
|
$str = stripslashes($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean UTF-8 if supported
|
||||||
|
if (UTF8_ENABLED === TRUE)
|
||||||
|
{
|
||||||
|
$str = $this->uni->clean_string($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove control characters
|
||||||
|
$str = remove_invisible_characters($str);
|
||||||
|
|
||||||
|
// Should we filter the input data?
|
||||||
|
if ($this->_enable_xss === TRUE)
|
||||||
|
{
|
||||||
|
$str = $this->security->xss_clean($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Standardize newlines if needed
|
||||||
|
if ($this->_standardize_newlines == TRUE)
|
||||||
|
{
|
||||||
|
if (strpos($str, "\r") !== FALSE)
|
||||||
|
{
|
||||||
|
$str = str_replace(array("\r\n", "\r", "\r\n\n"), PHP_EOL, $str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean Keys
|
||||||
|
*
|
||||||
|
* This is a helper function. To prevent malicious users
|
||||||
|
* from trying to exploit keys we make sure that keys are
|
||||||
|
* only named with alpha-numeric text and a few other items.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _clean_input_keys($str)
|
||||||
|
{
|
||||||
|
if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
|
||||||
|
{
|
||||||
|
exit('Disallowed Key Characters.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean UTF-8 if supported
|
||||||
|
if (UTF8_ENABLED === TRUE)
|
||||||
|
{
|
||||||
|
$str = $this->uni->clean_string($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request Headers
|
||||||
|
*
|
||||||
|
* In Apache, you can simply call apache_request_headers(), however for
|
||||||
|
* people running other webservers the function is undefined.
|
||||||
|
*
|
||||||
|
* @param bool XSS cleaning
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function request_headers($xss_clean = FALSE)
|
||||||
|
{
|
||||||
|
// Look at Apache go!
|
||||||
|
if (function_exists('apache_request_headers'))
|
||||||
|
{
|
||||||
|
$headers = apache_request_headers();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$headers['Content-Type'] = (isset($_SERVER['CONTENT_TYPE'])) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE');
|
||||||
|
|
||||||
|
foreach ($_SERVER as $key => $val)
|
||||||
|
{
|
||||||
|
if (strncmp($key, 'HTTP_', 5) === 0)
|
||||||
|
{
|
||||||
|
$headers[substr($key, 5)] = $this->_fetch_from_array($_SERVER, $key, $xss_clean);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// take SOME_HEADER and turn it into Some-Header
|
||||||
|
foreach ($headers as $key => $val)
|
||||||
|
{
|
||||||
|
$key = str_replace('_', ' ', strtolower($key));
|
||||||
|
$key = str_replace(' ', '-', ucwords($key));
|
||||||
|
|
||||||
|
$this->headers[$key] = $val;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Request Header
|
||||||
|
*
|
||||||
|
* Returns the value of a single member of the headers class member
|
||||||
|
*
|
||||||
|
* @param string array key for $this->headers
|
||||||
|
* @param boolean XSS Clean or not
|
||||||
|
* @return mixed FALSE on failure, string on success
|
||||||
|
*/
|
||||||
|
public function get_request_header($index, $xss_clean = FALSE)
|
||||||
|
{
|
||||||
|
if (empty($this->headers))
|
||||||
|
{
|
||||||
|
$this->request_headers();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! isset($this->headers[$index]))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($xss_clean === TRUE)
|
||||||
|
{
|
||||||
|
return $this->security->xss_clean($this->headers[$index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->headers[$index];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is ajax Request?
|
||||||
|
*
|
||||||
|
* Test to see if a request contains the HTTP_X_REQUESTED_WITH header
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function is_ajax_request()
|
||||||
|
{
|
||||||
|
return ($this->server('HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is cli Request?
|
||||||
|
*
|
||||||
|
* Test to see if a request was made from the command line
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function is_cli_request()
|
||||||
|
{
|
||||||
|
return (php_sapi_name() === 'cli' OR defined('STDIN'));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file Input.php */
|
||||||
|
/* Location: ./system/core/Input.php */
|
160
system/core/Lang.php
Normal file
160
system/core/Lang.php
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Language Class
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category Language
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/libraries/language.html
|
||||||
|
*/
|
||||||
|
class CI_Lang {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of translations
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
var $language = array();
|
||||||
|
/**
|
||||||
|
* List of loaded language files
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
var $is_loaded = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
log_message('debug', "Language Class Initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a language file
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param mixed the name of the language file to be loaded. Can be an array
|
||||||
|
* @param string the language (english, etc.)
|
||||||
|
* @param bool return loaded array of translations
|
||||||
|
* @param bool add suffix to $langfile
|
||||||
|
* @param string alternative path to look for language file
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function load($langfile = '', $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '')
|
||||||
|
{
|
||||||
|
$langfile = str_replace('.php', '', $langfile);
|
||||||
|
|
||||||
|
if ($add_suffix == TRUE)
|
||||||
|
{
|
||||||
|
$langfile = str_replace('_lang.', '', $langfile).'_lang';
|
||||||
|
}
|
||||||
|
|
||||||
|
$langfile .= '.php';
|
||||||
|
|
||||||
|
if (in_array($langfile, $this->is_loaded, TRUE))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$config =& get_config();
|
||||||
|
|
||||||
|
if ($idiom == '')
|
||||||
|
{
|
||||||
|
$deft_lang = ( ! isset($config['language'])) ? 'english' : $config['language'];
|
||||||
|
$idiom = ($deft_lang == '') ? 'english' : $deft_lang;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine where the language file is and load it
|
||||||
|
if ($alt_path != '' && file_exists($alt_path.'language/'.$idiom.'/'.$langfile))
|
||||||
|
{
|
||||||
|
include($alt_path.'language/'.$idiom.'/'.$langfile);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$found = FALSE;
|
||||||
|
|
||||||
|
foreach (get_instance()->load->get_package_paths(TRUE) as $package_path)
|
||||||
|
{
|
||||||
|
if (file_exists($package_path.'language/'.$idiom.'/'.$langfile))
|
||||||
|
{
|
||||||
|
include($package_path.'language/'.$idiom.'/'.$langfile);
|
||||||
|
$found = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($found !== TRUE)
|
||||||
|
{
|
||||||
|
show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( ! isset($lang))
|
||||||
|
{
|
||||||
|
log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($return == TRUE)
|
||||||
|
{
|
||||||
|
return $lang;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->is_loaded[] = $langfile;
|
||||||
|
$this->language = array_merge($this->language, $lang);
|
||||||
|
unset($lang);
|
||||||
|
|
||||||
|
log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a single line of text from the language array
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string $line the language line
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function line($line = '')
|
||||||
|
{
|
||||||
|
$value = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line];
|
||||||
|
|
||||||
|
// Because killer robots like unicorns!
|
||||||
|
if ($value === FALSE)
|
||||||
|
{
|
||||||
|
log_message('error', 'Could not find the language line "'.$line.'"');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// END Language Class
|
||||||
|
|
||||||
|
/* End of file Lang.php */
|
||||||
|
/* Location: ./system/core/Lang.php */
|
1248
system/core/Loader.php
Normal file
1248
system/core/Loader.php
Normal file
File diff suppressed because it is too large
Load Diff
57
system/core/Model.php
Normal file
57
system/core/Model.php
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CodeIgniter Model Class
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category Libraries
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/libraries/config.html
|
||||||
|
*/
|
||||||
|
class CI_Model {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
log_message('debug', "Model Class Initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __get
|
||||||
|
*
|
||||||
|
* Allows models to access CI's loaded classes using the same
|
||||||
|
* syntax as controllers.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function __get($key)
|
||||||
|
{
|
||||||
|
$CI =& get_instance();
|
||||||
|
return $CI->$key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// END Model Class
|
||||||
|
|
||||||
|
/* End of file Model.php */
|
||||||
|
/* Location: ./system/core/Model.php */
|
574
system/core/Output.php
Normal file
574
system/core/Output.php
Normal file
@ -0,0 +1,574 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Output Class
|
||||||
|
*
|
||||||
|
* Responsible for sending final output to browser
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category Output
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/libraries/output.html
|
||||||
|
*/
|
||||||
|
class CI_Output {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Current output string
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $final_output;
|
||||||
|
/**
|
||||||
|
* Cache expiration time
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $cache_expiration = 0;
|
||||||
|
/**
|
||||||
|
* List of server headers
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $headers = array();
|
||||||
|
/**
|
||||||
|
* List of mime types
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $mime_types = array();
|
||||||
|
/**
|
||||||
|
* Determines wether profiler is enabled
|
||||||
|
*
|
||||||
|
* @var book
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $enable_profiler = FALSE;
|
||||||
|
/**
|
||||||
|
* Determines if output compression is enabled
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $_zlib_oc = FALSE;
|
||||||
|
/**
|
||||||
|
* List of profiler sections
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $_profiler_sections = array();
|
||||||
|
/**
|
||||||
|
* Whether or not to parse variables like {elapsed_time} and {memory_usage}
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $parse_exec_vars = TRUE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
$this->_zlib_oc = @ini_get('zlib.output_compression');
|
||||||
|
|
||||||
|
// Get mime types for later
|
||||||
|
if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'))
|
||||||
|
{
|
||||||
|
include APPPATH.'config/'.ENVIRONMENT.'/mimes.php';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
include APPPATH.'config/mimes.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$this->mime_types = $mimes;
|
||||||
|
|
||||||
|
log_message('debug', "Output Class Initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Output
|
||||||
|
*
|
||||||
|
* Returns the current output string
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function get_output()
|
||||||
|
{
|
||||||
|
return $this->final_output;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Output
|
||||||
|
*
|
||||||
|
* Sets the output string
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function set_output($output)
|
||||||
|
{
|
||||||
|
$this->final_output = $output;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append Output
|
||||||
|
*
|
||||||
|
* Appends data onto the output string
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function append_output($output)
|
||||||
|
{
|
||||||
|
if ($this->final_output == '')
|
||||||
|
{
|
||||||
|
$this->final_output = $output;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->final_output .= $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Header
|
||||||
|
*
|
||||||
|
* Lets you set a server header which will be outputted with the final display.
|
||||||
|
*
|
||||||
|
* Note: If a file is cached, headers will not be sent. We need to figure out
|
||||||
|
* how to permit header data to be saved with the cache data...
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param bool
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function set_header($header, $replace = TRUE)
|
||||||
|
{
|
||||||
|
// If zlib.output_compression is enabled it will compress the output,
|
||||||
|
// but it will not modify the content-length header to compensate for
|
||||||
|
// the reduction, causing the browser to hang waiting for more data.
|
||||||
|
// We'll just skip content-length in those cases.
|
||||||
|
|
||||||
|
if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->headers[] = array($header, $replace);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Content Type Header
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string extension of the file we're outputting
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function set_content_type($mime_type)
|
||||||
|
{
|
||||||
|
if (strpos($mime_type, '/') === FALSE)
|
||||||
|
{
|
||||||
|
$extension = ltrim($mime_type, '.');
|
||||||
|
|
||||||
|
// Is this extension supported?
|
||||||
|
if (isset($this->mime_types[$extension]))
|
||||||
|
{
|
||||||
|
$mime_type =& $this->mime_types[$extension];
|
||||||
|
|
||||||
|
if (is_array($mime_type))
|
||||||
|
{
|
||||||
|
$mime_type = current($mime_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$header = 'Content-Type: '.$mime_type;
|
||||||
|
|
||||||
|
$this->headers[] = array($header, TRUE);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set HTTP Status Header
|
||||||
|
* moved to Common procedural functions in 1.7.2
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param int the status code
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function set_status_header($code = 200, $text = '')
|
||||||
|
{
|
||||||
|
set_status_header($code, $text);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable/disable Profiler
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param bool
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function enable_profiler($val = TRUE)
|
||||||
|
{
|
||||||
|
$this->enable_profiler = (is_bool($val)) ? $val : TRUE;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Profiler Sections
|
||||||
|
*
|
||||||
|
* Allows override of default / config settings for Profiler section display
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param array
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function set_profiler_sections($sections)
|
||||||
|
{
|
||||||
|
foreach ($sections as $section => $enable)
|
||||||
|
{
|
||||||
|
$this->_profiler_sections[$section] = ($enable !== FALSE) ? TRUE : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Cache
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param integer
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function cache($time)
|
||||||
|
{
|
||||||
|
$this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display Output
|
||||||
|
*
|
||||||
|
* All "view" data is automatically put into this variable by the controller class:
|
||||||
|
*
|
||||||
|
* $this->final_output
|
||||||
|
*
|
||||||
|
* This function sends the finalized output data to the browser along
|
||||||
|
* with any server headers and profile data. It also stops the
|
||||||
|
* benchmark timer so the page rendering speed and memory usage can be shown.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function _display($output = '')
|
||||||
|
{
|
||||||
|
// Note: We use globals because we can't use $CI =& get_instance()
|
||||||
|
// since this function is sometimes called by the caching mechanism,
|
||||||
|
// which happens before the CI super object is available.
|
||||||
|
global $BM, $CFG;
|
||||||
|
|
||||||
|
// Grab the super object if we can.
|
||||||
|
if (class_exists('CI_Controller'))
|
||||||
|
{
|
||||||
|
$CI =& get_instance();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Set the output data
|
||||||
|
if ($output == '')
|
||||||
|
{
|
||||||
|
$output =& $this->final_output;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Do we need to write a cache file? Only if the controller does not have its
|
||||||
|
// own _output() method and we are not dealing with a cache file, which we
|
||||||
|
// can determine by the existence of the $CI object above
|
||||||
|
if ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output'))
|
||||||
|
{
|
||||||
|
$this->_write_cache($output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Parse out the elapsed time and memory usage,
|
||||||
|
// then swap the pseudo-variables with the data
|
||||||
|
|
||||||
|
$elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end');
|
||||||
|
|
||||||
|
if ($this->parse_exec_vars === TRUE)
|
||||||
|
{
|
||||||
|
$memory = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB';
|
||||||
|
|
||||||
|
$output = str_replace('{elapsed_time}', $elapsed, $output);
|
||||||
|
$output = str_replace('{memory_usage}', $memory, $output);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Is compression requested?
|
||||||
|
if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc == FALSE)
|
||||||
|
{
|
||||||
|
if (extension_loaded('zlib'))
|
||||||
|
{
|
||||||
|
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) AND strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)
|
||||||
|
{
|
||||||
|
ob_start('ob_gzhandler');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Are there any server headers to send?
|
||||||
|
if (count($this->headers) > 0)
|
||||||
|
{
|
||||||
|
foreach ($this->headers as $header)
|
||||||
|
{
|
||||||
|
@header($header[0], $header[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Does the $CI object exist?
|
||||||
|
// If not we know we are dealing with a cache file so we'll
|
||||||
|
// simply echo out the data and exit.
|
||||||
|
if ( ! isset($CI))
|
||||||
|
{
|
||||||
|
echo $output;
|
||||||
|
log_message('debug', "Final output sent to browser");
|
||||||
|
log_message('debug', "Total execution time: ".$elapsed);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Do we need to generate profile data?
|
||||||
|
// If so, load the Profile class and run it.
|
||||||
|
if ($this->enable_profiler == TRUE)
|
||||||
|
{
|
||||||
|
$CI->load->library('profiler');
|
||||||
|
|
||||||
|
if ( ! empty($this->_profiler_sections))
|
||||||
|
{
|
||||||
|
$CI->profiler->set_sections($this->_profiler_sections);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the output data contains closing </body> and </html> tags
|
||||||
|
// we will remove them and add them back after we insert the profile data
|
||||||
|
if (preg_match("|</body>.*?</html>|is", $output))
|
||||||
|
{
|
||||||
|
$output = preg_replace("|</body>.*?</html>|is", '', $output);
|
||||||
|
$output .= $CI->profiler->run();
|
||||||
|
$output .= '</body></html>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$output .= $CI->profiler->run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Does the controller contain a function named _output()?
|
||||||
|
// If so send the output there. Otherwise, echo it.
|
||||||
|
if (method_exists($CI, '_output'))
|
||||||
|
{
|
||||||
|
$CI->_output($output);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
echo $output; // Send it to the browser!
|
||||||
|
}
|
||||||
|
|
||||||
|
log_message('debug', "Final output sent to browser");
|
||||||
|
log_message('debug', "Total execution time: ".$elapsed);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a Cache File
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _write_cache($output)
|
||||||
|
{
|
||||||
|
$CI =& get_instance();
|
||||||
|
$path = $CI->config->item('cache_path');
|
||||||
|
|
||||||
|
$cache_path = ($path == '') ? APPPATH.'cache/' : $path;
|
||||||
|
|
||||||
|
if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
|
||||||
|
{
|
||||||
|
log_message('error', "Unable to write cache file: ".$cache_path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$uri = $CI->config->item('base_url').
|
||||||
|
$CI->config->item('index_page').
|
||||||
|
$CI->uri->uri_string();
|
||||||
|
|
||||||
|
$cache_path .= md5($uri);
|
||||||
|
|
||||||
|
if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE))
|
||||||
|
{
|
||||||
|
log_message('error', "Unable to write cache file: ".$cache_path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$expire = time() + ($this->cache_expiration * 60);
|
||||||
|
|
||||||
|
if (flock($fp, LOCK_EX))
|
||||||
|
{
|
||||||
|
fwrite($fp, $expire.'TS--->'.$output);
|
||||||
|
flock($fp, LOCK_UN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log_message('error', "Unable to secure a file lock for file at: ".$cache_path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fclose($fp);
|
||||||
|
@chmod($cache_path, FILE_WRITE_MODE);
|
||||||
|
|
||||||
|
log_message('debug', "Cache file written: ".$cache_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update/serve a cached file
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param object config class
|
||||||
|
* @param object uri class
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _display_cache(&$CFG, &$URI)
|
||||||
|
{
|
||||||
|
$cache_path = ($CFG->item('cache_path') == '') ? APPPATH.'cache/' : $CFG->item('cache_path');
|
||||||
|
|
||||||
|
// Build the file path. The file name is an MD5 hash of the full URI
|
||||||
|
$uri = $CFG->item('base_url').
|
||||||
|
$CFG->item('index_page').
|
||||||
|
$URI->uri_string;
|
||||||
|
|
||||||
|
$filepath = $cache_path.md5($uri);
|
||||||
|
|
||||||
|
if ( ! @file_exists($filepath))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $fp = @fopen($filepath, FOPEN_READ))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
flock($fp, LOCK_SH);
|
||||||
|
|
||||||
|
$cache = '';
|
||||||
|
if (filesize($filepath) > 0)
|
||||||
|
{
|
||||||
|
$cache = fread($fp, filesize($filepath));
|
||||||
|
}
|
||||||
|
|
||||||
|
flock($fp, LOCK_UN);
|
||||||
|
fclose($fp);
|
||||||
|
|
||||||
|
// Strip out the embedded timestamp
|
||||||
|
if ( ! preg_match("/(\d+TS--->)/", $cache, $match))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Has the file expired? If so we'll delete it.
|
||||||
|
if (time() >= trim(str_replace('TS--->', '', $match['1'])))
|
||||||
|
{
|
||||||
|
if (is_really_writable($cache_path))
|
||||||
|
{
|
||||||
|
@unlink($filepath);
|
||||||
|
log_message('debug', "Cache file has expired. File deleted");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display the cache
|
||||||
|
$this->_display(str_replace($match['0'], '', $cache));
|
||||||
|
log_message('debug', "Cache file is current. Sending it to browser.");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
// END Output Class
|
||||||
|
|
||||||
|
/* End of file Output.php */
|
||||||
|
/* Location: ./system/core/Output.php */
|
522
system/core/Router.php
Normal file
522
system/core/Router.php
Normal file
@ -0,0 +1,522 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Router Class
|
||||||
|
*
|
||||||
|
* Parses URIs and determines routing
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @category Libraries
|
||||||
|
* @link http://codeigniter.com/user_guide/general/routing.html
|
||||||
|
*/
|
||||||
|
class CI_Router {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config class
|
||||||
|
*
|
||||||
|
* @var object
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $config;
|
||||||
|
/**
|
||||||
|
* List of routes
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $routes = array();
|
||||||
|
/**
|
||||||
|
* List of error routes
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $error_routes = array();
|
||||||
|
/**
|
||||||
|
* Current class name
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $class = '';
|
||||||
|
/**
|
||||||
|
* Current method name
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $method = 'index';
|
||||||
|
/**
|
||||||
|
* Sub-directory that contains the requested controller class
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $directory = '';
|
||||||
|
/**
|
||||||
|
* Default controller (and method if specific)
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $default_controller;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* Runs the route mapping function.
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
$this->config =& load_class('Config', 'core');
|
||||||
|
$this->uri =& load_class('URI', 'core');
|
||||||
|
log_message('debug', "Router Class Initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the route mapping
|
||||||
|
*
|
||||||
|
* This function determines what should be served based on the URI request,
|
||||||
|
* as well as any "routes" that have been set in the routing config file.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _set_routing()
|
||||||
|
{
|
||||||
|
// Are query strings enabled in the config file? Normally CI doesn't utilize query strings
|
||||||
|
// since URI segments are more search-engine friendly, but they can optionally be used.
|
||||||
|
// If this feature is enabled, we will gather the directory/class/method a little differently
|
||||||
|
$segments = array();
|
||||||
|
if ($this->config->item('enable_query_strings') === TRUE AND isset($_GET[$this->config->item('controller_trigger')]))
|
||||||
|
{
|
||||||
|
if (isset($_GET[$this->config->item('directory_trigger')]))
|
||||||
|
{
|
||||||
|
$this->set_directory(trim($this->uri->_filter_uri($_GET[$this->config->item('directory_trigger')])));
|
||||||
|
$segments[] = $this->fetch_directory();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET[$this->config->item('controller_trigger')]))
|
||||||
|
{
|
||||||
|
$this->set_class(trim($this->uri->_filter_uri($_GET[$this->config->item('controller_trigger')])));
|
||||||
|
$segments[] = $this->fetch_class();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET[$this->config->item('function_trigger')]))
|
||||||
|
{
|
||||||
|
$this->set_method(trim($this->uri->_filter_uri($_GET[$this->config->item('function_trigger')])));
|
||||||
|
$segments[] = $this->fetch_method();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the routes.php file.
|
||||||
|
if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
|
||||||
|
{
|
||||||
|
include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
|
||||||
|
}
|
||||||
|
elseif (is_file(APPPATH.'config/routes.php'))
|
||||||
|
{
|
||||||
|
include(APPPATH.'config/routes.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->routes = ( ! isset($route) OR ! is_array($route)) ? array() : $route;
|
||||||
|
unset($route);
|
||||||
|
|
||||||
|
// Set the default controller so we can display it in the event
|
||||||
|
// the URI doesn't correlated to a valid controller.
|
||||||
|
$this->default_controller = ( ! isset($this->routes['default_controller']) OR $this->routes['default_controller'] == '') ? FALSE : strtolower($this->routes['default_controller']);
|
||||||
|
|
||||||
|
// Were there any query string segments? If so, we'll validate them and bail out since we're done.
|
||||||
|
if (count($segments) > 0)
|
||||||
|
{
|
||||||
|
return $this->_validate_request($segments);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch the complete URI string
|
||||||
|
$this->uri->_fetch_uri_string();
|
||||||
|
|
||||||
|
// Is there a URI string? If not, the default controller specified in the "routes" file will be shown.
|
||||||
|
if ($this->uri->uri_string == '')
|
||||||
|
{
|
||||||
|
return $this->_set_default_controller();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do we need to remove the URL suffix?
|
||||||
|
$this->uri->_remove_url_suffix();
|
||||||
|
|
||||||
|
// Compile the segments into an array
|
||||||
|
$this->uri->_explode_segments();
|
||||||
|
|
||||||
|
// Parse any custom routing that may exist
|
||||||
|
$this->_parse_routes();
|
||||||
|
|
||||||
|
// Re-index the segment array so that it starts with 1 rather than 0
|
||||||
|
$this->uri->_reindex_segments();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the default controller
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _set_default_controller()
|
||||||
|
{
|
||||||
|
if ($this->default_controller === FALSE)
|
||||||
|
{
|
||||||
|
show_error("Unable to determine what should be displayed. A default route has not been specified in the routing file.");
|
||||||
|
}
|
||||||
|
// Is the method being specified?
|
||||||
|
if (strpos($this->default_controller, '/') !== FALSE)
|
||||||
|
{
|
||||||
|
$x = explode('/', $this->default_controller);
|
||||||
|
|
||||||
|
$this->set_class($x[0]);
|
||||||
|
$this->set_method($x[1]);
|
||||||
|
$this->_set_request($x);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->set_class($this->default_controller);
|
||||||
|
$this->set_method('index');
|
||||||
|
$this->_set_request(array($this->default_controller, 'index'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// re-index the routed segments array so it starts with 1 rather than 0
|
||||||
|
$this->uri->_reindex_segments();
|
||||||
|
|
||||||
|
log_message('debug', "No URI present. Default controller set.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the Route
|
||||||
|
*
|
||||||
|
* This function takes an array of URI segments as
|
||||||
|
* input, and sets the current class/method
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param array
|
||||||
|
* @param bool
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _set_request($segments = array())
|
||||||
|
{
|
||||||
|
$segments = $this->_validate_request($segments);
|
||||||
|
|
||||||
|
if (count($segments) == 0)
|
||||||
|
{
|
||||||
|
return $this->_set_default_controller();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->set_class($segments[0]);
|
||||||
|
|
||||||
|
if (isset($segments[1]))
|
||||||
|
{
|
||||||
|
// A standard method request
|
||||||
|
$this->set_method($segments[1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// This lets the "routed" segment array identify that the default
|
||||||
|
// index method is being used.
|
||||||
|
$segments[1] = 'index';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update our "routed" segment array to contain the segments.
|
||||||
|
// Note: If there is no custom routing, this array will be
|
||||||
|
// identical to $this->uri->segments
|
||||||
|
$this->uri->rsegments = $segments;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the supplied segments. Attempts to determine the path to
|
||||||
|
* the controller.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param array
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function _validate_request($segments)
|
||||||
|
{
|
||||||
|
if (count($segments) == 0)
|
||||||
|
{
|
||||||
|
return $segments;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Does the requested controller exist in the root folder?
|
||||||
|
if (file_exists(APPPATH.'controllers/'.$segments[0].'.php'))
|
||||||
|
{
|
||||||
|
return $segments;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is the controller in a sub-folder?
|
||||||
|
if (is_dir(APPPATH.'controllers/'.$segments[0]))
|
||||||
|
{
|
||||||
|
// Set the directory and remove it from the segment array
|
||||||
|
$this->set_directory($segments[0]);
|
||||||
|
$segments = array_slice($segments, 1);
|
||||||
|
|
||||||
|
if (count($segments) > 0)
|
||||||
|
{
|
||||||
|
// Does the requested controller exist in the sub-folder?
|
||||||
|
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].'.php'))
|
||||||
|
{
|
||||||
|
if ( ! empty($this->routes['404_override']))
|
||||||
|
{
|
||||||
|
$x = explode('/', $this->routes['404_override']);
|
||||||
|
|
||||||
|
$this->set_directory('');
|
||||||
|
$this->set_class($x[0]);
|
||||||
|
$this->set_method(isset($x[1]) ? $x[1] : 'index');
|
||||||
|
|
||||||
|
return $x;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
show_404($this->fetch_directory().$segments[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Is the method being specified in the route?
|
||||||
|
if (strpos($this->default_controller, '/') !== FALSE)
|
||||||
|
{
|
||||||
|
$x = explode('/', $this->default_controller);
|
||||||
|
|
||||||
|
$this->set_class($x[0]);
|
||||||
|
$this->set_method($x[1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->set_class($this->default_controller);
|
||||||
|
$this->set_method('index');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Does the default controller exist in the sub-folder?
|
||||||
|
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php'))
|
||||||
|
{
|
||||||
|
$this->directory = '';
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return $segments;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// If we've gotten this far it means that the URI does not correlate to a valid
|
||||||
|
// controller class. We will now see if there is an override
|
||||||
|
if ( ! empty($this->routes['404_override']))
|
||||||
|
{
|
||||||
|
$x = explode('/', $this->routes['404_override']);
|
||||||
|
|
||||||
|
$this->set_class($x[0]);
|
||||||
|
$this->set_method(isset($x[1]) ? $x[1] : 'index');
|
||||||
|
|
||||||
|
return $x;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Nothing else to do at this point but show a 404
|
||||||
|
show_404($segments[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse Routes
|
||||||
|
*
|
||||||
|
* This function matches any routes that may exist in
|
||||||
|
* the config/routes.php file against the URI to
|
||||||
|
* determine if the class/method need to be remapped.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _parse_routes()
|
||||||
|
{
|
||||||
|
// Turn the segment array into a URI string
|
||||||
|
$uri = implode('/', $this->uri->segments);
|
||||||
|
|
||||||
|
// Is there a literal match? If so we're done
|
||||||
|
if (isset($this->routes[$uri]))
|
||||||
|
{
|
||||||
|
return $this->_set_request(explode('/', $this->routes[$uri]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop through the route array looking for wild-cards
|
||||||
|
foreach ($this->routes as $key => $val)
|
||||||
|
{
|
||||||
|
// Convert wild-cards to RegEx
|
||||||
|
$key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));
|
||||||
|
|
||||||
|
// Does the RegEx match?
|
||||||
|
if (preg_match('#^'.$key.'$#', $uri))
|
||||||
|
{
|
||||||
|
// Do we have a back-reference?
|
||||||
|
if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE)
|
||||||
|
{
|
||||||
|
$val = preg_replace('#^'.$key.'$#', $val, $uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_set_request(explode('/', $val));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we got this far it means we didn't encounter a
|
||||||
|
// matching route so we'll set the site default route
|
||||||
|
$this->_set_request($this->uri->segments);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the class name
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function set_class($class)
|
||||||
|
{
|
||||||
|
$this->class = str_replace(array('/', '.'), '', $class);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch the current class
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function fetch_class()
|
||||||
|
{
|
||||||
|
return $this->class;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the method name
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function set_method($method)
|
||||||
|
{
|
||||||
|
$this->method = $method;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch the current method
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function fetch_method()
|
||||||
|
{
|
||||||
|
if ($this->method == $this->fetch_class())
|
||||||
|
{
|
||||||
|
return 'index';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->method;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the directory name
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function set_directory($dir)
|
||||||
|
{
|
||||||
|
$this->directory = str_replace(array('/', '.'), '', $dir).'/';
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch the sub-directory (if any) that contains the requested controller class
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function fetch_directory()
|
||||||
|
{
|
||||||
|
return $this->directory;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the controller overrides
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param array
|
||||||
|
* @return null
|
||||||
|
*/
|
||||||
|
function _set_overrides($routing)
|
||||||
|
{
|
||||||
|
if ( ! is_array($routing))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($routing['directory']))
|
||||||
|
{
|
||||||
|
$this->set_directory($routing['directory']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($routing['controller']) AND $routing['controller'] != '')
|
||||||
|
{
|
||||||
|
$this->set_class($routing['controller']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($routing['function']))
|
||||||
|
{
|
||||||
|
$routing['function'] = ($routing['function'] == '') ? 'index' : $routing['function'];
|
||||||
|
$this->set_method($routing['function']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
// END Router Class
|
||||||
|
|
||||||
|
/* End of file Router.php */
|
||||||
|
/* Location: ./system/core/Router.php */
|
876
system/core/Security.php
Normal file
876
system/core/Security.php
Normal file
@ -0,0 +1,876 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Security Class
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category Security
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/libraries/security.html
|
||||||
|
*/
|
||||||
|
class CI_Security {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Random Hash for protecting URLs
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $_xss_hash = '';
|
||||||
|
/**
|
||||||
|
* Random Hash for Cross Site Request Forgery Protection Cookie
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $_csrf_hash = '';
|
||||||
|
/**
|
||||||
|
* Expiration time for Cross Site Request Forgery Protection Cookie
|
||||||
|
* Defaults to two hours (in seconds)
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $_csrf_expire = 7200;
|
||||||
|
/**
|
||||||
|
* Token name for Cross Site Request Forgery Protection Cookie
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $_csrf_token_name = 'ci_csrf_token';
|
||||||
|
/**
|
||||||
|
* Cookie name for Cross Site Request Forgery Protection Cookie
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $_csrf_cookie_name = 'ci_csrf_token';
|
||||||
|
/**
|
||||||
|
* List of never allowed strings
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $_never_allowed_str = array(
|
||||||
|
'document.cookie' => '[removed]',
|
||||||
|
'document.write' => '[removed]',
|
||||||
|
'.parentNode' => '[removed]',
|
||||||
|
'.innerHTML' => '[removed]',
|
||||||
|
'window.location' => '[removed]',
|
||||||
|
'-moz-binding' => '[removed]',
|
||||||
|
'<!--' => '<!--',
|
||||||
|
'-->' => '-->',
|
||||||
|
'<![CDATA[' => '<![CDATA[',
|
||||||
|
'<comment>' => '<comment>'
|
||||||
|
);
|
||||||
|
|
||||||
|
/* never allowed, regex replacement */
|
||||||
|
/**
|
||||||
|
* List of never allowed regex replacement
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
protected $_never_allowed_regex = array(
|
||||||
|
'javascript\s*:',
|
||||||
|
'expression\s*(\(|&\#40;)', // CSS and IE
|
||||||
|
'vbscript\s*:', // IE, surprise!
|
||||||
|
'Redirect\s+302',
|
||||||
|
"([\"'])?data\s*:[^\\1]*?base64[^\\1]*?,[^\\1]*?\\1?"
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
// Is CSRF protection enabled?
|
||||||
|
if (config_item('csrf_protection') === TRUE)
|
||||||
|
{
|
||||||
|
// CSRF config
|
||||||
|
foreach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key)
|
||||||
|
{
|
||||||
|
if (FALSE !== ($val = config_item($key)))
|
||||||
|
{
|
||||||
|
$this->{'_'.$key} = $val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append application specific cookie prefix
|
||||||
|
if (config_item('cookie_prefix'))
|
||||||
|
{
|
||||||
|
$this->_csrf_cookie_name = config_item('cookie_prefix').$this->_csrf_cookie_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the CSRF hash
|
||||||
|
$this->_csrf_set_hash();
|
||||||
|
}
|
||||||
|
|
||||||
|
log_message('debug', "Security Class Initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify Cross Site Request Forgery Protection
|
||||||
|
*
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function csrf_verify()
|
||||||
|
{
|
||||||
|
// If it's not a POST request we will set the CSRF cookie
|
||||||
|
if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST')
|
||||||
|
{
|
||||||
|
return $this->csrf_set_cookie();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do the tokens exist in both the _POST and _COOKIE arrays?
|
||||||
|
if ( ! isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]))
|
||||||
|
{
|
||||||
|
$this->csrf_show_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do the tokens match?
|
||||||
|
if ($_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
|
||||||
|
unset($_POST[$this->_csrf_token_name]);
|
||||||
|
|
||||||
|
// Nothing should last forever
|
||||||
|
unset($_COOKIE[$this->_csrf_cookie_name]);
|
||||||
|
$this->_csrf_set_hash();
|
||||||
|
$this->csrf_set_cookie();
|
||||||
|
|
||||||
|
log_message('debug', 'CSRF token verified');
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Cross Site Request Forgery Protection Cookie
|
||||||
|
*
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function csrf_set_cookie()
|
||||||
|
{
|
||||||
|
$expire = time() + $this->_csrf_expire;
|
||||||
|
$secure_cookie = (config_item('cookie_secure') === TRUE) ? 1 : 0;
|
||||||
|
|
||||||
|
if ($secure_cookie && (empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) === 'off'))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
setcookie($this->_csrf_cookie_name, $this->_csrf_hash, $expire, config_item('cookie_path'), config_item('cookie_domain'), $secure_cookie);
|
||||||
|
|
||||||
|
log_message('debug', "CRSF cookie Set");
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show CSRF Error
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function csrf_show_error()
|
||||||
|
{
|
||||||
|
show_error('The action you have requested is not allowed.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get CSRF Hash
|
||||||
|
*
|
||||||
|
* Getter Method
|
||||||
|
*
|
||||||
|
* @return string self::_csrf_hash
|
||||||
|
*/
|
||||||
|
public function get_csrf_hash()
|
||||||
|
{
|
||||||
|
return $this->_csrf_hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get CSRF Token Name
|
||||||
|
*
|
||||||
|
* Getter Method
|
||||||
|
*
|
||||||
|
* @return string self::csrf_token_name
|
||||||
|
*/
|
||||||
|
public function get_csrf_token_name()
|
||||||
|
{
|
||||||
|
return $this->_csrf_token_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XSS Clean
|
||||||
|
*
|
||||||
|
* Sanitizes data so that Cross Site Scripting Hacks can be
|
||||||
|
* prevented. This function does a fair amount of work but
|
||||||
|
* it is extremely thorough, designed to prevent even the
|
||||||
|
* most obscure XSS attempts. Nothing is ever 100% foolproof,
|
||||||
|
* of course, but I haven't been able to get anything passed
|
||||||
|
* the filter.
|
||||||
|
*
|
||||||
|
* Note: This function should only be used to deal with data
|
||||||
|
* upon submission. It's not something that should
|
||||||
|
* be used for general runtime processing.
|
||||||
|
*
|
||||||
|
* This function was based in part on some code and ideas I
|
||||||
|
* got from Bitflux: http://channel.bitflux.ch/wiki/XSS_Prevention
|
||||||
|
*
|
||||||
|
* To help develop this script I used this great list of
|
||||||
|
* vulnerabilities along with a few other hacks I've
|
||||||
|
* harvested from examining vulnerabilities in other programs:
|
||||||
|
* http://ha.ckers.org/xss.html
|
||||||
|
*
|
||||||
|
* @param mixed string or array
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function xss_clean($str, $is_image = FALSE)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Is the string an array?
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
if (is_array($str))
|
||||||
|
{
|
||||||
|
while (list($key) = each($str))
|
||||||
|
{
|
||||||
|
$str[$key] = $this->xss_clean($str[$key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove Invisible Characters
|
||||||
|
*/
|
||||||
|
$str = remove_invisible_characters($str);
|
||||||
|
|
||||||
|
// Validate Entities in URLs
|
||||||
|
$str = $this->_validate_entities($str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* URL Decode
|
||||||
|
*
|
||||||
|
* Just in case stuff like this is submitted:
|
||||||
|
*
|
||||||
|
* <a href="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">Google</a>
|
||||||
|
*
|
||||||
|
* Note: Use rawurldecode() so it does not remove plus signs
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
$str = rawurldecode($str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert character entities to ASCII
|
||||||
|
*
|
||||||
|
* This permits our tests below to work reliably.
|
||||||
|
* We only convert entities that are within tags since
|
||||||
|
* these are the ones that will pose security problems.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
$str = preg_replace_callback("/[a-z]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str);
|
||||||
|
|
||||||
|
$str = preg_replace_callback("/<\w+.*?(?=>|<|$)/si", array($this, '_decode_entity'), $str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove Invisible Characters Again!
|
||||||
|
*/
|
||||||
|
$str = remove_invisible_characters($str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert all tabs to spaces
|
||||||
|
*
|
||||||
|
* This prevents strings like this: ja vascript
|
||||||
|
* NOTE: we deal with spaces between characters later.
|
||||||
|
* NOTE: preg_replace was found to be amazingly slow here on
|
||||||
|
* large blocks of data, so we use str_replace.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (strpos($str, "\t") !== FALSE)
|
||||||
|
{
|
||||||
|
$str = str_replace("\t", ' ', $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Capture converted string for later comparison
|
||||||
|
*/
|
||||||
|
$converted_string = $str;
|
||||||
|
|
||||||
|
// Remove Strings that are never allowed
|
||||||
|
$str = $this->_do_never_allowed($str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Makes PHP tags safe
|
||||||
|
*
|
||||||
|
* Note: XML tags are inadvertently replaced too:
|
||||||
|
*
|
||||||
|
* <?xml
|
||||||
|
*
|
||||||
|
* But it doesn't seem to pose a problem.
|
||||||
|
*/
|
||||||
|
if ($is_image === TRUE)
|
||||||
|
{
|
||||||
|
// Images have a tendency to have the PHP short opening and
|
||||||
|
// closing tags every so often so we skip those and only
|
||||||
|
// do the long opening tags.
|
||||||
|
$str = preg_replace('/<\?(php)/i', "<?\\1", $str);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$str = str_replace(array('<?', '?'.'>'), array('<?', '?>'), $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compact any exploded words
|
||||||
|
*
|
||||||
|
* This corrects words like: j a v a s c r i p t
|
||||||
|
* These words are compacted back to their correct state.
|
||||||
|
*/
|
||||||
|
$words = array(
|
||||||
|
'javascript', 'expression', 'vbscript', 'script', 'base64',
|
||||||
|
'applet', 'alert', 'document', 'write', 'cookie', 'window'
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($words as $word)
|
||||||
|
{
|
||||||
|
$temp = '';
|
||||||
|
|
||||||
|
for ($i = 0, $wordlen = strlen($word); $i < $wordlen; $i++)
|
||||||
|
{
|
||||||
|
$temp .= substr($word, $i, 1)."\s*";
|
||||||
|
}
|
||||||
|
|
||||||
|
// We only want to do this when it is followed by a non-word character
|
||||||
|
// That way valid stuff like "dealer to" does not become "dealerto"
|
||||||
|
$str = preg_replace_callback('#('.substr($temp, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove disallowed Javascript in links or img tags
|
||||||
|
* We used to do some version comparisons and use of stripos for PHP5,
|
||||||
|
* but it is dog slow compared to these simplified non-capturing
|
||||||
|
* preg_match(), especially if the pattern exists in the string
|
||||||
|
*/
|
||||||
|
do
|
||||||
|
{
|
||||||
|
$original = $str;
|
||||||
|
|
||||||
|
if (preg_match("/<a/i", $str))
|
||||||
|
{
|
||||||
|
$str = preg_replace_callback("#<a\s+([^>]*?)(>|$)#si", array($this, '_js_link_removal'), $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match("/<img/i", $str))
|
||||||
|
{
|
||||||
|
$str = preg_replace_callback("#<img\s+([^>]*?)(\s?/?>|$)#si", array($this, '_js_img_removal'), $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match("/script/i", $str) OR preg_match("/xss/i", $str))
|
||||||
|
{
|
||||||
|
$str = preg_replace("#<(/*)(script|xss)(.*?)\>#si", '[removed]', $str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while($original != $str);
|
||||||
|
|
||||||
|
unset($original);
|
||||||
|
|
||||||
|
// Remove evil attributes such as style, onclick and xmlns
|
||||||
|
$str = $this->_remove_evil_attributes($str, $is_image);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sanitize naughty HTML elements
|
||||||
|
*
|
||||||
|
* If a tag containing any of the words in the list
|
||||||
|
* below is found, the tag gets converted to entities.
|
||||||
|
*
|
||||||
|
* So this: <blink>
|
||||||
|
* Becomes: <blink>
|
||||||
|
*/
|
||||||
|
$naughty = 'alert|applet|audio|basefont|base|behavior|bgsound|blink|body|embed|expression|form|frameset|frame|head|html|ilayer|iframe|input|isindex|layer|link|meta|object|plaintext|style|script|textarea|title|video|xml|xss';
|
||||||
|
$str = preg_replace_callback('#<(/*\s*)('.$naughty.')([^><]*)([><]*)#is', array($this, '_sanitize_naughty_html'), $str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sanitize naughty scripting elements
|
||||||
|
*
|
||||||
|
* Similar to above, only instead of looking for
|
||||||
|
* tags it looks for PHP and JavaScript commands
|
||||||
|
* that are disallowed. Rather than removing the
|
||||||
|
* code, it simply converts the parenthesis to entities
|
||||||
|
* rendering the code un-executable.
|
||||||
|
*
|
||||||
|
* For example: eval('some code')
|
||||||
|
* Becomes: eval('some code')
|
||||||
|
*/
|
||||||
|
$str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2(\\3)", $str);
|
||||||
|
|
||||||
|
|
||||||
|
// Final clean up
|
||||||
|
// This adds a bit of extra precaution in case
|
||||||
|
// something got through the above filters
|
||||||
|
$str = $this->_do_never_allowed($str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Images are Handled in a Special Way
|
||||||
|
* - Essentially, we want to know that after all of the character
|
||||||
|
* conversion is done whether any unwanted, likely XSS, code was found.
|
||||||
|
* If not, we return TRUE, as the image is clean.
|
||||||
|
* However, if the string post-conversion does not matched the
|
||||||
|
* string post-removal of XSS, then it fails, as there was unwanted XSS
|
||||||
|
* code found and removed/changed during processing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ($is_image === TRUE)
|
||||||
|
{
|
||||||
|
return ($str == $converted_string) ? TRUE: FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_message('debug', "XSS Filtering completed");
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Random Hash for protecting URLs
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function xss_hash()
|
||||||
|
{
|
||||||
|
if ($this->_xss_hash == '')
|
||||||
|
{
|
||||||
|
mt_srand();
|
||||||
|
$this->_xss_hash = md5(time() + mt_rand(0, 1999999999));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_xss_hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HTML Entities Decode
|
||||||
|
*
|
||||||
|
* This function is a replacement for html_entity_decode()
|
||||||
|
*
|
||||||
|
* The reason we are not using html_entity_decode() by itself is because
|
||||||
|
* while it is not technically correct to leave out the semicolon
|
||||||
|
* at the end of an entity most browsers will still interpret the entity
|
||||||
|
* correctly. html_entity_decode() does not convert entities without
|
||||||
|
* semicolons, so we are left with our own little solution here. Bummer.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function entity_decode($str, $charset='UTF-8')
|
||||||
|
{
|
||||||
|
if (stristr($str, '&') === FALSE)
|
||||||
|
{
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
$str = html_entity_decode($str, ENT_COMPAT, $charset);
|
||||||
|
$str = preg_replace('~&#x(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\\1"))', $str);
|
||||||
|
return preg_replace('~&#([0-9]{2,4})~e', 'chr(\\1)', $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filename Security
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function sanitize_filename($str, $relative_path = FALSE)
|
||||||
|
{
|
||||||
|
$bad = array(
|
||||||
|
"../",
|
||||||
|
"<!--",
|
||||||
|
"-->",
|
||||||
|
"<",
|
||||||
|
">",
|
||||||
|
"'",
|
||||||
|
'"',
|
||||||
|
'&',
|
||||||
|
'$',
|
||||||
|
'#',
|
||||||
|
'{',
|
||||||
|
'}',
|
||||||
|
'[',
|
||||||
|
']',
|
||||||
|
'=',
|
||||||
|
';',
|
||||||
|
'?',
|
||||||
|
"%20",
|
||||||
|
"%22",
|
||||||
|
"%3c", // <
|
||||||
|
"%253c", // <
|
||||||
|
"%3e", // >
|
||||||
|
"%0e", // >
|
||||||
|
"%28", // (
|
||||||
|
"%29", // )
|
||||||
|
"%2528", // (
|
||||||
|
"%26", // &
|
||||||
|
"%24", // $
|
||||||
|
"%3f", // ?
|
||||||
|
"%3b", // ;
|
||||||
|
"%3d" // =
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( ! $relative_path)
|
||||||
|
{
|
||||||
|
$bad[] = './';
|
||||||
|
$bad[] = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
$str = remove_invisible_characters($str, FALSE);
|
||||||
|
return stripslashes(str_replace($bad, '', $str));
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compact Exploded Words
|
||||||
|
*
|
||||||
|
* Callback function for xss_clean() to remove whitespace from
|
||||||
|
* things like j a v a s c r i p t
|
||||||
|
*
|
||||||
|
* @param type
|
||||||
|
* @return type
|
||||||
|
*/
|
||||||
|
protected function _compact_exploded_words($matches)
|
||||||
|
{
|
||||||
|
return preg_replace('/\s+/s', '', $matches[1]).$matches[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove Evil HTML Attributes (like evenhandlers and style)
|
||||||
|
*
|
||||||
|
* It removes the evil attribute and either:
|
||||||
|
* - Everything up until a space
|
||||||
|
* For example, everything between the pipes:
|
||||||
|
* <a |style=document.write('hello');alert('world');| class=link>
|
||||||
|
* - Everything inside the quotes
|
||||||
|
* For example, everything between the pipes:
|
||||||
|
* <a |style="document.write('hello'); alert('world');"| class="link">
|
||||||
|
*
|
||||||
|
* @param string $str The string to check
|
||||||
|
* @param boolean $is_image TRUE if this is an image
|
||||||
|
* @return string The string with the evil attributes removed
|
||||||
|
*/
|
||||||
|
protected function _remove_evil_attributes($str, $is_image)
|
||||||
|
{
|
||||||
|
// All javascript event handlers (e.g. onload, onclick, onmouseover), style, and xmlns
|
||||||
|
$evil_attributes = array('on\w*', 'style', 'xmlns', 'formaction');
|
||||||
|
|
||||||
|
if ($is_image === TRUE)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Adobe Photoshop puts XML metadata into JFIF images,
|
||||||
|
* including namespacing, so we have to allow this for images.
|
||||||
|
*/
|
||||||
|
unset($evil_attributes[array_search('xmlns', $evil_attributes)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
$count = 0;
|
||||||
|
$attribs = array();
|
||||||
|
|
||||||
|
// find occurrences of illegal attribute strings without quotes
|
||||||
|
preg_match_all('/('.implode('|', $evil_attributes).')\s*=\s*([^\s>]*)/is', $str, $matches, PREG_SET_ORDER);
|
||||||
|
|
||||||
|
foreach ($matches as $attr)
|
||||||
|
{
|
||||||
|
|
||||||
|
$attribs[] = preg_quote($attr[0], '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
// find occurrences of illegal attribute strings with quotes (042 and 047 are octal quotes)
|
||||||
|
preg_match_all("/(".implode('|', $evil_attributes).")\s*=\s*(\042|\047)([^\\2]*?)(\\2)/is", $str, $matches, PREG_SET_ORDER);
|
||||||
|
|
||||||
|
foreach ($matches as $attr)
|
||||||
|
{
|
||||||
|
$attribs[] = preg_quote($attr[0], '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
// replace illegal attribute strings that are inside an html tag
|
||||||
|
if (count($attribs) > 0)
|
||||||
|
{
|
||||||
|
$str = preg_replace("/<(\/?[^><]+?)([^A-Za-z<>\-])(.*?)(".implode('|', $attribs).")(.*?)([\s><])([><]*)/i", '<$1 $3$5$6$7', $str, -1, $count);
|
||||||
|
}
|
||||||
|
|
||||||
|
} while ($count);
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sanitize Naughty HTML
|
||||||
|
*
|
||||||
|
* Callback function for xss_clean() to remove naughty HTML elements
|
||||||
|
*
|
||||||
|
* @param array
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _sanitize_naughty_html($matches)
|
||||||
|
{
|
||||||
|
// encode opening brace
|
||||||
|
$str = '<'.$matches[1].$matches[2].$matches[3];
|
||||||
|
|
||||||
|
// encode captured opening or closing brace to prevent recursive vectors
|
||||||
|
$str .= str_replace(array('>', '<'), array('>', '<'),
|
||||||
|
$matches[4]);
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JS Link Removal
|
||||||
|
*
|
||||||
|
* Callback function for xss_clean() to sanitize links
|
||||||
|
* This limits the PCRE backtracks, making it more performance friendly
|
||||||
|
* and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in
|
||||||
|
* PHP 5.2+ on link-heavy strings
|
||||||
|
*
|
||||||
|
* @param array
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _js_link_removal($match)
|
||||||
|
{
|
||||||
|
return str_replace(
|
||||||
|
$match[1],
|
||||||
|
preg_replace(
|
||||||
|
'#href=.*?(alert\(|alert&\#40;|javascript\:|livescript\:|mocha\:|charset\=|window\.|document\.|\.cookie|<script|<xss|data\s*:)#si',
|
||||||
|
'',
|
||||||
|
$this->_filter_attributes(str_replace(array('<', '>'), '', $match[1]))
|
||||||
|
),
|
||||||
|
$match[0]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JS Image Removal
|
||||||
|
*
|
||||||
|
* Callback function for xss_clean() to sanitize image tags
|
||||||
|
* This limits the PCRE backtracks, making it more performance friendly
|
||||||
|
* and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in
|
||||||
|
* PHP 5.2+ on image tag heavy strings
|
||||||
|
*
|
||||||
|
* @param array
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _js_img_removal($match)
|
||||||
|
{
|
||||||
|
return str_replace(
|
||||||
|
$match[1],
|
||||||
|
preg_replace(
|
||||||
|
'#src=.*?(alert\(|alert&\#40;|javascript\:|livescript\:|mocha\:|charset\=|window\.|document\.|\.cookie|<script|<xss|base64\s*,)#si',
|
||||||
|
'',
|
||||||
|
$this->_filter_attributes(str_replace(array('<', '>'), '', $match[1]))
|
||||||
|
),
|
||||||
|
$match[0]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attribute Conversion
|
||||||
|
*
|
||||||
|
* Used as a callback for XSS Clean
|
||||||
|
*
|
||||||
|
* @param array
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _convert_attribute($match)
|
||||||
|
{
|
||||||
|
return str_replace(array('>', '<', '\\'), array('>', '<', '\\\\'), $match[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter Attributes
|
||||||
|
*
|
||||||
|
* Filters tag attributes for consistency and safety
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _filter_attributes($str)
|
||||||
|
{
|
||||||
|
$out = '';
|
||||||
|
|
||||||
|
if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches))
|
||||||
|
{
|
||||||
|
foreach ($matches[0] as $match)
|
||||||
|
{
|
||||||
|
$out .= preg_replace("#/\*.*?\*/#s", '', $match);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HTML Entity Decode Callback
|
||||||
|
*
|
||||||
|
* Used as a callback for XSS Clean
|
||||||
|
*
|
||||||
|
* @param array
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _decode_entity($match)
|
||||||
|
{
|
||||||
|
return $this->entity_decode($match[0], strtoupper(config_item('charset')));
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate URL entities
|
||||||
|
*
|
||||||
|
* Called by xss_clean()
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _validate_entities($str)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Protect GET variables in URLs
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 901119URL5918AMP18930PROTECT8198
|
||||||
|
|
||||||
|
$str = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-]+)|i', $this->xss_hash()."\\1=\\2", $str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Validate standard character entities
|
||||||
|
*
|
||||||
|
* Add a semicolon if missing. We do this to enable
|
||||||
|
* the conversion of entities to ASCII later.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
$str = preg_replace('#(&\#?[0-9a-z]{2,})([\x00-\x20])*;?#i', "\\1;\\2", $str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Validate UTF16 two byte encoding (x00)
|
||||||
|
*
|
||||||
|
* Just as above, adds a semicolon if missing.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
$str = preg_replace('#(&\#x?)([0-9A-F]+);?#i',"\\1\\2;",$str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Un-Protect GET variables in URLs
|
||||||
|
*/
|
||||||
|
$str = str_replace($this->xss_hash(), '&', $str);
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do Never Allowed
|
||||||
|
*
|
||||||
|
* A utility function for xss_clean()
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _do_never_allowed($str)
|
||||||
|
{
|
||||||
|
$str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str);
|
||||||
|
|
||||||
|
foreach ($this->_never_allowed_regex as $regex)
|
||||||
|
{
|
||||||
|
$str = preg_replace('#'.$regex.'#is', '[removed]', $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Cross Site Request Forgery Protection Cookie
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _csrf_set_hash()
|
||||||
|
{
|
||||||
|
if ($this->_csrf_hash == '')
|
||||||
|
{
|
||||||
|
// If the cookie exists we will use it's value.
|
||||||
|
// We don't necessarily want to regenerate it with
|
||||||
|
// each page load since a page could contain embedded
|
||||||
|
// sub-pages causing this feature to fail
|
||||||
|
if (isset($_COOKIE[$this->_csrf_cookie_name]) &&
|
||||||
|
preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name]) === 1)
|
||||||
|
{
|
||||||
|
return $this->_csrf_hash = $_COOKIE[$this->_csrf_cookie_name];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_csrf_hash = md5(uniqid(rand(), TRUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_csrf_hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file Security.php */
|
||||||
|
/* Location: ./system/libraries/Security.php */
|
654
system/core/URI.php
Normal file
654
system/core/URI.php
Normal file
@ -0,0 +1,654 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URI Class
|
||||||
|
*
|
||||||
|
* Parses URIs and determines routing
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category URI
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/libraries/uri.html
|
||||||
|
*/
|
||||||
|
class CI_URI {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of cached uri segments
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $keyval = array();
|
||||||
|
/**
|
||||||
|
* Current uri string
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $uri_string;
|
||||||
|
/**
|
||||||
|
* List of uri segments
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $segments = array();
|
||||||
|
/**
|
||||||
|
* Re-indexed list of uri segments
|
||||||
|
* Starts at 1 instead of 0
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
var $rsegments = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* Simply globalizes the $RTR object. The front
|
||||||
|
* loads the Router class early on so it's not available
|
||||||
|
* normally as other classes are.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
$this->config =& load_class('Config', 'core');
|
||||||
|
log_message('debug', "URI Class Initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the URI String
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _fetch_uri_string()
|
||||||
|
{
|
||||||
|
if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')
|
||||||
|
{
|
||||||
|
// Is the request coming from the command line?
|
||||||
|
if (php_sapi_name() == 'cli' or defined('STDIN'))
|
||||||
|
{
|
||||||
|
$this->_set_uri_string($this->_parse_cli_args());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Let's try the REQUEST_URI first, this will work in most situations
|
||||||
|
if ($uri = $this->_detect_uri())
|
||||||
|
{
|
||||||
|
$this->_set_uri_string($uri);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is there a PATH_INFO variable?
|
||||||
|
// Note: some servers seem to have trouble with getenv() so we'll test it two ways
|
||||||
|
$path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
|
||||||
|
if (trim($path, '/') != '' && $path != "/".SELF)
|
||||||
|
{
|
||||||
|
$this->_set_uri_string($path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No PATH_INFO?... What about QUERY_STRING?
|
||||||
|
$path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
|
||||||
|
if (trim($path, '/') != '')
|
||||||
|
{
|
||||||
|
$this->_set_uri_string($path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// As a last ditch effort lets try using the $_GET array
|
||||||
|
if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '')
|
||||||
|
{
|
||||||
|
$this->_set_uri_string(key($_GET));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We've exhausted all our options...
|
||||||
|
$this->uri_string = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$uri = strtoupper($this->config->item('uri_protocol'));
|
||||||
|
|
||||||
|
if ($uri == 'REQUEST_URI')
|
||||||
|
{
|
||||||
|
$this->_set_uri_string($this->_detect_uri());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
elseif ($uri == 'CLI')
|
||||||
|
{
|
||||||
|
$this->_set_uri_string($this->_parse_cli_args());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$path = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri);
|
||||||
|
$this->_set_uri_string($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the URI String
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _set_uri_string($str)
|
||||||
|
{
|
||||||
|
// Filter out control characters
|
||||||
|
$str = remove_invisible_characters($str, FALSE);
|
||||||
|
|
||||||
|
// If the URI contains only a slash we'll kill it
|
||||||
|
$this->uri_string = ($str == '/') ? '' : $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects the URI
|
||||||
|
*
|
||||||
|
* This function will detect the URI automatically and fix the query string
|
||||||
|
* if necessary.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function _detect_uri()
|
||||||
|
{
|
||||||
|
if ( ! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME']))
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$uri = $_SERVER['REQUEST_URI'];
|
||||||
|
if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0)
|
||||||
|
{
|
||||||
|
$uri = substr($uri, strlen($_SERVER['SCRIPT_NAME']));
|
||||||
|
}
|
||||||
|
elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0)
|
||||||
|
{
|
||||||
|
$uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME'])));
|
||||||
|
}
|
||||||
|
|
||||||
|
// This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct
|
||||||
|
// URI is found, and also fixes the QUERY_STRING server var and $_GET array.
|
||||||
|
if (strncmp($uri, '?/', 2) === 0)
|
||||||
|
{
|
||||||
|
$uri = substr($uri, 2);
|
||||||
|
}
|
||||||
|
$parts = preg_split('#\?#i', $uri, 2);
|
||||||
|
$uri = $parts[0];
|
||||||
|
if (isset($parts[1]))
|
||||||
|
{
|
||||||
|
$_SERVER['QUERY_STRING'] = $parts[1];
|
||||||
|
parse_str($_SERVER['QUERY_STRING'], $_GET);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$_SERVER['QUERY_STRING'] = '';
|
||||||
|
$_GET = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($uri == '/' || empty($uri))
|
||||||
|
{
|
||||||
|
return '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
$uri = parse_url($uri, PHP_URL_PATH);
|
||||||
|
|
||||||
|
// Do some final cleaning of the URI and return it
|
||||||
|
return str_replace(array('//', '../'), '/', trim($uri, '/'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse cli arguments
|
||||||
|
*
|
||||||
|
* Take each command line argument and assume it is a URI segment.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function _parse_cli_args()
|
||||||
|
{
|
||||||
|
$args = array_slice($_SERVER['argv'], 1);
|
||||||
|
|
||||||
|
return $args ? '/' . implode('/', $args) : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter segments for malicious characters
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _filter_uri($str)
|
||||||
|
{
|
||||||
|
if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
|
||||||
|
{
|
||||||
|
// preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards
|
||||||
|
// compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern
|
||||||
|
if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str))
|
||||||
|
{
|
||||||
|
show_error('The URI you submitted has disallowed characters.', 400);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert programatic characters to entities
|
||||||
|
$bad = array('$', '(', ')', '%28', '%29');
|
||||||
|
$good = array('$', '(', ')', '(', ')');
|
||||||
|
|
||||||
|
return str_replace($bad, $good, $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the suffix from the URL if needed
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _remove_url_suffix()
|
||||||
|
{
|
||||||
|
if ($this->config->item('url_suffix') != "")
|
||||||
|
{
|
||||||
|
$this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Explode the URI Segments. The individual segments will
|
||||||
|
* be stored in the $this->segments array.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _explode_segments()
|
||||||
|
{
|
||||||
|
foreach (explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
|
||||||
|
{
|
||||||
|
// Filter segments for security
|
||||||
|
$val = trim($this->_filter_uri($val));
|
||||||
|
|
||||||
|
if ($val != '')
|
||||||
|
{
|
||||||
|
$this->segments[] = $val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* Re-index Segments
|
||||||
|
*
|
||||||
|
* This function re-indexes the $this->segment array so that it
|
||||||
|
* starts at 1 rather than 0. Doing so makes it simpler to
|
||||||
|
* use functions like $this->uri->segment(n) since there is
|
||||||
|
* a 1:1 relationship between the segment array and the actual segments.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _reindex_segments()
|
||||||
|
{
|
||||||
|
array_unshift($this->segments, NULL);
|
||||||
|
array_unshift($this->rsegments, NULL);
|
||||||
|
unset($this->segments[0]);
|
||||||
|
unset($this->rsegments[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a URI Segment
|
||||||
|
*
|
||||||
|
* This function returns the URI segment based on the number provided.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param integer
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function segment($n, $no_result = FALSE)
|
||||||
|
{
|
||||||
|
return ( ! isset($this->segments[$n])) ? $no_result : $this->segments[$n];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a URI "routed" Segment
|
||||||
|
*
|
||||||
|
* This function returns the re-routed URI segment (assuming routing rules are used)
|
||||||
|
* based on the number provided. If there is no routing this function returns the
|
||||||
|
* same result as $this->segment()
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param integer
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function rsegment($n, $no_result = FALSE)
|
||||||
|
{
|
||||||
|
return ( ! isset($this->rsegments[$n])) ? $no_result : $this->rsegments[$n];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a key value pair from the URI string
|
||||||
|
*
|
||||||
|
* This function generates and associative array of URI data starting
|
||||||
|
* at the supplied segment. For example, if this is your URI:
|
||||||
|
*
|
||||||
|
* example.com/user/search/name/joe/location/UK/gender/male
|
||||||
|
*
|
||||||
|
* You can use this function to generate an array with this prototype:
|
||||||
|
*
|
||||||
|
* array (
|
||||||
|
* name => joe
|
||||||
|
* location => UK
|
||||||
|
* gender => male
|
||||||
|
* )
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param integer the starting segment number
|
||||||
|
* @param array an array of default values
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function uri_to_assoc($n = 3, $default = array())
|
||||||
|
{
|
||||||
|
return $this->_uri_to_assoc($n, $default, 'segment');
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Identical to above only it uses the re-routed segment array
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param integer the starting segment number
|
||||||
|
* @param array an array of default values
|
||||||
|
* @return array
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function ruri_to_assoc($n = 3, $default = array())
|
||||||
|
{
|
||||||
|
return $this->_uri_to_assoc($n, $default, 'rsegment');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a key value pair from the URI string or Re-routed URI string
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param integer the starting segment number
|
||||||
|
* @param array an array of default values
|
||||||
|
* @param string which array we should use
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function _uri_to_assoc($n = 3, $default = array(), $which = 'segment')
|
||||||
|
{
|
||||||
|
if ($which == 'segment')
|
||||||
|
{
|
||||||
|
$total_segments = 'total_segments';
|
||||||
|
$segment_array = 'segment_array';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$total_segments = 'total_rsegments';
|
||||||
|
$segment_array = 'rsegment_array';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! is_numeric($n))
|
||||||
|
{
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($this->keyval[$n]))
|
||||||
|
{
|
||||||
|
return $this->keyval[$n];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->$total_segments() < $n)
|
||||||
|
{
|
||||||
|
if (count($default) == 0)
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$retval = array();
|
||||||
|
foreach ($default as $val)
|
||||||
|
{
|
||||||
|
$retval[$val] = FALSE;
|
||||||
|
}
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
$segments = array_slice($this->$segment_array(), ($n - 1));
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
$lastval = '';
|
||||||
|
$retval = array();
|
||||||
|
foreach ($segments as $seg)
|
||||||
|
{
|
||||||
|
if ($i % 2)
|
||||||
|
{
|
||||||
|
$retval[$lastval] = $seg;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$retval[$seg] = FALSE;
|
||||||
|
$lastval = $seg;
|
||||||
|
}
|
||||||
|
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($default) > 0)
|
||||||
|
{
|
||||||
|
foreach ($default as $val)
|
||||||
|
{
|
||||||
|
if ( ! array_key_exists($val, $retval))
|
||||||
|
{
|
||||||
|
$retval[$val] = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cache the array for reuse
|
||||||
|
$this->keyval[$n] = $retval;
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a URI string from an associative array
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param array an associative array of key/values
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function assoc_to_uri($array)
|
||||||
|
{
|
||||||
|
$temp = array();
|
||||||
|
foreach ((array)$array as $key => $val)
|
||||||
|
{
|
||||||
|
$temp[] = $key;
|
||||||
|
$temp[] = $val;
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode('/', $temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a URI Segment and add a trailing slash
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param integer
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function slash_segment($n, $where = 'trailing')
|
||||||
|
{
|
||||||
|
return $this->_slash_segment($n, $where, 'segment');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a URI Segment and add a trailing slash
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param integer
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function slash_rsegment($n, $where = 'trailing')
|
||||||
|
{
|
||||||
|
return $this->_slash_segment($n, $where, 'rsegment');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a URI Segment and add a trailing slash - helper function
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param integer
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _slash_segment($n, $where = 'trailing', $which = 'segment')
|
||||||
|
{
|
||||||
|
$leading = '/';
|
||||||
|
$trailing = '/';
|
||||||
|
|
||||||
|
if ($where == 'trailing')
|
||||||
|
{
|
||||||
|
$leading = '';
|
||||||
|
}
|
||||||
|
elseif ($where == 'leading')
|
||||||
|
{
|
||||||
|
$trailing = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $leading.$this->$which($n).$trailing;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Segment Array
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function segment_array()
|
||||||
|
{
|
||||||
|
return $this->segments;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Routed Segment Array
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function rsegment_array()
|
||||||
|
{
|
||||||
|
return $this->rsegments;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Total number of segments
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function total_segments()
|
||||||
|
{
|
||||||
|
return count($this->segments);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Total number of routed segments
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function total_rsegments()
|
||||||
|
{
|
||||||
|
return count($this->rsegments);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch the entire URI string
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function uri_string()
|
||||||
|
{
|
||||||
|
return $this->uri_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch the entire Re-routed URI string
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function ruri_string()
|
||||||
|
{
|
||||||
|
return '/'.implode('/', $this->rsegment_array());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// END URI Class
|
||||||
|
|
||||||
|
/* End of file URI.php */
|
||||||
|
/* Location: ./system/core/URI.php */
|
165
system/core/Utf8.php
Normal file
165
system/core/Utf8.php
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 2.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utf8 Class
|
||||||
|
*
|
||||||
|
* Provides support for UTF-8 environments
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category UTF-8
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/libraries/utf8.html
|
||||||
|
*/
|
||||||
|
class CI_Utf8 {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* Determines if UTF-8 support is to be enabled
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
log_message('debug', "Utf8 Class Initialized");
|
||||||
|
|
||||||
|
global $CFG;
|
||||||
|
|
||||||
|
if (
|
||||||
|
preg_match('/./u', 'é') === 1 // PCRE must support UTF-8
|
||||||
|
AND function_exists('iconv') // iconv must be installed
|
||||||
|
AND ini_get('mbstring.func_overload') != 1 // Multibyte string function overloading cannot be enabled
|
||||||
|
AND $CFG->item('charset') == 'UTF-8' // Application charset must be UTF-8
|
||||||
|
)
|
||||||
|
{
|
||||||
|
log_message('debug', "UTF-8 Support Enabled");
|
||||||
|
|
||||||
|
define('UTF8_ENABLED', TRUE);
|
||||||
|
|
||||||
|
// set internal encoding for multibyte string functions if necessary
|
||||||
|
// and set a flag so we don't have to repeatedly use extension_loaded()
|
||||||
|
// or function_exists()
|
||||||
|
if (extension_loaded('mbstring'))
|
||||||
|
{
|
||||||
|
define('MB_ENABLED', TRUE);
|
||||||
|
mb_internal_encoding('UTF-8');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
define('MB_ENABLED', FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log_message('debug', "UTF-8 Support Disabled");
|
||||||
|
define('UTF8_ENABLED', FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean UTF-8 strings
|
||||||
|
*
|
||||||
|
* Ensures strings are UTF-8
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function clean_string($str)
|
||||||
|
{
|
||||||
|
if ($this->_is_ascii($str) === FALSE)
|
||||||
|
{
|
||||||
|
$str = @iconv('UTF-8', 'UTF-8//IGNORE', $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove ASCII control characters
|
||||||
|
*
|
||||||
|
* Removes all ASCII control characters except horizontal tabs,
|
||||||
|
* line feeds, and carriage returns, as all others can cause
|
||||||
|
* problems in XML
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function safe_ascii_for_xml($str)
|
||||||
|
{
|
||||||
|
return remove_invisible_characters($str, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert to UTF-8
|
||||||
|
*
|
||||||
|
* Attempts to convert a string to UTF-8
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param string - input encoding
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function convert_to_utf8($str, $encoding)
|
||||||
|
{
|
||||||
|
if (function_exists('iconv'))
|
||||||
|
{
|
||||||
|
$str = @iconv($encoding, 'UTF-8', $str);
|
||||||
|
}
|
||||||
|
elseif (function_exists('mb_convert_encoding'))
|
||||||
|
{
|
||||||
|
$str = @mb_convert_encoding($str, 'UTF-8', $encoding);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is ASCII?
|
||||||
|
*
|
||||||
|
* Tests if a string is standard 7-bit ASCII or not
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _is_ascii($str)
|
||||||
|
{
|
||||||
|
return (preg_match('/[^\x00-\x7F]/S', $str) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
}
|
||||||
|
// End Utf8 Class
|
||||||
|
|
||||||
|
/* End of file Utf8.php */
|
||||||
|
/* Location: ./system/core/Utf8.php */
|
10
system/core/index.html
Normal file
10
system/core/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
162
system/database/DB.php
Normal file
162
system/database/DB.php
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the database
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
* @param string
|
||||||
|
* @param bool Determines if active record should be used or not
|
||||||
|
*/
|
||||||
|
function &DB($params = '', $active_record_override = NULL)
|
||||||
|
{
|
||||||
|
// Load the DB config file if a DSN string wasn't passed
|
||||||
|
if (is_string($params) AND strpos($params, '://') === FALSE)
|
||||||
|
{
|
||||||
|
// Is the config file in the environment folder?
|
||||||
|
if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/database.php'))
|
||||||
|
{
|
||||||
|
if ( ! file_exists($file_path = APPPATH.'config/database.php'))
|
||||||
|
{
|
||||||
|
show_error('The configuration file database.php does not exist.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
include($file_path);
|
||||||
|
|
||||||
|
if ( ! isset($db) OR count($db) == 0)
|
||||||
|
{
|
||||||
|
show_error('No database connection settings were found in the database config file.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($params != '')
|
||||||
|
{
|
||||||
|
$active_group = $params;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! isset($active_group) OR ! isset($db[$active_group]))
|
||||||
|
{
|
||||||
|
show_error('You have specified an invalid database connection group.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = $db[$active_group];
|
||||||
|
}
|
||||||
|
elseif (is_string($params))
|
||||||
|
{
|
||||||
|
|
||||||
|
/* parse the URL from the DSN string
|
||||||
|
* Database settings can be passed as discreet
|
||||||
|
* parameters or as a data source name in the first
|
||||||
|
* parameter. DSNs must have this prototype:
|
||||||
|
* $dsn = 'driver://username:password@hostname/database';
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (($dns = @parse_url($params)) === FALSE)
|
||||||
|
{
|
||||||
|
show_error('Invalid DB Connection String');
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = array(
|
||||||
|
'dbdriver' => $dns['scheme'],
|
||||||
|
'hostname' => (isset($dns['host'])) ? rawurldecode($dns['host']) : '',
|
||||||
|
'username' => (isset($dns['user'])) ? rawurldecode($dns['user']) : '',
|
||||||
|
'password' => (isset($dns['pass'])) ? rawurldecode($dns['pass']) : '',
|
||||||
|
'database' => (isset($dns['path'])) ? rawurldecode(substr($dns['path'], 1)) : ''
|
||||||
|
);
|
||||||
|
|
||||||
|
// were additional config items set?
|
||||||
|
if (isset($dns['query']))
|
||||||
|
{
|
||||||
|
parse_str($dns['query'], $extra);
|
||||||
|
|
||||||
|
foreach ($extra as $key => $val)
|
||||||
|
{
|
||||||
|
// booleans please
|
||||||
|
if (strtoupper($val) == "TRUE")
|
||||||
|
{
|
||||||
|
$val = TRUE;
|
||||||
|
}
|
||||||
|
elseif (strtoupper($val) == "FALSE")
|
||||||
|
{
|
||||||
|
$val = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$params[$key] = $val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// No DB specified yet? Beat them senseless...
|
||||||
|
if ( ! isset($params['dbdriver']) OR $params['dbdriver'] == '')
|
||||||
|
{
|
||||||
|
show_error('You have not selected a database type to connect to.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the DB classes. Note: Since the active record class is optional
|
||||||
|
// we need to dynamically create a class that extends proper parent class
|
||||||
|
// based on whether we're using the active record class or not.
|
||||||
|
// Kudos to Paul for discovering this clever use of eval()
|
||||||
|
|
||||||
|
if ($active_record_override !== NULL)
|
||||||
|
{
|
||||||
|
$active_record = $active_record_override;
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once(BASEPATH.'database/DB_driver.php');
|
||||||
|
|
||||||
|
if ( ! isset($active_record) OR $active_record == TRUE)
|
||||||
|
{
|
||||||
|
require_once(BASEPATH.'database/DB_active_rec.php');
|
||||||
|
|
||||||
|
if ( ! class_exists('CI_DB'))
|
||||||
|
{
|
||||||
|
eval('class CI_DB extends CI_DB_active_record { }');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( ! class_exists('CI_DB'))
|
||||||
|
{
|
||||||
|
eval('class CI_DB extends CI_DB_driver { }');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php');
|
||||||
|
|
||||||
|
// Instantiate the DB adapter
|
||||||
|
$driver = 'CI_DB_'.$params['dbdriver'].'_driver';
|
||||||
|
$DB = new $driver($params);
|
||||||
|
|
||||||
|
if ($DB->autoinit == TRUE)
|
||||||
|
{
|
||||||
|
$DB->initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($params['stricton']) && $params['stricton'] == TRUE)
|
||||||
|
{
|
||||||
|
$DB->query('SET SESSION sql_mode="STRICT_ALL_TABLES"');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $DB;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file DB.php */
|
||||||
|
/* Location: ./system/database/DB.php */
|
2045
system/database/DB_active_rec.php
Normal file
2045
system/database/DB_active_rec.php
Normal file
File diff suppressed because it is too large
Load Diff
195
system/database/DB_cache.php
Normal file
195
system/database/DB_cache.php
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Database Cache Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_Cache {
|
||||||
|
|
||||||
|
var $CI;
|
||||||
|
var $db; // allows passing of db object so that multiple database connections and returned db objects can be supported
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* Grabs the CI super object instance so we can access it.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function __construct(&$db)
|
||||||
|
{
|
||||||
|
// Assign the main CI object to $this->CI
|
||||||
|
// and load the file helper since we use it a lot
|
||||||
|
$this->CI =& get_instance();
|
||||||
|
$this->db =& $db;
|
||||||
|
$this->CI->load->helper('file');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Cache Directory Path
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the path to the cache directory
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function check_path($path = '')
|
||||||
|
{
|
||||||
|
if ($path == '')
|
||||||
|
{
|
||||||
|
if ($this->db->cachedir == '')
|
||||||
|
{
|
||||||
|
return $this->db->cache_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
$path = $this->db->cachedir;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a trailing slash to the path if needed
|
||||||
|
$path = preg_replace("/(.+?)\/*$/", "\\1/", $path);
|
||||||
|
|
||||||
|
if ( ! is_dir($path) OR ! is_really_writable($path))
|
||||||
|
{
|
||||||
|
// If the path is wrong we'll turn off caching
|
||||||
|
return $this->db->cache_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->cachedir = $path;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a cached query
|
||||||
|
*
|
||||||
|
* The URI being requested will become the name of the cache sub-folder.
|
||||||
|
* An MD5 hash of the SQL statement will become the cache file name
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function read($sql)
|
||||||
|
{
|
||||||
|
if ( ! $this->check_path())
|
||||||
|
{
|
||||||
|
return $this->db->cache_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
$segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
|
||||||
|
|
||||||
|
$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
|
||||||
|
|
||||||
|
$filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql);
|
||||||
|
|
||||||
|
if (FALSE === ($cachedata = read_file($filepath)))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return unserialize($cachedata);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a query to a cache file
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function write($sql, $object)
|
||||||
|
{
|
||||||
|
if ( ! $this->check_path())
|
||||||
|
{
|
||||||
|
return $this->db->cache_off();
|
||||||
|
}
|
||||||
|
|
||||||
|
$segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
|
||||||
|
|
||||||
|
$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
|
||||||
|
|
||||||
|
$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';
|
||||||
|
|
||||||
|
$filename = md5($sql);
|
||||||
|
|
||||||
|
if ( ! @is_dir($dir_path))
|
||||||
|
{
|
||||||
|
if ( ! @mkdir($dir_path, DIR_WRITE_MODE))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@chmod($dir_path, DIR_WRITE_MODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (write_file($dir_path.$filename, serialize($object)) === FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@chmod($dir_path.$filename, FILE_WRITE_MODE);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete cache files within a particular directory
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function delete($segment_one = '', $segment_two = '')
|
||||||
|
{
|
||||||
|
if ($segment_one == '')
|
||||||
|
{
|
||||||
|
$segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($segment_two == '')
|
||||||
|
{
|
||||||
|
$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';
|
||||||
|
|
||||||
|
delete_files($dir_path, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete all existing cache files
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function delete_all()
|
||||||
|
{
|
||||||
|
delete_files($this->db->cachedir, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file DB_cache.php */
|
||||||
|
/* Location: ./system/database/DB_cache.php */
|
1410
system/database/DB_driver.php
Normal file
1410
system/database/DB_driver.php
Normal file
File diff suppressed because it is too large
Load Diff
382
system/database/DB_forge.php
Normal file
382
system/database/DB_forge.php
Normal file
@ -0,0 +1,382 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* Code Igniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Database Utility Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_forge {
|
||||||
|
|
||||||
|
var $fields = array();
|
||||||
|
var $keys = array();
|
||||||
|
var $primary_keys = array();
|
||||||
|
var $db_char_set = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* Grabs the CI super object instance so we can access it.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
// Assign the main database object to $this->db
|
||||||
|
$CI =& get_instance();
|
||||||
|
$this->db =& $CI->db;
|
||||||
|
log_message('debug', "Database Forge Class Initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create database
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function create_database($db_name)
|
||||||
|
{
|
||||||
|
$sql = $this->_create_database($db_name);
|
||||||
|
|
||||||
|
if (is_bool($sql))
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->db->query($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop database
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function drop_database($db_name)
|
||||||
|
{
|
||||||
|
$sql = $this->_drop_database($db_name);
|
||||||
|
|
||||||
|
if (is_bool($sql))
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->db->query($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add Key
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string key
|
||||||
|
* @param string type
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function add_key($key = '', $primary = FALSE)
|
||||||
|
{
|
||||||
|
if (is_array($key))
|
||||||
|
{
|
||||||
|
foreach ($key as $one)
|
||||||
|
{
|
||||||
|
$this->add_key($one, $primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($key == '')
|
||||||
|
{
|
||||||
|
show_error('Key information is required for that operation.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($primary === TRUE)
|
||||||
|
{
|
||||||
|
$this->primary_keys[] = $key;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->keys[] = $key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add Field
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string collation
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function add_field($field = '')
|
||||||
|
{
|
||||||
|
if ($field == '')
|
||||||
|
{
|
||||||
|
show_error('Field information is required.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_string($field))
|
||||||
|
{
|
||||||
|
if ($field == 'id')
|
||||||
|
{
|
||||||
|
$this->add_field(array(
|
||||||
|
'id' => array(
|
||||||
|
'type' => 'INT',
|
||||||
|
'constraint' => 9,
|
||||||
|
'auto_increment' => TRUE
|
||||||
|
)
|
||||||
|
));
|
||||||
|
$this->add_key('id', TRUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (strpos($field, ' ') === FALSE)
|
||||||
|
{
|
||||||
|
show_error('Field information is required for that operation.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->fields[] = $field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($field))
|
||||||
|
{
|
||||||
|
$this->fields = array_merge($this->fields, $field);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create Table
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function create_table($table = '', $if_not_exists = FALSE)
|
||||||
|
{
|
||||||
|
if ($table == '')
|
||||||
|
{
|
||||||
|
show_error('A table name is required for that operation.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($this->fields) == 0)
|
||||||
|
{
|
||||||
|
show_error('Field information is required.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists);
|
||||||
|
|
||||||
|
$this->_reset();
|
||||||
|
return $this->db->query($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop Table
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function drop_table($table_name)
|
||||||
|
{
|
||||||
|
$sql = $this->_drop_table($this->db->dbprefix.$table_name);
|
||||||
|
|
||||||
|
if (is_bool($sql))
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->db->query($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename Table
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the old table name
|
||||||
|
* @param string the new table name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function rename_table($table_name, $new_table_name)
|
||||||
|
{
|
||||||
|
if ($table_name == '' OR $new_table_name == '')
|
||||||
|
{
|
||||||
|
show_error('A table name is required for that operation.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = $this->_rename_table($this->db->dbprefix.$table_name, $this->db->dbprefix.$new_table_name);
|
||||||
|
return $this->db->query($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Column Add
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param string the column name
|
||||||
|
* @param string the column definition
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function add_column($table = '', $field = array(), $after_field = '')
|
||||||
|
{
|
||||||
|
if ($table == '')
|
||||||
|
{
|
||||||
|
show_error('A table name is required for that operation.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// add field info into field array, but we can only do one at a time
|
||||||
|
// so we cycle through
|
||||||
|
|
||||||
|
foreach ($field as $k => $v)
|
||||||
|
{
|
||||||
|
$this->add_field(array($k => $field[$k]));
|
||||||
|
|
||||||
|
if (count($this->fields) == 0)
|
||||||
|
{
|
||||||
|
show_error('Field information is required.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field);
|
||||||
|
|
||||||
|
$this->_reset();
|
||||||
|
|
||||||
|
if ($this->db->query($sql) === FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Column Drop
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param string the column name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function drop_column($table = '', $column_name = '')
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($table == '')
|
||||||
|
{
|
||||||
|
show_error('A table name is required for that operation.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($column_name == '')
|
||||||
|
{
|
||||||
|
show_error('A column name is required for that operation.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);
|
||||||
|
|
||||||
|
return $this->db->query($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Column Modify
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param string the column name
|
||||||
|
* @param string the column definition
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function modify_column($table = '', $field = array())
|
||||||
|
{
|
||||||
|
if ($table == '')
|
||||||
|
{
|
||||||
|
show_error('A table name is required for that operation.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// add field info into field array, but we can only do one at a time
|
||||||
|
// so we cycle through
|
||||||
|
|
||||||
|
foreach ($field as $k => $v)
|
||||||
|
{
|
||||||
|
// If no name provided, use the current name
|
||||||
|
if ( ! isset($field[$k]['name']))
|
||||||
|
{
|
||||||
|
$field[$k]['name'] = $k;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->add_field(array($k => $field[$k]));
|
||||||
|
|
||||||
|
if (count($this->fields) == 0)
|
||||||
|
{
|
||||||
|
show_error('Field information is required.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields);
|
||||||
|
|
||||||
|
$this->_reset();
|
||||||
|
|
||||||
|
if ($this->db->query($sql) === FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset
|
||||||
|
*
|
||||||
|
* Resets table creation vars
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _reset()
|
||||||
|
{
|
||||||
|
$this->fields = array();
|
||||||
|
$this->keys = array();
|
||||||
|
$this->primary_keys = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file DB_forge.php */
|
||||||
|
/* Location: ./system/database/DB_forge.php */
|
410
system/database/DB_result.php
Normal file
410
system/database/DB_result.php
Normal file
@ -0,0 +1,410 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Database Result Class
|
||||||
|
*
|
||||||
|
* This is the platform-independent result class.
|
||||||
|
* This class will not be called directly. Rather, the adapter
|
||||||
|
* class for the specific database will extend and instantiate it.
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_result {
|
||||||
|
|
||||||
|
var $conn_id = NULL;
|
||||||
|
var $result_id = NULL;
|
||||||
|
var $result_array = array();
|
||||||
|
var $result_object = array();
|
||||||
|
var $custom_result_object = array();
|
||||||
|
var $current_row = 0;
|
||||||
|
var $num_rows = 0;
|
||||||
|
var $row_data = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query result. Acts as a wrapper function for the following functions.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string can be "object" or "array"
|
||||||
|
* @return mixed either a result object or array
|
||||||
|
*/
|
||||||
|
public function result($type = 'object')
|
||||||
|
{
|
||||||
|
if ($type == 'array') return $this->result_array();
|
||||||
|
else if ($type == 'object') return $this->result_object();
|
||||||
|
else return $this->custom_result_object($type);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom query result.
|
||||||
|
*
|
||||||
|
* @param class_name A string that represents the type of object you want back
|
||||||
|
* @return array of objects
|
||||||
|
*/
|
||||||
|
public function custom_result_object($class_name)
|
||||||
|
{
|
||||||
|
if (array_key_exists($class_name, $this->custom_result_object))
|
||||||
|
{
|
||||||
|
return $this->custom_result_object[$class_name];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->result_id === FALSE OR $this->num_rows() == 0)
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
// add the data to the object
|
||||||
|
$this->_data_seek(0);
|
||||||
|
$result_object = array();
|
||||||
|
|
||||||
|
while ($row = $this->_fetch_object())
|
||||||
|
{
|
||||||
|
$object = new $class_name();
|
||||||
|
|
||||||
|
foreach ($row as $key => $value)
|
||||||
|
{
|
||||||
|
$object->$key = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result_object[] = $object;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the array
|
||||||
|
return $this->custom_result_object[$class_name] = $result_object;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query result. "object" version.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function result_object()
|
||||||
|
{
|
||||||
|
if (count($this->result_object) > 0)
|
||||||
|
{
|
||||||
|
return $this->result_object;
|
||||||
|
}
|
||||||
|
|
||||||
|
// In the event that query caching is on the result_id variable
|
||||||
|
// will return FALSE since there isn't a valid SQL resource so
|
||||||
|
// we'll simply return an empty array.
|
||||||
|
if ($this->result_id === FALSE OR $this->num_rows() == 0)
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_data_seek(0);
|
||||||
|
while ($row = $this->_fetch_object())
|
||||||
|
{
|
||||||
|
$this->result_object[] = $row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->result_object;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query result. "array" version.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function result_array()
|
||||||
|
{
|
||||||
|
if (count($this->result_array) > 0)
|
||||||
|
{
|
||||||
|
return $this->result_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
// In the event that query caching is on the result_id variable
|
||||||
|
// will return FALSE since there isn't a valid SQL resource so
|
||||||
|
// we'll simply return an empty array.
|
||||||
|
if ($this->result_id === FALSE OR $this->num_rows() == 0)
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_data_seek(0);
|
||||||
|
while ($row = $this->_fetch_assoc())
|
||||||
|
{
|
||||||
|
$this->result_array[] = $row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->result_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query result. Acts as a wrapper function for the following functions.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param string can be "object" or "array"
|
||||||
|
* @return mixed either a result object or array
|
||||||
|
*/
|
||||||
|
public function row($n = 0, $type = 'object')
|
||||||
|
{
|
||||||
|
if ( ! is_numeric($n))
|
||||||
|
{
|
||||||
|
// We cache the row data for subsequent uses
|
||||||
|
if ( ! is_array($this->row_data))
|
||||||
|
{
|
||||||
|
$this->row_data = $this->row_array(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// array_key_exists() instead of isset() to allow for MySQL NULL values
|
||||||
|
if (array_key_exists($n, $this->row_data))
|
||||||
|
{
|
||||||
|
return $this->row_data[$n];
|
||||||
|
}
|
||||||
|
// reset the $n variable if the result was not achieved
|
||||||
|
$n = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($type == 'object') return $this->row_object($n);
|
||||||
|
else if ($type == 'array') return $this->row_array($n);
|
||||||
|
else return $this->custom_row_object($n, $type);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assigns an item into a particular column slot
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function set_row($key, $value = NULL)
|
||||||
|
{
|
||||||
|
// We cache the row data for subsequent uses
|
||||||
|
if ( ! is_array($this->row_data))
|
||||||
|
{
|
||||||
|
$this->row_data = $this->row_array(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($key))
|
||||||
|
{
|
||||||
|
foreach ($key as $k => $v)
|
||||||
|
{
|
||||||
|
$this->row_data[$k] = $v;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($key != '' AND ! is_null($value))
|
||||||
|
{
|
||||||
|
$this->row_data[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a single result row - custom object version
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function custom_row_object($n, $type)
|
||||||
|
{
|
||||||
|
$result = $this->custom_result_object($type);
|
||||||
|
|
||||||
|
if (count($result) == 0)
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($n != $this->current_row AND isset($result[$n]))
|
||||||
|
{
|
||||||
|
$this->current_row = $n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result[$this->current_row];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a single result row - object version
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function row_object($n = 0)
|
||||||
|
{
|
||||||
|
$result = $this->result_object();
|
||||||
|
|
||||||
|
if (count($result) == 0)
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($n != $this->current_row AND isset($result[$n]))
|
||||||
|
{
|
||||||
|
$this->current_row = $n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result[$this->current_row];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a single result row - array version
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function row_array($n = 0)
|
||||||
|
{
|
||||||
|
$result = $this->result_array();
|
||||||
|
|
||||||
|
if (count($result) == 0)
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($n != $this->current_row AND isset($result[$n]))
|
||||||
|
{
|
||||||
|
$this->current_row = $n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result[$this->current_row];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the "first" row
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function first_row($type = 'object')
|
||||||
|
{
|
||||||
|
$result = $this->result($type);
|
||||||
|
|
||||||
|
if (count($result) == 0)
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
return $result[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the "last" row
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function last_row($type = 'object')
|
||||||
|
{
|
||||||
|
$result = $this->result($type);
|
||||||
|
|
||||||
|
if (count($result) == 0)
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
return $result[count($result) -1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the "next" row
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function next_row($type = 'object')
|
||||||
|
{
|
||||||
|
$result = $this->result($type);
|
||||||
|
|
||||||
|
if (count($result) == 0)
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($result[$this->current_row + 1]))
|
||||||
|
{
|
||||||
|
++$this->current_row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result[$this->current_row];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the "previous" row
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
public function previous_row($type = 'object')
|
||||||
|
{
|
||||||
|
$result = $this->result($type);
|
||||||
|
|
||||||
|
if (count($result) == 0)
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($result[$this->current_row - 1]))
|
||||||
|
{
|
||||||
|
--$this->current_row;
|
||||||
|
}
|
||||||
|
return $result[$this->current_row];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The following functions are normally overloaded by the identically named
|
||||||
|
* methods in the platform-specific driver -- except when query caching
|
||||||
|
* is used. When caching is enabled we do not load the other driver.
|
||||||
|
* These functions are primarily here to prevent undefined function errors
|
||||||
|
* when a cached result object is in use. They are not otherwise fully
|
||||||
|
* operational due to the unavailability of the database resource IDs with
|
||||||
|
* cached results.
|
||||||
|
*/
|
||||||
|
public function num_rows() { return $this->num_rows; }
|
||||||
|
public function num_fields() { return 0; }
|
||||||
|
public function list_fields() { return array(); }
|
||||||
|
public function field_data() { return array(); }
|
||||||
|
public function free_result() { return TRUE; }
|
||||||
|
protected function _data_seek() { return TRUE; }
|
||||||
|
protected function _fetch_assoc() { return array(); }
|
||||||
|
protected function _fetch_object() { return array(); }
|
||||||
|
|
||||||
|
}
|
||||||
|
// END DB_result class
|
||||||
|
|
||||||
|
/* End of file DB_result.php */
|
||||||
|
/* Location: ./system/database/DB_result.php */
|
414
system/database/DB_utility.php
Normal file
414
system/database/DB_utility.php
Normal file
@ -0,0 +1,414 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* Code Igniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Database Utility Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_utility extends CI_DB_forge {
|
||||||
|
|
||||||
|
var $db;
|
||||||
|
var $data_cache = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* Grabs the CI super object instance so we can access it.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function __construct()
|
||||||
|
{
|
||||||
|
// Assign the main database object to $this->db
|
||||||
|
$CI =& get_instance();
|
||||||
|
$this->db =& $CI->db;
|
||||||
|
|
||||||
|
log_message('debug', "Database Utility Class Initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List databases
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function list_databases()
|
||||||
|
{
|
||||||
|
// Is there a cached result?
|
||||||
|
if (isset($this->data_cache['db_names']))
|
||||||
|
{
|
||||||
|
return $this->data_cache['db_names'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = $this->db->query($this->_list_databases());
|
||||||
|
$dbs = array();
|
||||||
|
if ($query->num_rows() > 0)
|
||||||
|
{
|
||||||
|
foreach ($query->result_array() as $row)
|
||||||
|
{
|
||||||
|
$dbs[] = current($row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->data_cache['db_names'] = $dbs;
|
||||||
|
return $this->data_cache['db_names'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if a particular database exists
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function database_exists($database_name)
|
||||||
|
{
|
||||||
|
// Some databases won't have access to the list_databases() function, so
|
||||||
|
// this is intended to allow them to override with their own functions as
|
||||||
|
// defined in $driver_utility.php
|
||||||
|
if (method_exists($this, '_database_exists'))
|
||||||
|
{
|
||||||
|
return $this->_database_exists($database_name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return ( ! in_array($database_name, $this->list_databases())) ? FALSE : TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optimize Table
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function optimize_table($table_name)
|
||||||
|
{
|
||||||
|
$sql = $this->_optimize_table($table_name);
|
||||||
|
|
||||||
|
if (is_bool($sql))
|
||||||
|
{
|
||||||
|
show_error('db_must_use_set');
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = $this->db->query($sql);
|
||||||
|
$res = $query->result_array();
|
||||||
|
|
||||||
|
// Note: Due to a bug in current() that affects some versions
|
||||||
|
// of PHP we can not pass function call directly into it
|
||||||
|
return current($res);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optimize Database
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function optimize_database()
|
||||||
|
{
|
||||||
|
$result = array();
|
||||||
|
foreach ($this->db->list_tables() as $table_name)
|
||||||
|
{
|
||||||
|
$sql = $this->_optimize_table($table_name);
|
||||||
|
|
||||||
|
if (is_bool($sql))
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = $this->db->query($sql);
|
||||||
|
|
||||||
|
// Build the result array...
|
||||||
|
// Note: Due to a bug in current() that affects some versions
|
||||||
|
// of PHP we can not pass function call directly into it
|
||||||
|
$res = $query->result_array();
|
||||||
|
$res = current($res);
|
||||||
|
$key = str_replace($this->db->database.'.', '', current($res));
|
||||||
|
$keys = array_keys($res);
|
||||||
|
unset($res[$keys[0]]);
|
||||||
|
|
||||||
|
$result[$key] = $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Repair Table
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function repair_table($table_name)
|
||||||
|
{
|
||||||
|
$sql = $this->_repair_table($table_name);
|
||||||
|
|
||||||
|
if (is_bool($sql))
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = $this->db->query($sql);
|
||||||
|
|
||||||
|
// Note: Due to a bug in current() that affects some versions
|
||||||
|
// of PHP we can not pass function call directly into it
|
||||||
|
$res = $query->result_array();
|
||||||
|
return current($res);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate CSV from a query result object
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param object The query result object
|
||||||
|
* @param string The delimiter - comma by default
|
||||||
|
* @param string The newline character - \n by default
|
||||||
|
* @param string The enclosure - double quote by default
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')
|
||||||
|
{
|
||||||
|
if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
|
||||||
|
{
|
||||||
|
show_error('You must submit a valid result object');
|
||||||
|
}
|
||||||
|
|
||||||
|
$out = '';
|
||||||
|
|
||||||
|
// First generate the headings from the table column names
|
||||||
|
foreach ($query->list_fields() as $name)
|
||||||
|
{
|
||||||
|
$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
|
||||||
|
}
|
||||||
|
|
||||||
|
$out = rtrim($out);
|
||||||
|
$out .= $newline;
|
||||||
|
|
||||||
|
// Next blast through the result array and build out the rows
|
||||||
|
foreach ($query->result_array() as $row)
|
||||||
|
{
|
||||||
|
foreach ($row as $item)
|
||||||
|
{
|
||||||
|
$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;
|
||||||
|
}
|
||||||
|
$out = rtrim($out);
|
||||||
|
$out .= $newline;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate XML data from a query result object
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param object The query result object
|
||||||
|
* @param array Any preferences
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function xml_from_result($query, $params = array())
|
||||||
|
{
|
||||||
|
if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
|
||||||
|
{
|
||||||
|
show_error('You must submit a valid result object');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set our default values
|
||||||
|
foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val)
|
||||||
|
{
|
||||||
|
if ( ! isset($params[$key]))
|
||||||
|
{
|
||||||
|
$params[$key] = $val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create variables for convenience
|
||||||
|
extract($params);
|
||||||
|
|
||||||
|
// Load the xml helper
|
||||||
|
$CI =& get_instance();
|
||||||
|
$CI->load->helper('xml');
|
||||||
|
|
||||||
|
// Generate the result
|
||||||
|
$xml = "<{$root}>".$newline;
|
||||||
|
foreach ($query->result_array() as $row)
|
||||||
|
{
|
||||||
|
$xml .= $tab."<{$element}>".$newline;
|
||||||
|
|
||||||
|
foreach ($row as $key => $val)
|
||||||
|
{
|
||||||
|
$xml .= $tab.$tab."<{$key}>".xml_convert($val)."</{$key}>".$newline;
|
||||||
|
}
|
||||||
|
$xml .= $tab."</{$element}>".$newline;
|
||||||
|
}
|
||||||
|
$xml .= "</$root>".$newline;
|
||||||
|
|
||||||
|
return $xml;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Database Backup
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function backup($params = array())
|
||||||
|
{
|
||||||
|
// If the parameters have not been submitted as an
|
||||||
|
// array then we know that it is simply the table
|
||||||
|
// name, which is a valid short cut.
|
||||||
|
if (is_string($params))
|
||||||
|
{
|
||||||
|
$params = array('tables' => $params);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------
|
||||||
|
|
||||||
|
// Set up our default preferences
|
||||||
|
$prefs = array(
|
||||||
|
'tables' => array(),
|
||||||
|
'ignore' => array(),
|
||||||
|
'filename' => '',
|
||||||
|
'format' => 'gzip', // gzip, zip, txt
|
||||||
|
'add_drop' => TRUE,
|
||||||
|
'add_insert' => TRUE,
|
||||||
|
'newline' => "\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Did the user submit any preferences? If so set them....
|
||||||
|
if (count($params) > 0)
|
||||||
|
{
|
||||||
|
foreach ($prefs as $key => $val)
|
||||||
|
{
|
||||||
|
if (isset($params[$key]))
|
||||||
|
{
|
||||||
|
$prefs[$key] = $params[$key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------
|
||||||
|
|
||||||
|
// Are we backing up a complete database or individual tables?
|
||||||
|
// If no table names were submitted we'll fetch the entire table list
|
||||||
|
if (count($prefs['tables']) == 0)
|
||||||
|
{
|
||||||
|
$prefs['tables'] = $this->db->list_tables();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------
|
||||||
|
|
||||||
|
// Validate the format
|
||||||
|
if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE))
|
||||||
|
{
|
||||||
|
$prefs['format'] = 'txt';
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------
|
||||||
|
|
||||||
|
// Is the encoder supported? If not, we'll either issue an
|
||||||
|
// error or use plain text depending on the debug settings
|
||||||
|
if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode'))
|
||||||
|
OR ($prefs['format'] == 'zip' AND ! @function_exists('gzcompress')))
|
||||||
|
{
|
||||||
|
if ($this->db->db_debug)
|
||||||
|
{
|
||||||
|
return $this->db->display_error('db_unsuported_compression');
|
||||||
|
}
|
||||||
|
|
||||||
|
$prefs['format'] = 'txt';
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------
|
||||||
|
|
||||||
|
// Set the filename if not provided - Only needed with Zip files
|
||||||
|
if ($prefs['filename'] == '' AND $prefs['format'] == 'zip')
|
||||||
|
{
|
||||||
|
$prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database;
|
||||||
|
$prefs['filename'] .= '_'.date('Y-m-d_H-i', time());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------
|
||||||
|
|
||||||
|
// Was a Gzip file requested?
|
||||||
|
if ($prefs['format'] == 'gzip')
|
||||||
|
{
|
||||||
|
return gzencode($this->_backup($prefs));
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------
|
||||||
|
|
||||||
|
// Was a text file requested?
|
||||||
|
if ($prefs['format'] == 'txt')
|
||||||
|
{
|
||||||
|
return $this->_backup($prefs);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------
|
||||||
|
|
||||||
|
// Was a Zip file requested?
|
||||||
|
if ($prefs['format'] == 'zip')
|
||||||
|
{
|
||||||
|
// If they included the .zip file extension we'll remove it
|
||||||
|
if (preg_match("|.+?\.zip$|", $prefs['filename']))
|
||||||
|
{
|
||||||
|
$prefs['filename'] = str_replace('.zip', '', $prefs['filename']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tack on the ".sql" file extension if needed
|
||||||
|
if ( ! preg_match("|.+?\.sql$|", $prefs['filename']))
|
||||||
|
{
|
||||||
|
$prefs['filename'] .= '.sql';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the Zip class and output it
|
||||||
|
|
||||||
|
$CI =& get_instance();
|
||||||
|
$CI->load->library('zip');
|
||||||
|
$CI->zip->add_data($prefs['filename'], $this->_backup($prefs));
|
||||||
|
return $CI->zip->get_zip();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file DB_utility.php */
|
||||||
|
/* Location: ./system/database/DB_utility.php */
|
792
system/database/drivers/cubrid/cubrid_driver.php
Normal file
792
system/database/drivers/cubrid/cubrid_driver.php
Normal file
@ -0,0 +1,792 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author Esen Sagynov
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 2.0.2
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CUBRID Database Adapter Class
|
||||||
|
*
|
||||||
|
* Note: _DB is an extender class that the app controller
|
||||||
|
* creates dynamically based on whether the active record
|
||||||
|
* class is being used or not.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
|
* @category Database
|
||||||
|
* @author Esen Sagynov
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_cubrid_driver extends CI_DB {
|
||||||
|
|
||||||
|
// Default CUBRID Broker port. Will be used unless user
|
||||||
|
// explicitly specifies another one.
|
||||||
|
const DEFAULT_PORT = 33000;
|
||||||
|
|
||||||
|
var $dbdriver = 'cubrid';
|
||||||
|
|
||||||
|
// The character used for escaping - no need in CUBRID
|
||||||
|
var $_escape_char = '';
|
||||||
|
|
||||||
|
// clause and character used for LIKE escape sequences - not used in CUBRID
|
||||||
|
var $_like_escape_str = '';
|
||||||
|
var $_like_escape_chr = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The syntax to count rows is slightly different across different
|
||||||
|
* database engines, so this string appears in each driver and is
|
||||||
|
* used for the count_all() and count_all_results() functions.
|
||||||
|
*/
|
||||||
|
var $_count_string = 'SELECT COUNT(*) AS ';
|
||||||
|
var $_random_keyword = ' RAND()'; // database specific random keyword
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-persistent database connection
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_connect()
|
||||||
|
{
|
||||||
|
// If no port is defined by the user, use the default value
|
||||||
|
if ($this->port == '')
|
||||||
|
{
|
||||||
|
$this->port = self::DEFAULT_PORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
$conn = cubrid_connect($this->hostname, $this->port, $this->database, $this->username, $this->password);
|
||||||
|
|
||||||
|
if ($conn)
|
||||||
|
{
|
||||||
|
// Check if a user wants to run queries in dry, i.e. run the
|
||||||
|
// queries but not commit them.
|
||||||
|
if (isset($this->auto_commit) && ! $this->auto_commit)
|
||||||
|
{
|
||||||
|
cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_TRUE);
|
||||||
|
$this->auto_commit = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $conn;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persistent database connection
|
||||||
|
* In CUBRID persistent DB connection is supported natively in CUBRID
|
||||||
|
* engine which can be configured in the CUBRID Broker configuration
|
||||||
|
* file by setting the CCI_PCONNECT parameter to ON. In that case, all
|
||||||
|
* connections established between the client application and the
|
||||||
|
* server will become persistent. This is calling the same
|
||||||
|
* @cubrid_connect function will establish persisten connection
|
||||||
|
* considering that the CCI_PCONNECT is ON.
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_pconnect()
|
||||||
|
{
|
||||||
|
return $this->db_connect();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reconnect
|
||||||
|
*
|
||||||
|
* Keep / reestablish the db connection if no queries have been
|
||||||
|
* sent for a length of time exceeding the server's idle timeout
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function reconnect()
|
||||||
|
{
|
||||||
|
if (cubrid_ping($this->conn_id) === FALSE)
|
||||||
|
{
|
||||||
|
$this->conn_id = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select the database
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_select()
|
||||||
|
{
|
||||||
|
// In CUBRID there is no need to select a database as the database
|
||||||
|
// is chosen at the connection time.
|
||||||
|
// So, to determine if the database is "selected", all we have to
|
||||||
|
// do is ping the server and return that value.
|
||||||
|
return cubrid_ping($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set client character set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_set_charset($charset, $collation)
|
||||||
|
{
|
||||||
|
// In CUBRID, there is no need to set charset or collation.
|
||||||
|
// This is why returning true will allow the application continue
|
||||||
|
// its normal process.
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version number query string
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _version()
|
||||||
|
{
|
||||||
|
// To obtain the CUBRID Server version, no need to run the SQL query.
|
||||||
|
// CUBRID PHP API provides a function to determin this value.
|
||||||
|
// This is why we also need to add 'cubrid' value to the list of
|
||||||
|
// $driver_version_exceptions array in DB_driver class in
|
||||||
|
// version() function.
|
||||||
|
return cubrid_get_server_info($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the query
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @param string an SQL query
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function _execute($sql)
|
||||||
|
{
|
||||||
|
$sql = $this->_prep_query($sql);
|
||||||
|
return @cubrid_query($sql, $this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prep the query
|
||||||
|
*
|
||||||
|
* If needed, each database adapter can prep the query string
|
||||||
|
*
|
||||||
|
* @access private called by execute()
|
||||||
|
* @param string an SQL query
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _prep_query($sql)
|
||||||
|
{
|
||||||
|
// No need to prepare
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_begin($test_mode = FALSE)
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the transaction failure flag.
|
||||||
|
// If the $test_mode flag is set to TRUE transactions will be rolled back
|
||||||
|
// even if the queries produce a successful result.
|
||||||
|
$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
|
||||||
|
|
||||||
|
if (cubrid_get_autocommit($this->conn_id))
|
||||||
|
{
|
||||||
|
cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Commit Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_commit()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
cubrid_commit($this->conn_id);
|
||||||
|
|
||||||
|
if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
|
||||||
|
{
|
||||||
|
cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rollback Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_rollback()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
cubrid_rollback($this->conn_id);
|
||||||
|
|
||||||
|
if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
|
||||||
|
{
|
||||||
|
cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape String
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param bool whether or not the string will be used in a LIKE condition
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function escape_str($str, $like = FALSE)
|
||||||
|
{
|
||||||
|
if (is_array($str))
|
||||||
|
{
|
||||||
|
foreach ($str as $key => $val)
|
||||||
|
{
|
||||||
|
$str[$key] = $this->escape_str($val, $like);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (function_exists('cubrid_real_escape_string') AND is_resource($this->conn_id))
|
||||||
|
{
|
||||||
|
$str = cubrid_real_escape_string($str, $this->conn_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$str = addslashes($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// escape LIKE condition wildcards
|
||||||
|
if ($like === TRUE)
|
||||||
|
{
|
||||||
|
$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affected Rows
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function affected_rows()
|
||||||
|
{
|
||||||
|
return @cubrid_affected_rows($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert ID
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function insert_id()
|
||||||
|
{
|
||||||
|
return @cubrid_insert_id($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "Count All" query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string that counts all records in
|
||||||
|
* the specified table
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function count_all($table = '')
|
||||||
|
{
|
||||||
|
if ($table == '')
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
|
||||||
|
|
||||||
|
if ($query->num_rows() == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$row = $query->row();
|
||||||
|
$this->_reset_select();
|
||||||
|
return (int) $row->numrows;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string so that the table names can be fetched
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param boolean
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _list_tables($prefix_limit = FALSE)
|
||||||
|
{
|
||||||
|
$sql = "SHOW TABLES";
|
||||||
|
|
||||||
|
if ($prefix_limit !== FALSE AND $this->dbprefix != '')
|
||||||
|
{
|
||||||
|
$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show column query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string so that the column names can be fetched
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _list_columns($table = '')
|
||||||
|
{
|
||||||
|
return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field data query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that the column data can be retrieved
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _field_data($table)
|
||||||
|
{
|
||||||
|
return "SELECT * FROM ".$table." LIMIT 1";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error message string
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _error_message()
|
||||||
|
{
|
||||||
|
return cubrid_error($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error message number
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function _error_number()
|
||||||
|
{
|
||||||
|
return cubrid_errno($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape the SQL Identifiers
|
||||||
|
*
|
||||||
|
* This function escapes column and table names
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _escape_identifiers($item)
|
||||||
|
{
|
||||||
|
if ($this->_escape_char == '')
|
||||||
|
{
|
||||||
|
return $item;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->_reserved_identifiers as $id)
|
||||||
|
{
|
||||||
|
if (strpos($item, '.'.$id) !== FALSE)
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
|
||||||
|
|
||||||
|
// remove duplicates if the user already included the escape
|
||||||
|
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strpos($item, '.') !== FALSE)
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char.$item.$this->_escape_char;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove duplicates if the user already included the escape
|
||||||
|
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From Tables
|
||||||
|
*
|
||||||
|
* This function implicitly groups FROM tables so there is no confusion
|
||||||
|
* about operator precedence in harmony with SQL standards
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param type
|
||||||
|
* @return type
|
||||||
|
*/
|
||||||
|
function _from_tables($tables)
|
||||||
|
{
|
||||||
|
if ( ! is_array($tables))
|
||||||
|
{
|
||||||
|
$tables = array($tables);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '('.implode(', ', $tables).')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific insert string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _insert($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return "INSERT INTO ".$table." (\"".implode('", "', $keys)."\") VALUES (".implode(', ', $values).")";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific replace string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _replace($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return "REPLACE INTO ".$table." (\"".implode('", "', $keys)."\") VALUES (".implode(', ', $values).")";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert_batch statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific insert string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _insert_batch($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return "INSERT INTO ".$table." (\"".implode('", "', $keys)."\") VALUES ".implode(', ', $values);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific update string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the update data
|
||||||
|
* @param array the where clause
|
||||||
|
* @param array the orderby clause
|
||||||
|
* @param array the limit clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
|
||||||
|
{
|
||||||
|
foreach ($values as $key => $val)
|
||||||
|
{
|
||||||
|
$valstr[] = sprintf('"%s" = %s', $key, $val);
|
||||||
|
}
|
||||||
|
|
||||||
|
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||||
|
|
||||||
|
$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
|
||||||
|
|
||||||
|
$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
|
||||||
|
|
||||||
|
$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
|
||||||
|
|
||||||
|
$sql .= $orderby.$limit;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update_Batch statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific batch update string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the update data
|
||||||
|
* @param array the where clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _update_batch($table, $values, $index, $where = NULL)
|
||||||
|
{
|
||||||
|
$ids = array();
|
||||||
|
$where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : '';
|
||||||
|
|
||||||
|
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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = "UPDATE ".$table." SET ";
|
||||||
|
$cases = '';
|
||||||
|
|
||||||
|
foreach ($final as $k => $v)
|
||||||
|
{
|
||||||
|
$cases .= $k.' = CASE '."\n";
|
||||||
|
foreach ($v as $row)
|
||||||
|
{
|
||||||
|
$cases .= $row."\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$cases .= 'ELSE '.$k.' END, ';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= substr($cases, 0, -2);
|
||||||
|
|
||||||
|
$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')';
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncate statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific truncate string from the supplied data
|
||||||
|
* If the database does not support the truncate() command
|
||||||
|
* This function maps to "DELETE FROM table"
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _truncate($table)
|
||||||
|
{
|
||||||
|
return "TRUNCATE ".$table;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific delete string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the where clause
|
||||||
|
* @param string the limit clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _delete($table, $where = array(), $like = array(), $limit = FALSE)
|
||||||
|
{
|
||||||
|
$conditions = '';
|
||||||
|
|
||||||
|
if (count($where) > 0 OR count($like) > 0)
|
||||||
|
{
|
||||||
|
$conditions = "\nWHERE ";
|
||||||
|
$conditions .= implode("\n", $this->ar_where);
|
||||||
|
|
||||||
|
if (count($where) > 0 && count($like) > 0)
|
||||||
|
{
|
||||||
|
$conditions .= " AND ";
|
||||||
|
}
|
||||||
|
$conditions .= implode("\n", $like);
|
||||||
|
}
|
||||||
|
|
||||||
|
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||||
|
|
||||||
|
return "DELETE FROM ".$table.$conditions.$limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Limit string
|
||||||
|
*
|
||||||
|
* Generates a platform-specific LIMIT clause
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the sql query string
|
||||||
|
* @param integer the number of rows to limit the query to
|
||||||
|
* @param integer the offset value
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _limit($sql, $limit, $offset)
|
||||||
|
{
|
||||||
|
if ($offset == 0)
|
||||||
|
{
|
||||||
|
$offset = '';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$offset .= ", ";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql."LIMIT ".$offset.$limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close DB Connection
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param resource
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _close($conn_id)
|
||||||
|
{
|
||||||
|
@cubrid_close($conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file cubrid_driver.php */
|
||||||
|
/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */
|
288
system/database/drivers/cubrid/cubrid_forge.php
Normal file
288
system/database/drivers/cubrid/cubrid_forge.php
Normal file
@ -0,0 +1,288 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author Esen Sagynov
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CUBRID Forge Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author Esen Sagynov
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_cubrid_forge extends CI_DB_forge {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create database
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _create_database($name)
|
||||||
|
{
|
||||||
|
// CUBRID does not allow to create a database in SQL. The GUI tools
|
||||||
|
// have to be used for this purpose.
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop database
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _drop_database($name)
|
||||||
|
{
|
||||||
|
// CUBRID does not allow to drop a database in SQL. The GUI tools
|
||||||
|
// have to be used for this purpose.
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process Fields
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param mixed the fields
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _process_fields($fields)
|
||||||
|
{
|
||||||
|
$current_field_count = 0;
|
||||||
|
$sql = '';
|
||||||
|
|
||||||
|
foreach ($fields as $field=>$attributes)
|
||||||
|
{
|
||||||
|
// Numeric field names aren't allowed in databases, so if the key is
|
||||||
|
// numeric, we know it was assigned by PHP and the developer manually
|
||||||
|
// entered the field information, so we'll simply add it to the list
|
||||||
|
if (is_numeric($field))
|
||||||
|
{
|
||||||
|
$sql .= "\n\t$attributes";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$attributes = array_change_key_case($attributes, CASE_UPPER);
|
||||||
|
|
||||||
|
$sql .= "\n\t\"" . $this->db->_protect_identifiers($field) . "\"";
|
||||||
|
|
||||||
|
if (array_key_exists('NAME', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('TYPE', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= ' '.$attributes['TYPE'];
|
||||||
|
|
||||||
|
if (array_key_exists('CONSTRAINT', $attributes))
|
||||||
|
{
|
||||||
|
switch ($attributes['TYPE'])
|
||||||
|
{
|
||||||
|
case 'decimal':
|
||||||
|
case 'float':
|
||||||
|
case 'numeric':
|
||||||
|
$sql .= '('.implode(',', $attributes['CONSTRAINT']).')';
|
||||||
|
break;
|
||||||
|
case 'enum': // As of version 8.4.0 CUBRID does not support
|
||||||
|
// enum data type.
|
||||||
|
break;
|
||||||
|
case 'set':
|
||||||
|
$sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$sql .= '('.$attributes['CONSTRAINT'].')';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
|
||||||
|
{
|
||||||
|
//$sql .= ' UNSIGNED';
|
||||||
|
// As of version 8.4.0 CUBRID does not support UNSIGNED INTEGER data type.
|
||||||
|
// Will be supported in the next release as a part of MySQL Compatibility.
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('DEFAULT', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' NULL';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sql .= ' NOT NULL';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' AUTO_INCREMENT';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('UNIQUE', $attributes) && $attributes['UNIQUE'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' UNIQUE';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't add a comma on the end of the last field
|
||||||
|
if (++$current_field_count < count($fields))
|
||||||
|
{
|
||||||
|
$sql .= ',';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create Table
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @param mixed the fields
|
||||||
|
* @param mixed primary key(s)
|
||||||
|
* @param mixed key(s)
|
||||||
|
* @param boolean should 'IF NOT EXISTS' be added to the SQL
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
|
||||||
|
{
|
||||||
|
$sql = 'CREATE TABLE ';
|
||||||
|
|
||||||
|
if ($if_not_exists === TRUE)
|
||||||
|
{
|
||||||
|
//$sql .= 'IF NOT EXISTS ';
|
||||||
|
// As of version 8.4.0 CUBRID does not support this SQL syntax.
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= $this->db->_escape_identifiers($table)." (";
|
||||||
|
|
||||||
|
$sql .= $this->_process_fields($fields);
|
||||||
|
|
||||||
|
// If there is a PK defined
|
||||||
|
if (count($primary_keys) > 0)
|
||||||
|
{
|
||||||
|
$key_name = "pk_" . $table . "_" .
|
||||||
|
$this->db->_protect_identifiers(implode('_', $primary_keys));
|
||||||
|
|
||||||
|
$primary_keys = $this->db->_protect_identifiers($primary_keys);
|
||||||
|
$sql .= ",\n\tCONSTRAINT " . $key_name . " PRIMARY KEY(" . implode(', ', $primary_keys) . ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($keys) && count($keys) > 0)
|
||||||
|
{
|
||||||
|
foreach ($keys as $key)
|
||||||
|
{
|
||||||
|
if (is_array($key))
|
||||||
|
{
|
||||||
|
$key_name = $this->db->_protect_identifiers(implode('_', $key));
|
||||||
|
$key = $this->db->_protect_identifiers($key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$key_name = $this->db->_protect_identifiers($key);
|
||||||
|
$key = array($key_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= ",\n\tKEY \"{$key_name}\" (" . implode(', ', $key) . ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= "\n);";
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop Table
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _drop_table($table)
|
||||||
|
{
|
||||||
|
return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alter table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be altered
|
||||||
|
* Called by add_column(), drop_column(), and column_alter(),
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the ALTER type (ADD, DROP, CHANGE)
|
||||||
|
* @param string the column name
|
||||||
|
* @param array fields
|
||||||
|
* @param string the field after which we should add the new field
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _alter_table($alter_type, $table, $fields, $after_field = '')
|
||||||
|
{
|
||||||
|
$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
|
||||||
|
|
||||||
|
// DROP has everything it needs now.
|
||||||
|
if ($alter_type == 'DROP')
|
||||||
|
{
|
||||||
|
return $sql.$this->db->_protect_identifiers($fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= $this->_process_fields($fields);
|
||||||
|
|
||||||
|
if ($after_field != '')
|
||||||
|
{
|
||||||
|
$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename a table
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be renamed
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the old table name
|
||||||
|
* @param string the new table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _rename_table($table_name, $new_table_name)
|
||||||
|
{
|
||||||
|
$sql = 'RENAME TABLE '.$this->db->_protect_identifiers($table_name)." AS ".$this->db->_protect_identifiers($new_table_name);
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file cubrid_forge.php */
|
||||||
|
/* Location: ./system/database/drivers/cubrid/cubrid_forge.php */
|
202
system/database/drivers/cubrid/cubrid_result.php
Normal file
202
system/database/drivers/cubrid/cubrid_result.php
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author Esen Sagynov
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 2.0.2
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CUBRID Result Class
|
||||||
|
*
|
||||||
|
* This class extends the parent result class: CI_DB_result
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author Esen Sagynov
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_cubrid_result extends CI_DB_result {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of rows in the result set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function num_rows()
|
||||||
|
{
|
||||||
|
return @cubrid_num_rows($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of fields in the result set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function num_fields()
|
||||||
|
{
|
||||||
|
return @cubrid_num_fields($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch Field Names
|
||||||
|
*
|
||||||
|
* Generates an array of column names
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function list_fields()
|
||||||
|
{
|
||||||
|
return cubrid_column_names($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field data
|
||||||
|
*
|
||||||
|
* Generates an array of objects containing field meta-data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function field_data()
|
||||||
|
{
|
||||||
|
$retval = array();
|
||||||
|
|
||||||
|
$tablePrimaryKeys = array();
|
||||||
|
|
||||||
|
while ($field = cubrid_fetch_field($this->result_id))
|
||||||
|
{
|
||||||
|
$F = new stdClass();
|
||||||
|
$F->name = $field->name;
|
||||||
|
$F->type = $field->type;
|
||||||
|
$F->default = $field->def;
|
||||||
|
$F->max_length = $field->max_length;
|
||||||
|
|
||||||
|
// At this moment primary_key property is not returned when
|
||||||
|
// cubrid_fetch_field is called. The following code will
|
||||||
|
// provide a patch for it. primary_key property will be added
|
||||||
|
// in the next release.
|
||||||
|
|
||||||
|
// TODO: later version of CUBRID will provide primary_key
|
||||||
|
// property.
|
||||||
|
// When PK is defined in CUBRID, an index is automatically
|
||||||
|
// created in the db_index system table in the form of
|
||||||
|
// pk_tblname_fieldname. So the following will count how many
|
||||||
|
// columns are there which satisfy this format.
|
||||||
|
// The query will search for exact single columns, thus
|
||||||
|
// compound PK is not supported.
|
||||||
|
$res = cubrid_query($this->conn_id,
|
||||||
|
"SELECT COUNT(*) FROM db_index WHERE class_name = '" . $field->table .
|
||||||
|
"' AND is_primary_key = 'YES' AND index_name = 'pk_" .
|
||||||
|
$field->table . "_" . $field->name . "'"
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($res)
|
||||||
|
{
|
||||||
|
$row = cubrid_fetch_array($res, CUBRID_NUM);
|
||||||
|
$F->primary_key = ($row[0] > 0 ? 1 : null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$F->primary_key = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_resource($res))
|
||||||
|
{
|
||||||
|
cubrid_close_request($res);
|
||||||
|
$this->result_id = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$retval[] = $F;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the result
|
||||||
|
*
|
||||||
|
* @return null
|
||||||
|
*/
|
||||||
|
function free_result()
|
||||||
|
{
|
||||||
|
if(is_resource($this->result_id) ||
|
||||||
|
get_resource_type($this->result_id) == "Unknown" &&
|
||||||
|
preg_match('/Resource id #/', strval($this->result_id)))
|
||||||
|
{
|
||||||
|
cubrid_close_request($this->result_id);
|
||||||
|
$this->result_id = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Seek
|
||||||
|
*
|
||||||
|
* Moves the internal pointer to the desired offset. We call
|
||||||
|
* this internally before fetching results to make sure the
|
||||||
|
* result set starts at zero
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function _data_seek($n = 0)
|
||||||
|
{
|
||||||
|
return cubrid_data_seek($this->result_id, $n);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result - associative array
|
||||||
|
*
|
||||||
|
* Returns the result set as an array
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function _fetch_assoc()
|
||||||
|
{
|
||||||
|
return cubrid_fetch_assoc($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result - object
|
||||||
|
*
|
||||||
|
* Returns the result set as an object
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _fetch_object()
|
||||||
|
{
|
||||||
|
return cubrid_fetch_object($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file cubrid_result.php */
|
||||||
|
/* Location: ./system/database/drivers/cubrid/cubrid_result.php */
|
108
system/database/drivers/cubrid/cubrid_utility.php
Normal file
108
system/database/drivers/cubrid/cubrid_utility.php
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author Esen Sagynov
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CUBRID Utility Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author Esen Sagynov
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_cubrid_utility extends CI_DB_utility {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List databases
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function _list_databases()
|
||||||
|
{
|
||||||
|
// CUBRID does not allow to see the list of all databases on the
|
||||||
|
// server. It is the way its architecture is designed. Every
|
||||||
|
// database is independent and isolated.
|
||||||
|
// For this reason we can return only the name of the currect
|
||||||
|
// connected database.
|
||||||
|
if ($this->conn_id)
|
||||||
|
{
|
||||||
|
return "SELECT '" . $this->database . "'";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optimize table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be optimized
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
* @link http://www.cubrid.org/manual/840/en/Optimize%20Database
|
||||||
|
*/
|
||||||
|
function _optimize_table($table)
|
||||||
|
{
|
||||||
|
// No SQL based support in CUBRID as of version 8.4.0. Database or
|
||||||
|
// table optimization can be performed using CUBRID Manager
|
||||||
|
// database administration tool. See the link above for more info.
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Repair table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be repaired
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
* @link http://www.cubrid.org/manual/840/en/Checking%20Database%20Consistency
|
||||||
|
*/
|
||||||
|
function _repair_table($table)
|
||||||
|
{
|
||||||
|
// Not supported in CUBRID as of version 8.4.0. Database or
|
||||||
|
// table consistency can be checked using CUBRID Manager
|
||||||
|
// database administration tool. See the link above for more info.
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* CUBRID Export
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param array Preferences
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function _backup($params = array())
|
||||||
|
{
|
||||||
|
// No SQL based support in CUBRID as of version 8.4.0. Database or
|
||||||
|
// table backup can be performed using CUBRID Manager
|
||||||
|
// database administration tool.
|
||||||
|
return $this->db->display_error('db_unsuported_feature');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file cubrid_utility.php */
|
||||||
|
/* Location: ./system/database/drivers/cubrid/cubrid_utility.php */
|
10
system/database/drivers/cubrid/index.html
Normal file
10
system/database/drivers/cubrid/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
10
system/database/drivers/index.html
Normal file
10
system/database/drivers/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
10
system/database/drivers/mssql/index.html
Normal file
10
system/database/drivers/mssql/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
667
system/database/drivers/mssql/mssql_driver.php
Normal file
667
system/database/drivers/mssql/mssql_driver.php
Normal file
@ -0,0 +1,667 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MS SQL Database Adapter Class
|
||||||
|
*
|
||||||
|
* Note: _DB is an extender class that the app controller
|
||||||
|
* creates dynamically based on whether the active record
|
||||||
|
* class is being used or not.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mssql_driver extends CI_DB {
|
||||||
|
|
||||||
|
var $dbdriver = 'mssql';
|
||||||
|
|
||||||
|
// The character used for escaping
|
||||||
|
var $_escape_char = '';
|
||||||
|
|
||||||
|
// clause and character used for LIKE escape sequences
|
||||||
|
var $_like_escape_str = " ESCAPE '%s' ";
|
||||||
|
var $_like_escape_chr = '!';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The syntax to count rows is slightly different across different
|
||||||
|
* database engines, so this string appears in each driver and is
|
||||||
|
* used for the count_all() and count_all_results() functions.
|
||||||
|
*/
|
||||||
|
var $_count_string = "SELECT COUNT(*) AS ";
|
||||||
|
var $_random_keyword = ' ASC'; // not currently supported
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-persistent database connection
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_connect()
|
||||||
|
{
|
||||||
|
if ($this->port != '')
|
||||||
|
{
|
||||||
|
$this->hostname .= ','.$this->port;
|
||||||
|
}
|
||||||
|
|
||||||
|
return @mssql_connect($this->hostname, $this->username, $this->password);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persistent database connection
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_pconnect()
|
||||||
|
{
|
||||||
|
if ($this->port != '')
|
||||||
|
{
|
||||||
|
$this->hostname .= ','.$this->port;
|
||||||
|
}
|
||||||
|
|
||||||
|
return @mssql_pconnect($this->hostname, $this->username, $this->password);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reconnect
|
||||||
|
*
|
||||||
|
* Keep / reestablish the db connection if no queries have been
|
||||||
|
* sent for a length of time exceeding the server's idle timeout
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function reconnect()
|
||||||
|
{
|
||||||
|
// not implemented in MSSQL
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select the database
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_select()
|
||||||
|
{
|
||||||
|
// Note: The brackets are required in the event that the DB name
|
||||||
|
// contains reserved characters
|
||||||
|
return @mssql_select_db('['.$this->database.']', $this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set client character set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_set_charset($charset, $collation)
|
||||||
|
{
|
||||||
|
// @todo - add support if needed
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the query
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @param string an SQL query
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function _execute($sql)
|
||||||
|
{
|
||||||
|
$sql = $this->_prep_query($sql);
|
||||||
|
return @mssql_query($sql, $this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prep the query
|
||||||
|
*
|
||||||
|
* If needed, each database adapter can prep the query string
|
||||||
|
*
|
||||||
|
* @access private called by execute()
|
||||||
|
* @param string an SQL query
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _prep_query($sql)
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_begin($test_mode = FALSE)
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the transaction failure flag.
|
||||||
|
// If the $test_mode flag is set to TRUE transactions will be rolled back
|
||||||
|
// even if the queries produce a successful result.
|
||||||
|
$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
|
||||||
|
|
||||||
|
$this->simple_query('BEGIN TRAN');
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Commit Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_commit()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->simple_query('COMMIT TRAN');
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rollback Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_rollback()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->simple_query('ROLLBACK TRAN');
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape String
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param bool whether or not the string will be used in a LIKE condition
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function escape_str($str, $like = FALSE)
|
||||||
|
{
|
||||||
|
if (is_array($str))
|
||||||
|
{
|
||||||
|
foreach ($str as $key => $val)
|
||||||
|
{
|
||||||
|
$str[$key] = $this->escape_str($val, $like);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Escape single quotes
|
||||||
|
$str = str_replace("'", "''", remove_invisible_characters($str));
|
||||||
|
|
||||||
|
// escape LIKE condition wildcards
|
||||||
|
if ($like === TRUE)
|
||||||
|
{
|
||||||
|
$str = str_replace(
|
||||||
|
array($this->_like_escape_chr, '%', '_'),
|
||||||
|
array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'),
|
||||||
|
$str
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affected Rows
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function affected_rows()
|
||||||
|
{
|
||||||
|
return @mssql_rows_affected($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert ID
|
||||||
|
*
|
||||||
|
* Returns the last id created in the Identity column.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function insert_id()
|
||||||
|
{
|
||||||
|
$ver = self::_parse_major_version($this->version());
|
||||||
|
$sql = ($ver >= 8 ? "SELECT SCOPE_IDENTITY() AS last_id" : "SELECT @@IDENTITY AS last_id");
|
||||||
|
$query = $this->query($sql);
|
||||||
|
$row = $query->row();
|
||||||
|
return $row->last_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse major version
|
||||||
|
*
|
||||||
|
* Grabs the major version number from the
|
||||||
|
* database server version string passed in.
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string $version
|
||||||
|
* @return int16 major version number
|
||||||
|
*/
|
||||||
|
function _parse_major_version($version)
|
||||||
|
{
|
||||||
|
preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info);
|
||||||
|
return $ver_info[1]; // return the major version b/c that's all we're interested in.
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version number query string
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _version()
|
||||||
|
{
|
||||||
|
return "SELECT @@VERSION AS ver";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "Count All" query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string that counts all records in
|
||||||
|
* the specified database
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function count_all($table = '')
|
||||||
|
{
|
||||||
|
if ($table == '')
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
|
||||||
|
|
||||||
|
if ($query->num_rows() == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$row = $query->row();
|
||||||
|
$this->_reset_select();
|
||||||
|
return (int) $row->numrows;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string so that the table names can be fetched
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param boolean
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _list_tables($prefix_limit = FALSE)
|
||||||
|
{
|
||||||
|
$sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name";
|
||||||
|
|
||||||
|
// for future compatibility
|
||||||
|
if ($prefix_limit !== FALSE AND $this->dbprefix != '')
|
||||||
|
{
|
||||||
|
//$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr);
|
||||||
|
return FALSE; // not currently supported
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List column query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string so that the column names can be fetched
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _list_columns($table = '')
|
||||||
|
{
|
||||||
|
return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$table."'";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field data query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that the column data can be retrieved
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _field_data($table)
|
||||||
|
{
|
||||||
|
return "SELECT TOP 1 * FROM ".$table;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error message string
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _error_message()
|
||||||
|
{
|
||||||
|
return mssql_get_last_message();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error message number
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function _error_number()
|
||||||
|
{
|
||||||
|
// Are error numbers supported?
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape the SQL Identifiers
|
||||||
|
*
|
||||||
|
* This function escapes column and table names
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _escape_identifiers($item)
|
||||||
|
{
|
||||||
|
if ($this->_escape_char == '')
|
||||||
|
{
|
||||||
|
return $item;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->_reserved_identifiers as $id)
|
||||||
|
{
|
||||||
|
if (strpos($item, '.'.$id) !== FALSE)
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
|
||||||
|
|
||||||
|
// remove duplicates if the user already included the escape
|
||||||
|
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strpos($item, '.') !== FALSE)
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char.$item.$this->_escape_char;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove duplicates if the user already included the escape
|
||||||
|
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From Tables
|
||||||
|
*
|
||||||
|
* This function implicitly groups FROM tables so there is no confusion
|
||||||
|
* about operator precedence in harmony with SQL standards
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param type
|
||||||
|
* @return type
|
||||||
|
*/
|
||||||
|
function _from_tables($tables)
|
||||||
|
{
|
||||||
|
if ( ! is_array($tables))
|
||||||
|
{
|
||||||
|
$tables = array($tables);
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode(', ', $tables);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific insert string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _insert($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific update string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the update data
|
||||||
|
* @param array the where clause
|
||||||
|
* @param array the orderby clause
|
||||||
|
* @param array the limit clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
|
||||||
|
{
|
||||||
|
foreach ($values as $key => $val)
|
||||||
|
{
|
||||||
|
$valstr[] = $key." = ".$val;
|
||||||
|
}
|
||||||
|
|
||||||
|
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||||
|
|
||||||
|
$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
|
||||||
|
|
||||||
|
$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
|
||||||
|
|
||||||
|
$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
|
||||||
|
|
||||||
|
$sql .= $orderby.$limit;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncate statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific truncate string from the supplied data
|
||||||
|
* If the database does not support the truncate() command
|
||||||
|
* This function maps to "DELETE FROM table"
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _truncate($table)
|
||||||
|
{
|
||||||
|
return "TRUNCATE ".$table;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific delete string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the where clause
|
||||||
|
* @param string the limit clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _delete($table, $where = array(), $like = array(), $limit = FALSE)
|
||||||
|
{
|
||||||
|
$conditions = '';
|
||||||
|
|
||||||
|
if (count($where) > 0 OR count($like) > 0)
|
||||||
|
{
|
||||||
|
$conditions = "\nWHERE ";
|
||||||
|
$conditions .= implode("\n", $this->ar_where);
|
||||||
|
|
||||||
|
if (count($where) > 0 && count($like) > 0)
|
||||||
|
{
|
||||||
|
$conditions .= " AND ";
|
||||||
|
}
|
||||||
|
$conditions .= implode("\n", $like);
|
||||||
|
}
|
||||||
|
|
||||||
|
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||||
|
|
||||||
|
return "DELETE FROM ".$table.$conditions.$limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Limit string
|
||||||
|
*
|
||||||
|
* Generates a platform-specific LIMIT clause
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the sql query string
|
||||||
|
* @param integer the number of rows to limit the query to
|
||||||
|
* @param integer the offset value
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _limit($sql, $limit, $offset)
|
||||||
|
{
|
||||||
|
$i = $limit + $offset;
|
||||||
|
|
||||||
|
return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close DB Connection
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param resource
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _close($conn_id)
|
||||||
|
{
|
||||||
|
@mssql_close($conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file mssql_driver.php */
|
||||||
|
/* Location: ./system/database/drivers/mssql/mssql_driver.php */
|
248
system/database/drivers/mssql/mssql_forge.php
Normal file
248
system/database/drivers/mssql/mssql_forge.php
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MS SQL Forge Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mssql_forge extends CI_DB_forge {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create database
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _create_database($name)
|
||||||
|
{
|
||||||
|
return "CREATE DATABASE ".$name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop database
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _drop_database($name)
|
||||||
|
{
|
||||||
|
return "DROP DATABASE ".$name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop Table
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _drop_table($table)
|
||||||
|
{
|
||||||
|
return "DROP TABLE ".$this->db->_escape_identifiers($table);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create Table
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the fields
|
||||||
|
* @param mixed primary key(s)
|
||||||
|
* @param mixed key(s)
|
||||||
|
* @param boolean should 'IF NOT EXISTS' be added to the SQL
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
|
||||||
|
{
|
||||||
|
$sql = 'CREATE TABLE ';
|
||||||
|
|
||||||
|
if ($if_not_exists === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= 'IF NOT EXISTS ';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= $this->db->_escape_identifiers($table)." (";
|
||||||
|
$current_field_count = 0;
|
||||||
|
|
||||||
|
foreach ($fields as $field=>$attributes)
|
||||||
|
{
|
||||||
|
// Numeric field names aren't allowed in databases, so if the key is
|
||||||
|
// numeric, we know it was assigned by PHP and the developer manually
|
||||||
|
// entered the field information, so we'll simply add it to the list
|
||||||
|
if (is_numeric($field))
|
||||||
|
{
|
||||||
|
$sql .= "\n\t$attributes";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$attributes = array_change_key_case($attributes, CASE_UPPER);
|
||||||
|
|
||||||
|
$sql .= "\n\t".$this->db->_protect_identifiers($field);
|
||||||
|
|
||||||
|
$sql .= ' '.$attributes['TYPE'];
|
||||||
|
|
||||||
|
if (array_key_exists('CONSTRAINT', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= '('.$attributes['CONSTRAINT'].')';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' UNSIGNED';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('DEFAULT', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' NULL';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sql .= ' NOT NULL';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' AUTO_INCREMENT';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't add a comma on the end of the last field
|
||||||
|
if (++$current_field_count < count($fields))
|
||||||
|
{
|
||||||
|
$sql .= ',';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($primary_keys) > 0)
|
||||||
|
{
|
||||||
|
$primary_keys = $this->db->_protect_identifiers($primary_keys);
|
||||||
|
$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($keys) && count($keys) > 0)
|
||||||
|
{
|
||||||
|
foreach ($keys as $key)
|
||||||
|
{
|
||||||
|
if (is_array($key))
|
||||||
|
{
|
||||||
|
$key = $this->db->_protect_identifiers($key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$key = array($this->db->_protect_identifiers($key));
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= "\n)";
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alter table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be altered
|
||||||
|
* Called by add_column(), drop_column(), and column_alter(),
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the ALTER type (ADD, DROP, CHANGE)
|
||||||
|
* @param string the column name
|
||||||
|
* @param string the table name
|
||||||
|
* @param string the column definition
|
||||||
|
* @param string the default value
|
||||||
|
* @param boolean should 'NOT NULL' be added
|
||||||
|
* @param string the field after which we should add the new field
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
|
||||||
|
{
|
||||||
|
$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
|
||||||
|
|
||||||
|
// DROP has everything it needs now.
|
||||||
|
if ($alter_type == 'DROP')
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= " $column_definition";
|
||||||
|
|
||||||
|
if ($default_value != '')
|
||||||
|
{
|
||||||
|
$sql .= " DEFAULT \"$default_value\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($null === NULL)
|
||||||
|
{
|
||||||
|
$sql .= ' NULL';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sql .= ' NOT NULL';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($after_field != '')
|
||||||
|
{
|
||||||
|
$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename a table
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be renamed
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the old table name
|
||||||
|
* @param string the new table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _rename_table($table_name, $new_table_name)
|
||||||
|
{
|
||||||
|
// I think this syntax will work, but can find little documentation on renaming tables in MSSQL
|
||||||
|
$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file mssql_forge.php */
|
||||||
|
/* Location: ./system/database/drivers/mssql/mssql_forge.php */
|
169
system/database/drivers/mssql/mssql_result.php
Normal file
169
system/database/drivers/mssql/mssql_result.php
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MS SQL Result Class
|
||||||
|
*
|
||||||
|
* This class extends the parent result class: CI_DB_result
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mssql_result extends CI_DB_result {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of rows in the result set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function num_rows()
|
||||||
|
{
|
||||||
|
return @mssql_num_rows($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of fields in the result set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function num_fields()
|
||||||
|
{
|
||||||
|
return @mssql_num_fields($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch Field Names
|
||||||
|
*
|
||||||
|
* Generates an array of column names
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function list_fields()
|
||||||
|
{
|
||||||
|
$field_names = array();
|
||||||
|
while ($field = mssql_fetch_field($this->result_id))
|
||||||
|
{
|
||||||
|
$field_names[] = $field->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $field_names;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field data
|
||||||
|
*
|
||||||
|
* Generates an array of objects containing field meta-data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function field_data()
|
||||||
|
{
|
||||||
|
$retval = array();
|
||||||
|
while ($field = mssql_fetch_field($this->result_id))
|
||||||
|
{
|
||||||
|
$F = new stdClass();
|
||||||
|
$F->name = $field->name;
|
||||||
|
$F->type = $field->type;
|
||||||
|
$F->max_length = $field->max_length;
|
||||||
|
$F->primary_key = 0;
|
||||||
|
$F->default = '';
|
||||||
|
|
||||||
|
$retval[] = $F;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the result
|
||||||
|
*
|
||||||
|
* @return null
|
||||||
|
*/
|
||||||
|
function free_result()
|
||||||
|
{
|
||||||
|
if (is_resource($this->result_id))
|
||||||
|
{
|
||||||
|
mssql_free_result($this->result_id);
|
||||||
|
$this->result_id = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Seek
|
||||||
|
*
|
||||||
|
* Moves the internal pointer to the desired offset. We call
|
||||||
|
* this internally before fetching results to make sure the
|
||||||
|
* result set starts at zero
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function _data_seek($n = 0)
|
||||||
|
{
|
||||||
|
return mssql_data_seek($this->result_id, $n);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result - associative array
|
||||||
|
*
|
||||||
|
* Returns the result set as an array
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function _fetch_assoc()
|
||||||
|
{
|
||||||
|
return mssql_fetch_assoc($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result - object
|
||||||
|
*
|
||||||
|
* Returns the result set as an object
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _fetch_object()
|
||||||
|
{
|
||||||
|
return mssql_fetch_object($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file mssql_result.php */
|
||||||
|
/* Location: ./system/database/drivers/mssql/mssql_result.php */
|
88
system/database/drivers/mssql/mssql_utility.php
Normal file
88
system/database/drivers/mssql/mssql_utility.php
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MS SQL Utility Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mssql_utility extends CI_DB_utility {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List databases
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _list_databases()
|
||||||
|
{
|
||||||
|
return "EXEC sp_helpdb"; // Can also be: EXEC sp_databases
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optimize table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be optimized
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _optimize_table($table)
|
||||||
|
{
|
||||||
|
return FALSE; // Is this supported in MS SQL?
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Repair table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be repaired
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _repair_table($table)
|
||||||
|
{
|
||||||
|
return FALSE; // Is this supported in MS SQL?
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MSSQL Export
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param array Preferences
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function _backup($params = array())
|
||||||
|
{
|
||||||
|
// Currently unsupported
|
||||||
|
return $this->db->display_error('db_unsuported_feature');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file mssql_utility.php */
|
||||||
|
/* Location: ./system/database/drivers/mssql/mssql_utility.php */
|
10
system/database/drivers/mysql/index.html
Normal file
10
system/database/drivers/mysql/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
779
system/database/drivers/mysql/mysql_driver.php
Normal file
779
system/database/drivers/mysql/mysql_driver.php
Normal file
@ -0,0 +1,779 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQL Database Adapter Class
|
||||||
|
*
|
||||||
|
* Note: _DB is an extender class that the app controller
|
||||||
|
* creates dynamically based on whether the active record
|
||||||
|
* class is being used or not.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mysql_driver extends CI_DB {
|
||||||
|
|
||||||
|
var $dbdriver = 'mysql';
|
||||||
|
|
||||||
|
// The character used for escaping
|
||||||
|
var $_escape_char = '`';
|
||||||
|
|
||||||
|
// clause and character used for LIKE escape sequences - not used in MySQL
|
||||||
|
var $_like_escape_str = '';
|
||||||
|
var $_like_escape_chr = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to use the MySQL "delete hack" which allows the number
|
||||||
|
* of affected rows to be shown. Uses a preg_replace when enabled,
|
||||||
|
* adding a bit more processing to all queries.
|
||||||
|
*/
|
||||||
|
var $delete_hack = TRUE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The syntax to count rows is slightly different across different
|
||||||
|
* database engines, so this string appears in each driver and is
|
||||||
|
* used for the count_all() and count_all_results() functions.
|
||||||
|
*/
|
||||||
|
var $_count_string = 'SELECT COUNT(*) AS ';
|
||||||
|
var $_random_keyword = ' RAND()'; // database specific random keyword
|
||||||
|
|
||||||
|
// whether SET NAMES must be used to set the character set
|
||||||
|
var $use_set_names;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-persistent database connection
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_connect()
|
||||||
|
{
|
||||||
|
if ($this->port != '')
|
||||||
|
{
|
||||||
|
$this->hostname .= ':'.$this->port;
|
||||||
|
}
|
||||||
|
|
||||||
|
return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persistent database connection
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_pconnect()
|
||||||
|
{
|
||||||
|
if ($this->port != '')
|
||||||
|
{
|
||||||
|
$this->hostname .= ':'.$this->port;
|
||||||
|
}
|
||||||
|
|
||||||
|
return @mysql_pconnect($this->hostname, $this->username, $this->password);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reconnect
|
||||||
|
*
|
||||||
|
* Keep / reestablish the db connection if no queries have been
|
||||||
|
* sent for a length of time exceeding the server's idle timeout
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function reconnect()
|
||||||
|
{
|
||||||
|
if (mysql_ping($this->conn_id) === FALSE)
|
||||||
|
{
|
||||||
|
$this->conn_id = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select the database
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_select()
|
||||||
|
{
|
||||||
|
return @mysql_select_db($this->database, $this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set client character set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_set_charset($charset, $collation)
|
||||||
|
{
|
||||||
|
if ( ! isset($this->use_set_names))
|
||||||
|
{
|
||||||
|
// mysql_set_charset() requires PHP >= 5.2.3 and MySQL >= 5.0.7, use SET NAMES as fallback
|
||||||
|
$this->use_set_names = (version_compare(PHP_VERSION, '5.2.3', '>=') && version_compare(mysql_get_server_info(), '5.0.7', '>=')) ? FALSE : TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->use_set_names === TRUE)
|
||||||
|
{
|
||||||
|
return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return @mysql_set_charset($charset, $this->conn_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version number query string
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _version()
|
||||||
|
{
|
||||||
|
return "SELECT version() AS ver";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the query
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @param string an SQL query
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function _execute($sql)
|
||||||
|
{
|
||||||
|
$sql = $this->_prep_query($sql);
|
||||||
|
return @mysql_query($sql, $this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prep the query
|
||||||
|
*
|
||||||
|
* If needed, each database adapter can prep the query string
|
||||||
|
*
|
||||||
|
* @access private called by execute()
|
||||||
|
* @param string an SQL query
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _prep_query($sql)
|
||||||
|
{
|
||||||
|
// "DELETE FROM TABLE" returns 0 affected rows This hack modifies
|
||||||
|
// the query so that it returns the number of affected rows
|
||||||
|
if ($this->delete_hack === TRUE)
|
||||||
|
{
|
||||||
|
if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
|
||||||
|
{
|
||||||
|
$sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_begin($test_mode = FALSE)
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the transaction failure flag.
|
||||||
|
// If the $test_mode flag is set to TRUE transactions will be rolled back
|
||||||
|
// even if the queries produce a successful result.
|
||||||
|
$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
|
||||||
|
|
||||||
|
$this->simple_query('SET AUTOCOMMIT=0');
|
||||||
|
$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Commit Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_commit()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->simple_query('COMMIT');
|
||||||
|
$this->simple_query('SET AUTOCOMMIT=1');
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rollback Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_rollback()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->simple_query('ROLLBACK');
|
||||||
|
$this->simple_query('SET AUTOCOMMIT=1');
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape String
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param bool whether or not the string will be used in a LIKE condition
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function escape_str($str, $like = FALSE)
|
||||||
|
{
|
||||||
|
if (is_array($str))
|
||||||
|
{
|
||||||
|
foreach ($str as $key => $val)
|
||||||
|
{
|
||||||
|
$str[$key] = $this->escape_str($val, $like);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))
|
||||||
|
{
|
||||||
|
$str = mysql_real_escape_string($str, $this->conn_id);
|
||||||
|
}
|
||||||
|
elseif (function_exists('mysql_escape_string'))
|
||||||
|
{
|
||||||
|
$str = mysql_escape_string($str);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$str = addslashes($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// escape LIKE condition wildcards
|
||||||
|
if ($like === TRUE)
|
||||||
|
{
|
||||||
|
$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affected Rows
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function affected_rows()
|
||||||
|
{
|
||||||
|
return @mysql_affected_rows($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert ID
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function insert_id()
|
||||||
|
{
|
||||||
|
return @mysql_insert_id($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "Count All" query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string that counts all records in
|
||||||
|
* the specified database
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function count_all($table = '')
|
||||||
|
{
|
||||||
|
if ($table == '')
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
|
||||||
|
|
||||||
|
if ($query->num_rows() == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$row = $query->row();
|
||||||
|
$this->_reset_select();
|
||||||
|
return (int) $row->numrows;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string so that the table names can be fetched
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param boolean
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _list_tables($prefix_limit = FALSE)
|
||||||
|
{
|
||||||
|
$sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;
|
||||||
|
|
||||||
|
if ($prefix_limit !== FALSE AND $this->dbprefix != '')
|
||||||
|
{
|
||||||
|
$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show column query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string so that the column names can be fetched
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _list_columns($table = '')
|
||||||
|
{
|
||||||
|
return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field data query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that the column data can be retrieved
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _field_data($table)
|
||||||
|
{
|
||||||
|
return "DESCRIBE ".$table;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error message string
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _error_message()
|
||||||
|
{
|
||||||
|
return mysql_error($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error message number
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function _error_number()
|
||||||
|
{
|
||||||
|
return mysql_errno($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape the SQL Identifiers
|
||||||
|
*
|
||||||
|
* This function escapes column and table names
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _escape_identifiers($item)
|
||||||
|
{
|
||||||
|
if ($this->_escape_char == '')
|
||||||
|
{
|
||||||
|
return $item;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->_reserved_identifiers as $id)
|
||||||
|
{
|
||||||
|
if (strpos($item, '.'.$id) !== FALSE)
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
|
||||||
|
|
||||||
|
// remove duplicates if the user already included the escape
|
||||||
|
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strpos($item, '.') !== FALSE)
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char.$item.$this->_escape_char;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove duplicates if the user already included the escape
|
||||||
|
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From Tables
|
||||||
|
*
|
||||||
|
* This function implicitly groups FROM tables so there is no confusion
|
||||||
|
* about operator precedence in harmony with SQL standards
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param type
|
||||||
|
* @return type
|
||||||
|
*/
|
||||||
|
function _from_tables($tables)
|
||||||
|
{
|
||||||
|
if ( ! is_array($tables))
|
||||||
|
{
|
||||||
|
$tables = array($tables);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '('.implode(', ', $tables).')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific insert string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _insert($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific replace string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _replace($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert_batch statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific insert string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _insert_batch($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific update string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the update data
|
||||||
|
* @param array the where clause
|
||||||
|
* @param array the orderby clause
|
||||||
|
* @param array the limit clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
|
||||||
|
{
|
||||||
|
foreach ($values as $key => $val)
|
||||||
|
{
|
||||||
|
$valstr[] = $key . ' = ' . $val;
|
||||||
|
}
|
||||||
|
|
||||||
|
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||||
|
|
||||||
|
$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
|
||||||
|
|
||||||
|
$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
|
||||||
|
|
||||||
|
$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
|
||||||
|
|
||||||
|
$sql .= $orderby.$limit;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update_Batch statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific batch update string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the update data
|
||||||
|
* @param array the where clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _update_batch($table, $values, $index, $where = NULL)
|
||||||
|
{
|
||||||
|
$ids = array();
|
||||||
|
$where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : '';
|
||||||
|
|
||||||
|
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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = "UPDATE ".$table." SET ";
|
||||||
|
$cases = '';
|
||||||
|
|
||||||
|
foreach ($final as $k => $v)
|
||||||
|
{
|
||||||
|
$cases .= $k.' = CASE '."\n";
|
||||||
|
foreach ($v as $row)
|
||||||
|
{
|
||||||
|
$cases .= $row."\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$cases .= 'ELSE '.$k.' END, ';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= substr($cases, 0, -2);
|
||||||
|
|
||||||
|
$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')';
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncate statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific truncate string from the supplied data
|
||||||
|
* If the database does not support the truncate() command
|
||||||
|
* This function maps to "DELETE FROM table"
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _truncate($table)
|
||||||
|
{
|
||||||
|
return "TRUNCATE ".$table;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific delete string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the where clause
|
||||||
|
* @param string the limit clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _delete($table, $where = array(), $like = array(), $limit = FALSE)
|
||||||
|
{
|
||||||
|
$conditions = '';
|
||||||
|
|
||||||
|
if (count($where) > 0 OR count($like) > 0)
|
||||||
|
{
|
||||||
|
$conditions = "\nWHERE ";
|
||||||
|
$conditions .= implode("\n", $this->ar_where);
|
||||||
|
|
||||||
|
if (count($where) > 0 && count($like) > 0)
|
||||||
|
{
|
||||||
|
$conditions .= " AND ";
|
||||||
|
}
|
||||||
|
$conditions .= implode("\n", $like);
|
||||||
|
}
|
||||||
|
|
||||||
|
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||||
|
|
||||||
|
return "DELETE FROM ".$table.$conditions.$limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Limit string
|
||||||
|
*
|
||||||
|
* Generates a platform-specific LIMIT clause
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the sql query string
|
||||||
|
* @param integer the number of rows to limit the query to
|
||||||
|
* @param integer the offset value
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _limit($sql, $limit, $offset)
|
||||||
|
{
|
||||||
|
if ($offset == 0)
|
||||||
|
{
|
||||||
|
$offset = '';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$offset .= ", ";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql."LIMIT ".$offset.$limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close DB Connection
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param resource
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _close($conn_id)
|
||||||
|
{
|
||||||
|
@mysql_close($conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file mysql_driver.php */
|
||||||
|
/* Location: ./system/database/drivers/mysql/mysql_driver.php */
|
273
system/database/drivers/mysql/mysql_forge.php
Normal file
273
system/database/drivers/mysql/mysql_forge.php
Normal file
@ -0,0 +1,273 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQL Forge Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mysql_forge extends CI_DB_forge {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create database
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _create_database($name)
|
||||||
|
{
|
||||||
|
return "CREATE DATABASE ".$name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop database
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _drop_database($name)
|
||||||
|
{
|
||||||
|
return "DROP DATABASE ".$name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process Fields
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param mixed the fields
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _process_fields($fields)
|
||||||
|
{
|
||||||
|
$current_field_count = 0;
|
||||||
|
$sql = '';
|
||||||
|
|
||||||
|
foreach ($fields as $field=>$attributes)
|
||||||
|
{
|
||||||
|
// Numeric field names aren't allowed in databases, so if the key is
|
||||||
|
// numeric, we know it was assigned by PHP and the developer manually
|
||||||
|
// entered the field information, so we'll simply add it to the list
|
||||||
|
if (is_numeric($field))
|
||||||
|
{
|
||||||
|
$sql .= "\n\t$attributes";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$attributes = array_change_key_case($attributes, CASE_UPPER);
|
||||||
|
|
||||||
|
$sql .= "\n\t".$this->db->_protect_identifiers($field);
|
||||||
|
|
||||||
|
if (array_key_exists('NAME', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('TYPE', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= ' '.$attributes['TYPE'];
|
||||||
|
|
||||||
|
if (array_key_exists('CONSTRAINT', $attributes))
|
||||||
|
{
|
||||||
|
switch ($attributes['TYPE'])
|
||||||
|
{
|
||||||
|
case 'decimal':
|
||||||
|
case 'float':
|
||||||
|
case 'numeric':
|
||||||
|
$sql .= '('.implode(',', $attributes['CONSTRAINT']).')';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'enum':
|
||||||
|
case 'set':
|
||||||
|
$sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")';
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$sql .= '('.$attributes['CONSTRAINT'].')';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' UNSIGNED';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('DEFAULT', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' NULL';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sql .= ' NOT NULL';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' AUTO_INCREMENT';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't add a comma on the end of the last field
|
||||||
|
if (++$current_field_count < count($fields))
|
||||||
|
{
|
||||||
|
$sql .= ',';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create Table
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @param mixed the fields
|
||||||
|
* @param mixed primary key(s)
|
||||||
|
* @param mixed key(s)
|
||||||
|
* @param boolean should 'IF NOT EXISTS' be added to the SQL
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
|
||||||
|
{
|
||||||
|
$sql = 'CREATE TABLE ';
|
||||||
|
|
||||||
|
if ($if_not_exists === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= 'IF NOT EXISTS ';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= $this->db->_escape_identifiers($table)." (";
|
||||||
|
|
||||||
|
$sql .= $this->_process_fields($fields);
|
||||||
|
|
||||||
|
if (count($primary_keys) > 0)
|
||||||
|
{
|
||||||
|
$key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));
|
||||||
|
$primary_keys = $this->db->_protect_identifiers($primary_keys);
|
||||||
|
$sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($keys) && count($keys) > 0)
|
||||||
|
{
|
||||||
|
foreach ($keys as $key)
|
||||||
|
{
|
||||||
|
if (is_array($key))
|
||||||
|
{
|
||||||
|
$key_name = $this->db->_protect_identifiers(implode('_', $key));
|
||||||
|
$key = $this->db->_protect_identifiers($key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$key_name = $this->db->_protect_identifiers($key);
|
||||||
|
$key = array($key_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop Table
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _drop_table($table)
|
||||||
|
{
|
||||||
|
return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alter table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be altered
|
||||||
|
* Called by add_column(), drop_column(), and column_alter(),
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the ALTER type (ADD, DROP, CHANGE)
|
||||||
|
* @param string the column name
|
||||||
|
* @param array fields
|
||||||
|
* @param string the field after which we should add the new field
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _alter_table($alter_type, $table, $fields, $after_field = '')
|
||||||
|
{
|
||||||
|
$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
|
||||||
|
|
||||||
|
// DROP has everything it needs now.
|
||||||
|
if ($alter_type == 'DROP')
|
||||||
|
{
|
||||||
|
return $sql.$this->db->_protect_identifiers($fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= $this->_process_fields($fields);
|
||||||
|
|
||||||
|
if ($after_field != '')
|
||||||
|
{
|
||||||
|
$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename a table
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be renamed
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the old table name
|
||||||
|
* @param string the new table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _rename_table($table_name, $new_table_name)
|
||||||
|
{
|
||||||
|
$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file mysql_forge.php */
|
||||||
|
/* Location: ./system/database/drivers/mysql/mysql_forge.php */
|
174
system/database/drivers/mysql/mysql_result.php
Normal file
174
system/database/drivers/mysql/mysql_result.php
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQL Result Class
|
||||||
|
*
|
||||||
|
* This class extends the parent result class: CI_DB_result
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mysql_result extends CI_DB_result {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of rows in the result set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function num_rows()
|
||||||
|
{
|
||||||
|
return @mysql_num_rows($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of fields in the result set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function num_fields()
|
||||||
|
{
|
||||||
|
return @mysql_num_fields($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch Field Names
|
||||||
|
*
|
||||||
|
* Generates an array of column names
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function list_fields()
|
||||||
|
{
|
||||||
|
$field_names = array();
|
||||||
|
while ($field = mysql_fetch_field($this->result_id))
|
||||||
|
{
|
||||||
|
$field_names[] = $field->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $field_names;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field data
|
||||||
|
*
|
||||||
|
* Generates an array of objects containing field meta-data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function field_data()
|
||||||
|
{
|
||||||
|
$retval = array();
|
||||||
|
while ($field = mysql_fetch_object($this->result_id))
|
||||||
|
{
|
||||||
|
preg_match('/([a-zA-Z]+)(\(\d+\))?/', $field->Type, $matches);
|
||||||
|
|
||||||
|
$type = (array_key_exists(1, $matches)) ? $matches[1] : NULL;
|
||||||
|
$length = (array_key_exists(2, $matches)) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL;
|
||||||
|
|
||||||
|
$F = new stdClass();
|
||||||
|
$F->name = $field->Field;
|
||||||
|
$F->type = $type;
|
||||||
|
$F->default = $field->Default;
|
||||||
|
$F->max_length = $length;
|
||||||
|
$F->primary_key = ( $field->Key == 'PRI' ? 1 : 0 );
|
||||||
|
|
||||||
|
$retval[] = $F;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the result
|
||||||
|
*
|
||||||
|
* @return null
|
||||||
|
*/
|
||||||
|
function free_result()
|
||||||
|
{
|
||||||
|
if (is_resource($this->result_id))
|
||||||
|
{
|
||||||
|
mysql_free_result($this->result_id);
|
||||||
|
$this->result_id = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Seek
|
||||||
|
*
|
||||||
|
* Moves the internal pointer to the desired offset. We call
|
||||||
|
* this internally before fetching results to make sure the
|
||||||
|
* result set starts at zero
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function _data_seek($n = 0)
|
||||||
|
{
|
||||||
|
return mysql_data_seek($this->result_id, $n);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result - associative array
|
||||||
|
*
|
||||||
|
* Returns the result set as an array
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function _fetch_assoc()
|
||||||
|
{
|
||||||
|
return mysql_fetch_assoc($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result - object
|
||||||
|
*
|
||||||
|
* Returns the result set as an object
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _fetch_object()
|
||||||
|
{
|
||||||
|
return mysql_fetch_object($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file mysql_result.php */
|
||||||
|
/* Location: ./system/database/drivers/mysql/mysql_result.php */
|
210
system/database/drivers/mysql/mysql_utility.php
Normal file
210
system/database/drivers/mysql/mysql_utility.php
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQL Utility Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mysql_utility extends CI_DB_utility {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List databases
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _list_databases()
|
||||||
|
{
|
||||||
|
return "SHOW DATABASES";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optimize table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be optimized
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _optimize_table($table)
|
||||||
|
{
|
||||||
|
return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Repair table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be repaired
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _repair_table($table)
|
||||||
|
{
|
||||||
|
return "REPAIR TABLE ".$this->db->_escape_identifiers($table);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* MySQL Export
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param array Preferences
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function _backup($params = array())
|
||||||
|
{
|
||||||
|
if (count($params) == 0)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract the prefs for simplicity
|
||||||
|
extract($params);
|
||||||
|
|
||||||
|
// Build the output
|
||||||
|
$output = '';
|
||||||
|
foreach ((array)$tables as $table)
|
||||||
|
{
|
||||||
|
// Is the table in the "ignore" list?
|
||||||
|
if (in_array($table, (array)$ignore, TRUE))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the table schema
|
||||||
|
$query = $this->db->query("SHOW CREATE TABLE `".$this->db->database.'`.`'.$table.'`');
|
||||||
|
|
||||||
|
// No result means the table name was invalid
|
||||||
|
if ($query === FALSE)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write out the table schema
|
||||||
|
$output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline;
|
||||||
|
|
||||||
|
if ($add_drop == TRUE)
|
||||||
|
{
|
||||||
|
$output .= 'DROP TABLE IF EXISTS '.$table.';'.$newline.$newline;
|
||||||
|
}
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
$result = $query->result_array();
|
||||||
|
foreach ($result[0] as $val)
|
||||||
|
{
|
||||||
|
if ($i++ % 2)
|
||||||
|
{
|
||||||
|
$output .= $val.';'.$newline.$newline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If inserts are not needed we're done...
|
||||||
|
if ($add_insert == FALSE)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grab all the data from the current table
|
||||||
|
$query = $this->db->query("SELECT * FROM $table");
|
||||||
|
|
||||||
|
if ($query->num_rows() == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch the field names and determine if the field is an
|
||||||
|
// integer type. We use this info to decide whether to
|
||||||
|
// surround the data with quotes or not
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
$field_str = '';
|
||||||
|
$is_int = array();
|
||||||
|
while ($field = mysql_fetch_field($query->result_id))
|
||||||
|
{
|
||||||
|
// Most versions of MySQL store timestamp as a string
|
||||||
|
$is_int[$i] = (in_array(
|
||||||
|
strtolower(mysql_field_type($query->result_id, $i)),
|
||||||
|
array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'),
|
||||||
|
TRUE)
|
||||||
|
) ? TRUE : FALSE;
|
||||||
|
|
||||||
|
// Create a string of field names
|
||||||
|
$field_str .= '`'.$field->name.'`, ';
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trim off the end comma
|
||||||
|
$field_str = preg_replace( "/, $/" , "" , $field_str);
|
||||||
|
|
||||||
|
|
||||||
|
// Build the insert string
|
||||||
|
foreach ($query->result_array() as $row)
|
||||||
|
{
|
||||||
|
$val_str = '';
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
foreach ($row as $v)
|
||||||
|
{
|
||||||
|
// Is the value NULL?
|
||||||
|
if ($v === NULL)
|
||||||
|
{
|
||||||
|
$val_str .= 'NULL';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Escape the data if it's not an integer
|
||||||
|
if ($is_int[$i] == FALSE)
|
||||||
|
{
|
||||||
|
$val_str .= $this->db->escape($v);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$val_str .= $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append a comma
|
||||||
|
$val_str .= ', ';
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the comma at the end of the string
|
||||||
|
$val_str = preg_replace( "/, $/" , "" , $val_str);
|
||||||
|
|
||||||
|
// Build the INSERT string
|
||||||
|
$output .= 'INSERT INTO '.$table.' ('.$field_str.') VALUES ('.$val_str.');'.$newline;
|
||||||
|
}
|
||||||
|
|
||||||
|
$output .= $newline.$newline;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file mysql_utility.php */
|
||||||
|
/* Location: ./system/database/drivers/mysql/mysql_utility.php */
|
10
system/database/drivers/mysqli/index.html
Normal file
10
system/database/drivers/mysqli/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
776
system/database/drivers/mysqli/mysqli_driver.php
Normal file
776
system/database/drivers/mysqli/mysqli_driver.php
Normal file
@ -0,0 +1,776 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQLi Database Adapter Class - MySQLi only works with PHP 5
|
||||||
|
*
|
||||||
|
* Note: _DB is an extender class that the app controller
|
||||||
|
* creates dynamically based on whether the active record
|
||||||
|
* class is being used or not.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mysqli_driver extends CI_DB {
|
||||||
|
|
||||||
|
var $dbdriver = 'mysqli';
|
||||||
|
|
||||||
|
// The character used for escaping
|
||||||
|
var $_escape_char = '`';
|
||||||
|
|
||||||
|
// clause and character used for LIKE escape sequences - not used in MySQL
|
||||||
|
var $_like_escape_str = '';
|
||||||
|
var $_like_escape_chr = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The syntax to count rows is slightly different across different
|
||||||
|
* database engines, so this string appears in each driver and is
|
||||||
|
* used for the count_all() and count_all_results() functions.
|
||||||
|
*/
|
||||||
|
var $_count_string = "SELECT COUNT(*) AS ";
|
||||||
|
var $_random_keyword = ' RAND()'; // database specific random keyword
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether to use the MySQL "delete hack" which allows the number
|
||||||
|
* of affected rows to be shown. Uses a preg_replace when enabled,
|
||||||
|
* adding a bit more processing to all queries.
|
||||||
|
*/
|
||||||
|
var $delete_hack = TRUE;
|
||||||
|
|
||||||
|
// whether SET NAMES must be used to set the character set
|
||||||
|
var $use_set_names;
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-persistent database connection
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_connect()
|
||||||
|
{
|
||||||
|
if ($this->port != '')
|
||||||
|
{
|
||||||
|
return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persistent database connection
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_pconnect()
|
||||||
|
{
|
||||||
|
return $this->db_connect();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reconnect
|
||||||
|
*
|
||||||
|
* Keep / reestablish the db connection if no queries have been
|
||||||
|
* sent for a length of time exceeding the server's idle timeout
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function reconnect()
|
||||||
|
{
|
||||||
|
if (mysqli_ping($this->conn_id) === FALSE)
|
||||||
|
{
|
||||||
|
$this->conn_id = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select the database
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function db_select()
|
||||||
|
{
|
||||||
|
return @mysqli_select_db($this->conn_id, $this->database);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set client character set
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function _db_set_charset($charset, $collation)
|
||||||
|
{
|
||||||
|
if ( ! isset($this->use_set_names))
|
||||||
|
{
|
||||||
|
// mysqli_set_charset() requires MySQL >= 5.0.7, use SET NAMES as fallback
|
||||||
|
$this->use_set_names = (version_compare(mysqli_get_server_info($this->conn_id), '5.0.7', '>=')) ? FALSE : TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->use_set_names === TRUE)
|
||||||
|
{
|
||||||
|
return @mysqli_query($this->conn_id, "SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return @mysqli_set_charset($this->conn_id, $charset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version number query string
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _version()
|
||||||
|
{
|
||||||
|
return "SELECT version() AS ver";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the query
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @param string an SQL query
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
function _execute($sql)
|
||||||
|
{
|
||||||
|
$sql = $this->_prep_query($sql);
|
||||||
|
$result = @mysqli_query($this->conn_id, $sql);
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prep the query
|
||||||
|
*
|
||||||
|
* If needed, each database adapter can prep the query string
|
||||||
|
*
|
||||||
|
* @access private called by execute()
|
||||||
|
* @param string an SQL query
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _prep_query($sql)
|
||||||
|
{
|
||||||
|
// "DELETE FROM TABLE" returns 0 affected rows This hack modifies
|
||||||
|
// the query so that it returns the number of affected rows
|
||||||
|
if ($this->delete_hack === TRUE)
|
||||||
|
{
|
||||||
|
if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
|
||||||
|
{
|
||||||
|
$sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_begin($test_mode = FALSE)
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the transaction failure flag.
|
||||||
|
// If the $test_mode flag is set to TRUE transactions will be rolled back
|
||||||
|
// even if the queries produce a successful result.
|
||||||
|
$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
|
||||||
|
|
||||||
|
$this->simple_query('SET AUTOCOMMIT=0');
|
||||||
|
$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Commit Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_commit()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->simple_query('COMMIT');
|
||||||
|
$this->simple_query('SET AUTOCOMMIT=1');
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rollback Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function trans_rollback()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->simple_query('ROLLBACK');
|
||||||
|
$this->simple_query('SET AUTOCOMMIT=1');
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape String
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param bool whether or not the string will be used in a LIKE condition
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function escape_str($str, $like = FALSE)
|
||||||
|
{
|
||||||
|
if (is_array($str))
|
||||||
|
{
|
||||||
|
foreach ($str as $key => $val)
|
||||||
|
{
|
||||||
|
$str[$key] = $this->escape_str($val, $like);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (function_exists('mysqli_real_escape_string') AND is_object($this->conn_id))
|
||||||
|
{
|
||||||
|
$str = mysqli_real_escape_string($this->conn_id, $str);
|
||||||
|
}
|
||||||
|
elseif (function_exists('mysql_escape_string'))
|
||||||
|
{
|
||||||
|
$str = mysql_escape_string($str);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$str = addslashes($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// escape LIKE condition wildcards
|
||||||
|
if ($like === TRUE)
|
||||||
|
{
|
||||||
|
$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affected Rows
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function affected_rows()
|
||||||
|
{
|
||||||
|
return @mysqli_affected_rows($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert ID
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function insert_id()
|
||||||
|
{
|
||||||
|
return @mysqli_insert_id($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "Count All" query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string that counts all records in
|
||||||
|
* the specified database
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function count_all($table = '')
|
||||||
|
{
|
||||||
|
if ($table == '')
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
|
||||||
|
|
||||||
|
if ($query->num_rows() == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$row = $query->row();
|
||||||
|
$this->_reset_select();
|
||||||
|
return (int) $row->numrows;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string so that the table names can be fetched
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param boolean
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _list_tables($prefix_limit = FALSE)
|
||||||
|
{
|
||||||
|
$sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;
|
||||||
|
|
||||||
|
if ($prefix_limit !== FALSE AND $this->dbprefix != '')
|
||||||
|
{
|
||||||
|
$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show column query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string so that the column names can be fetched
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _list_columns($table = '')
|
||||||
|
{
|
||||||
|
return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field data query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that the column data can be retrieved
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _field_data($table)
|
||||||
|
{
|
||||||
|
return "DESCRIBE ".$table;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error message string
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _error_message()
|
||||||
|
{
|
||||||
|
return mysqli_error($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error message number
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function _error_number()
|
||||||
|
{
|
||||||
|
return mysqli_errno($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape the SQL Identifiers
|
||||||
|
*
|
||||||
|
* This function escapes column and table names
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _escape_identifiers($item)
|
||||||
|
{
|
||||||
|
if ($this->_escape_char == '')
|
||||||
|
{
|
||||||
|
return $item;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->_reserved_identifiers as $id)
|
||||||
|
{
|
||||||
|
if (strpos($item, '.'.$id) !== FALSE)
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
|
||||||
|
|
||||||
|
// remove duplicates if the user already included the escape
|
||||||
|
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strpos($item, '.') !== FALSE)
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char.$item.$this->_escape_char;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove duplicates if the user already included the escape
|
||||||
|
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From Tables
|
||||||
|
*
|
||||||
|
* This function implicitly groups FROM tables so there is no confusion
|
||||||
|
* about operator precedence in harmony with SQL standards
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param type
|
||||||
|
* @return type
|
||||||
|
*/
|
||||||
|
function _from_tables($tables)
|
||||||
|
{
|
||||||
|
if ( ! is_array($tables))
|
||||||
|
{
|
||||||
|
$tables = array($tables);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '('.implode(', ', $tables).')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific insert string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _insert($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert_batch statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific insert string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _insert_batch($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific replace string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _replace($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific update string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the update data
|
||||||
|
* @param array the where clause
|
||||||
|
* @param array the orderby clause
|
||||||
|
* @param array the limit clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
|
||||||
|
{
|
||||||
|
foreach ($values as $key => $val)
|
||||||
|
{
|
||||||
|
$valstr[] = $key." = ".$val;
|
||||||
|
}
|
||||||
|
|
||||||
|
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||||
|
|
||||||
|
$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
|
||||||
|
|
||||||
|
$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
|
||||||
|
|
||||||
|
$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
|
||||||
|
|
||||||
|
$sql .= $orderby.$limit;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update_Batch statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific batch update string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the update data
|
||||||
|
* @param array the where clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _update_batch($table, $values, $index, $where = NULL)
|
||||||
|
{
|
||||||
|
$ids = array();
|
||||||
|
$where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : '';
|
||||||
|
|
||||||
|
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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = "UPDATE ".$table." SET ";
|
||||||
|
$cases = '';
|
||||||
|
|
||||||
|
foreach ($final as $k => $v)
|
||||||
|
{
|
||||||
|
$cases .= $k.' = CASE '."\n";
|
||||||
|
foreach ($v as $row)
|
||||||
|
{
|
||||||
|
$cases .= $row."\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$cases .= 'ELSE '.$k.' END, ';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= substr($cases, 0, -2);
|
||||||
|
|
||||||
|
$sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')';
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncate statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific truncate string from the supplied data
|
||||||
|
* If the database does not support the truncate() command
|
||||||
|
* This function maps to "DELETE FROM table"
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _truncate($table)
|
||||||
|
{
|
||||||
|
return "TRUNCATE ".$table;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific delete string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the where clause
|
||||||
|
* @param string the limit clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _delete($table, $where = array(), $like = array(), $limit = FALSE)
|
||||||
|
{
|
||||||
|
$conditions = '';
|
||||||
|
|
||||||
|
if (count($where) > 0 OR count($like) > 0)
|
||||||
|
{
|
||||||
|
$conditions = "\nWHERE ";
|
||||||
|
$conditions .= implode("\n", $this->ar_where);
|
||||||
|
|
||||||
|
if (count($where) > 0 && count($like) > 0)
|
||||||
|
{
|
||||||
|
$conditions .= " AND ";
|
||||||
|
}
|
||||||
|
$conditions .= implode("\n", $like);
|
||||||
|
}
|
||||||
|
|
||||||
|
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||||
|
|
||||||
|
return "DELETE FROM ".$table.$conditions.$limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Limit string
|
||||||
|
*
|
||||||
|
* Generates a platform-specific LIMIT clause
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the sql query string
|
||||||
|
* @param integer the number of rows to limit the query to
|
||||||
|
* @param integer the offset value
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _limit($sql, $limit, $offset)
|
||||||
|
{
|
||||||
|
$sql .= "LIMIT ".$limit;
|
||||||
|
|
||||||
|
if ($offset > 0)
|
||||||
|
{
|
||||||
|
$sql .= " OFFSET ".$offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close DB Connection
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param resource
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _close($conn_id)
|
||||||
|
{
|
||||||
|
@mysqli_close($conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file mysqli_driver.php */
|
||||||
|
/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */
|
258
system/database/drivers/mysqli/mysqli_forge.php
Normal file
258
system/database/drivers/mysqli/mysqli_forge.php
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQLi Forge Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mysqli_forge extends CI_DB_forge {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create database
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _create_database($name)
|
||||||
|
{
|
||||||
|
return "CREATE DATABASE ".$name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop database
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _drop_database($name)
|
||||||
|
{
|
||||||
|
return "DROP DATABASE ".$name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process Fields
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param mixed the fields
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _process_fields($fields)
|
||||||
|
{
|
||||||
|
$current_field_count = 0;
|
||||||
|
$sql = '';
|
||||||
|
|
||||||
|
foreach ($fields as $field=>$attributes)
|
||||||
|
{
|
||||||
|
// Numeric field names aren't allowed in databases, so if the key is
|
||||||
|
// numeric, we know it was assigned by PHP and the developer manually
|
||||||
|
// entered the field information, so we'll simply add it to the list
|
||||||
|
if (is_numeric($field))
|
||||||
|
{
|
||||||
|
$sql .= "\n\t$attributes";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$attributes = array_change_key_case($attributes, CASE_UPPER);
|
||||||
|
|
||||||
|
$sql .= "\n\t".$this->db->_protect_identifiers($field);
|
||||||
|
|
||||||
|
if (array_key_exists('NAME', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('TYPE', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= ' '.$attributes['TYPE'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('CONSTRAINT', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= '('.$attributes['CONSTRAINT'].')';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' UNSIGNED';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('DEFAULT', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' NULL';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sql .= ' NOT NULL';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' AUTO_INCREMENT';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't add a comma on the end of the last field
|
||||||
|
if (++$current_field_count < count($fields))
|
||||||
|
{
|
||||||
|
$sql .= ',';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create Table
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @param mixed the fields
|
||||||
|
* @param mixed primary key(s)
|
||||||
|
* @param mixed key(s)
|
||||||
|
* @param boolean should 'IF NOT EXISTS' be added to the SQL
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
|
||||||
|
{
|
||||||
|
$sql = 'CREATE TABLE ';
|
||||||
|
|
||||||
|
if ($if_not_exists === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= 'IF NOT EXISTS ';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= $this->db->_escape_identifiers($table)." (";
|
||||||
|
|
||||||
|
$sql .= $this->_process_fields($fields);
|
||||||
|
|
||||||
|
if (count($primary_keys) > 0)
|
||||||
|
{
|
||||||
|
$key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));
|
||||||
|
$primary_keys = $this->db->_protect_identifiers($primary_keys);
|
||||||
|
$sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($keys) && count($keys) > 0)
|
||||||
|
{
|
||||||
|
foreach ($keys as $key)
|
||||||
|
{
|
||||||
|
if (is_array($key))
|
||||||
|
{
|
||||||
|
$key_name = $this->db->_protect_identifiers(implode('_', $key));
|
||||||
|
$key = $this->db->_protect_identifiers($key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$key_name = $this->db->_protect_identifiers($key);
|
||||||
|
$key = array($key_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop Table
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _drop_table($table)
|
||||||
|
{
|
||||||
|
return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alter table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be altered
|
||||||
|
* Called by add_column(), drop_column(), and column_alter(),
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the ALTER type (ADD, DROP, CHANGE)
|
||||||
|
* @param string the column name
|
||||||
|
* @param array fields
|
||||||
|
* @param string the field after which we should add the new field
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _alter_table($alter_type, $table, $fields, $after_field = '')
|
||||||
|
{
|
||||||
|
$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
|
||||||
|
|
||||||
|
// DROP has everything it needs now.
|
||||||
|
if ($alter_type == 'DROP')
|
||||||
|
{
|
||||||
|
return $sql.$this->db->_protect_identifiers($fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= $this->_process_fields($fields);
|
||||||
|
|
||||||
|
if ($after_field != '')
|
||||||
|
{
|
||||||
|
$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename a table
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be renamed
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the old table name
|
||||||
|
* @param string the new table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _rename_table($table_name, $new_table_name)
|
||||||
|
{
|
||||||
|
$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file mysqli_forge.php */
|
||||||
|
/* Location: ./system/database/drivers/mysqli/mysqli_forge.php */
|
174
system/database/drivers/mysqli/mysqli_result.php
Normal file
174
system/database/drivers/mysqli/mysqli_result.php
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQLi Result Class
|
||||||
|
*
|
||||||
|
* This class extends the parent result class: CI_DB_result
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mysqli_result extends CI_DB_result {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of rows in the result set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function num_rows()
|
||||||
|
{
|
||||||
|
return @mysqli_num_rows($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of fields in the result set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
function num_fields()
|
||||||
|
{
|
||||||
|
return @mysqli_num_fields($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch Field Names
|
||||||
|
*
|
||||||
|
* Generates an array of column names
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function list_fields()
|
||||||
|
{
|
||||||
|
$field_names = array();
|
||||||
|
while ($field = mysqli_fetch_field($this->result_id))
|
||||||
|
{
|
||||||
|
$field_names[] = $field->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $field_names;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field data
|
||||||
|
*
|
||||||
|
* Generates an array of objects containing field meta-data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function field_data()
|
||||||
|
{
|
||||||
|
$retval = array();
|
||||||
|
while ($field = mysqli_fetch_object($this->result_id))
|
||||||
|
{
|
||||||
|
preg_match('/([a-zA-Z]+)(\(\d+\))?/', $field->Type, $matches);
|
||||||
|
|
||||||
|
$type = (array_key_exists(1, $matches)) ? $matches[1] : NULL;
|
||||||
|
$length = (array_key_exists(2, $matches)) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL;
|
||||||
|
|
||||||
|
$F = new stdClass();
|
||||||
|
$F->name = $field->Field;
|
||||||
|
$F->type = $type;
|
||||||
|
$F->default = $field->Default;
|
||||||
|
$F->max_length = $length;
|
||||||
|
$F->primary_key = ( $field->Key == 'PRI' ? 1 : 0 );
|
||||||
|
|
||||||
|
$retval[] = $F;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the result
|
||||||
|
*
|
||||||
|
* @return null
|
||||||
|
*/
|
||||||
|
function free_result()
|
||||||
|
{
|
||||||
|
if (is_object($this->result_id))
|
||||||
|
{
|
||||||
|
mysqli_free_result($this->result_id);
|
||||||
|
$this->result_id = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Seek
|
||||||
|
*
|
||||||
|
* Moves the internal pointer to the desired offset. We call
|
||||||
|
* this internally before fetching results to make sure the
|
||||||
|
* result set starts at zero
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function _data_seek($n = 0)
|
||||||
|
{
|
||||||
|
return mysqli_data_seek($this->result_id, $n);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result - associative array
|
||||||
|
*
|
||||||
|
* Returns the result set as an array
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function _fetch_assoc()
|
||||||
|
{
|
||||||
|
return mysqli_fetch_assoc($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result - object
|
||||||
|
*
|
||||||
|
* Returns the result set as an object
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _fetch_object()
|
||||||
|
{
|
||||||
|
return mysqli_fetch_object($this->result_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file mysqli_result.php */
|
||||||
|
/* Location: ./system/database/drivers/mysqli/mysqli_result.php */
|
87
system/database/drivers/mysqli/mysqli_utility.php
Normal file
87
system/database/drivers/mysqli/mysqli_utility.php
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQLi Utility Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_mysqli_utility extends CI_DB_utility {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List databases
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _list_databases()
|
||||||
|
{
|
||||||
|
return "SHOW DATABASES";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optimize table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be optimized
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _optimize_table($table)
|
||||||
|
{
|
||||||
|
return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Repair table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be repaired
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _repair_table($table)
|
||||||
|
{
|
||||||
|
return "REPAIR TABLE ".$this->db->_escape_identifiers($table);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQLi Export
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param array Preferences
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function _backup($params = array())
|
||||||
|
{
|
||||||
|
// Currently unsupported
|
||||||
|
return $this->db->display_error('db_unsuported_feature');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file mysqli_utility.php */
|
||||||
|
/* Location: ./system/database/drivers/mysqli/mysqli_utility.php */
|
10
system/database/drivers/oci8/index.html
Normal file
10
system/database/drivers/oci8/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
808
system/database/drivers/oci8/oci8_driver.php
Normal file
808
system/database/drivers/oci8/oci8_driver.php
Normal file
@ -0,0 +1,808 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* oci8 Database Adapter Class
|
||||||
|
*
|
||||||
|
* Note: _DB is an extender class that the app controller
|
||||||
|
* creates dynamically based on whether the active record
|
||||||
|
* class is being used or not.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* oci8 Database Adapter Class
|
||||||
|
*
|
||||||
|
* This is a modification of the DB_driver class to
|
||||||
|
* permit access to oracle databases
|
||||||
|
*
|
||||||
|
* @author Kelly McArdle
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class CI_DB_oci8_driver extends CI_DB {
|
||||||
|
|
||||||
|
var $dbdriver = 'oci8';
|
||||||
|
|
||||||
|
// The character used for excaping
|
||||||
|
var $_escape_char = '"';
|
||||||
|
|
||||||
|
// clause and character used for LIKE escape sequences
|
||||||
|
var $_like_escape_str = " escape '%s' ";
|
||||||
|
var $_like_escape_chr = '!';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The syntax to count rows is slightly different across different
|
||||||
|
* database engines, so this string appears in each driver and is
|
||||||
|
* used for the count_all() and count_all_results() functions.
|
||||||
|
*/
|
||||||
|
var $_count_string = "SELECT COUNT(1) AS ";
|
||||||
|
var $_random_keyword = ' ASC'; // not currently supported
|
||||||
|
|
||||||
|
// Set "auto commit" by default
|
||||||
|
var $_commit = OCI_COMMIT_ON_SUCCESS;
|
||||||
|
|
||||||
|
// need to track statement id and cursor id
|
||||||
|
var $stmt_id;
|
||||||
|
var $curs_id;
|
||||||
|
|
||||||
|
// if we use a limit, we will add a field that will
|
||||||
|
// throw off num_fields later
|
||||||
|
var $limit_used;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-persistent database connection
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
public function db_connect()
|
||||||
|
{
|
||||||
|
return @oci_connect($this->username, $this->password, $this->hostname, $this->char_set);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persistent database connection
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
public function db_pconnect()
|
||||||
|
{
|
||||||
|
return @oci_pconnect($this->username, $this->password, $this->hostname, $this->char_set);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reconnect
|
||||||
|
*
|
||||||
|
* Keep / reestablish the db connection if no queries have been
|
||||||
|
* sent for a length of time exceeding the server's idle timeout
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function reconnect()
|
||||||
|
{
|
||||||
|
// not implemented in oracle
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select the database
|
||||||
|
*
|
||||||
|
* @access private called by the base class
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
public function db_select()
|
||||||
|
{
|
||||||
|
// Not in Oracle - schemas are actually usernames
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set client character set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param string
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
public function db_set_charset($charset, $collation)
|
||||||
|
{
|
||||||
|
// @todo - add support if needed
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version number query string
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _version()
|
||||||
|
{
|
||||||
|
return oci_server_version($this->conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the query
|
||||||
|
*
|
||||||
|
* @access protected called by the base class
|
||||||
|
* @param string an SQL query
|
||||||
|
* @return resource
|
||||||
|
*/
|
||||||
|
protected function _execute($sql)
|
||||||
|
{
|
||||||
|
// oracle must parse the query before it is run. All of the actions with
|
||||||
|
// the query are based on the statement id returned by ociparse
|
||||||
|
$this->stmt_id = FALSE;
|
||||||
|
$this->_set_stmt_id($sql);
|
||||||
|
oci_set_prefetch($this->stmt_id, 1000);
|
||||||
|
return @oci_execute($this->stmt_id, $this->_commit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a statement ID
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string an SQL query
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
private function _set_stmt_id($sql)
|
||||||
|
{
|
||||||
|
if ( ! is_resource($this->stmt_id))
|
||||||
|
{
|
||||||
|
$this->stmt_id = oci_parse($this->conn_id, $this->_prep_query($sql));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prep the query
|
||||||
|
*
|
||||||
|
* If needed, each database adapter can prep the query string
|
||||||
|
*
|
||||||
|
* @access private called by execute()
|
||||||
|
* @param string an SQL query
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function _prep_query($sql)
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* getCursor. Returns a cursor from the datbase
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return cursor id
|
||||||
|
*/
|
||||||
|
public function get_cursor()
|
||||||
|
{
|
||||||
|
$this->curs_id = oci_new_cursor($this->conn_id);
|
||||||
|
return $this->curs_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stored Procedure. Executes a stored procedure
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param package package stored procedure is in
|
||||||
|
* @param procedure stored procedure to execute
|
||||||
|
* @param params array of parameters
|
||||||
|
* @return array
|
||||||
|
*
|
||||||
|
* params array keys
|
||||||
|
*
|
||||||
|
* KEY OPTIONAL NOTES
|
||||||
|
* name no the name of the parameter should be in :<param_name> format
|
||||||
|
* value no the value of the parameter. If this is an OUT or IN OUT parameter,
|
||||||
|
* this should be a reference to a variable
|
||||||
|
* type yes the type of the parameter
|
||||||
|
* length yes the max size of the parameter
|
||||||
|
*/
|
||||||
|
public function stored_procedure($package, $procedure, $params)
|
||||||
|
{
|
||||||
|
if ($package == '' OR $procedure == '' OR ! is_array($params))
|
||||||
|
{
|
||||||
|
if ($this->db_debug)
|
||||||
|
{
|
||||||
|
log_message('error', 'Invalid query: '.$package.'.'.$procedure);
|
||||||
|
return $this->display_error('db_invalid_query');
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// build the query string
|
||||||
|
$sql = "begin $package.$procedure(";
|
||||||
|
|
||||||
|
$have_cursor = FALSE;
|
||||||
|
foreach ($params as $param)
|
||||||
|
{
|
||||||
|
$sql .= $param['name'] . ",";
|
||||||
|
|
||||||
|
if (array_key_exists('type', $param) && ($param['type'] === OCI_B_CURSOR))
|
||||||
|
{
|
||||||
|
$have_cursor = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$sql = trim($sql, ",") . "); end;";
|
||||||
|
|
||||||
|
$this->stmt_id = FALSE;
|
||||||
|
$this->_set_stmt_id($sql);
|
||||||
|
$this->_bind_params($params);
|
||||||
|
$this->query($sql, FALSE, $have_cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bind parameters
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
private function _bind_params($params)
|
||||||
|
{
|
||||||
|
if ( ! is_array($params) OR ! is_resource($this->stmt_id))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($params as $param)
|
||||||
|
{
|
||||||
|
foreach (array('name', 'value', 'type', 'length') as $val)
|
||||||
|
{
|
||||||
|
if ( ! isset($param[$val]))
|
||||||
|
{
|
||||||
|
$param[$val] = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
oci_bind_by_name($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function trans_begin($test_mode = FALSE)
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the transaction failure flag.
|
||||||
|
// If the $test_mode flag is set to TRUE transactions will be rolled back
|
||||||
|
// even if the queries produce a successful result.
|
||||||
|
$this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
|
||||||
|
|
||||||
|
$this->_commit = OCI_DEFAULT;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Commit Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function trans_commit()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret = oci_commit($this->conn_id);
|
||||||
|
$this->_commit = OCI_COMMIT_ON_SUCCESS;
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rollback Transaction
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function trans_rollback()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
if ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret = oci_rollback($this->conn_id);
|
||||||
|
$this->_commit = OCI_COMMIT_ON_SUCCESS;
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape String
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @param bool whether or not the string will be used in a LIKE condition
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function escape_str($str, $like = FALSE)
|
||||||
|
{
|
||||||
|
if (is_array($str))
|
||||||
|
{
|
||||||
|
foreach ($str as $key => $val)
|
||||||
|
{
|
||||||
|
$str[$key] = $this->escape_str($val, $like);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
$str = remove_invisible_characters($str);
|
||||||
|
|
||||||
|
// escape LIKE condition wildcards
|
||||||
|
if ($like === TRUE)
|
||||||
|
{
|
||||||
|
$str = str_replace( array('%', '_', $this->_like_escape_chr),
|
||||||
|
array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr),
|
||||||
|
$str);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Affected Rows
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function affected_rows()
|
||||||
|
{
|
||||||
|
return @oci_num_rows($this->stmt_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert ID
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function insert_id()
|
||||||
|
{
|
||||||
|
// not supported in oracle
|
||||||
|
return $this->display_error('db_unsupported_function');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "Count All" query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string that counts all records in
|
||||||
|
* the specified database
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function count_all($table = '')
|
||||||
|
{
|
||||||
|
if ($table == '')
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
|
||||||
|
|
||||||
|
if ($query == FALSE)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$row = $query->row();
|
||||||
|
$this->_reset_select();
|
||||||
|
return (int) $row->numrows;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string so that the table names can be fetched
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param boolean
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _list_tables($prefix_limit = FALSE)
|
||||||
|
{
|
||||||
|
$sql = "SELECT TABLE_NAME FROM ALL_TABLES";
|
||||||
|
|
||||||
|
if ($prefix_limit !== FALSE AND $this->dbprefix != '')
|
||||||
|
{
|
||||||
|
$sql .= " WHERE TABLE_NAME LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show column query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query string so that the column names can be fetched
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param string the table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _list_columns($table = '')
|
||||||
|
{
|
||||||
|
return "SELECT COLUMN_NAME FROM all_tab_columns WHERE table_name = '$table'";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field data query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that the column data can be retrieved
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
protected function _field_data($table)
|
||||||
|
{
|
||||||
|
return "SELECT * FROM ".$table." where rownum = 1";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error message string
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _error_message()
|
||||||
|
{
|
||||||
|
// If the error was during connection, no conn_id should be passed
|
||||||
|
$error = is_resource($this->conn_id) ? oci_error($this->conn_id) : oci_error();
|
||||||
|
return $error['message'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The error message number
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
protected function _error_number()
|
||||||
|
{
|
||||||
|
// Same as _error_message()
|
||||||
|
$error = is_resource($this->conn_id) ? oci_error($this->conn_id) : oci_error();
|
||||||
|
return $error['code'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape the SQL Identifiers
|
||||||
|
*
|
||||||
|
* This function escapes column and table names
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param string
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _escape_identifiers($item)
|
||||||
|
{
|
||||||
|
if ($this->_escape_char == '')
|
||||||
|
{
|
||||||
|
return $item;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->_reserved_identifiers as $id)
|
||||||
|
{
|
||||||
|
if (strpos($item, '.'.$id) !== FALSE)
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item);
|
||||||
|
|
||||||
|
// remove duplicates if the user already included the escape
|
||||||
|
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strpos($item, '.') !== FALSE)
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$str = $this->_escape_char.$item.$this->_escape_char;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove duplicates if the user already included the escape
|
||||||
|
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From Tables
|
||||||
|
*
|
||||||
|
* This function implicitly groups FROM tables so there is no confusion
|
||||||
|
* about operator precedence in harmony with SQL standards
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param type
|
||||||
|
* @return type
|
||||||
|
*/
|
||||||
|
protected function _from_tables($tables)
|
||||||
|
{
|
||||||
|
if ( ! is_array($tables))
|
||||||
|
{
|
||||||
|
$tables = array($tables);
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode(', ', $tables);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific insert string from the supplied data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _insert($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert_batch statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific insert string from the supplied data
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the insert keys
|
||||||
|
* @param array the insert values
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _insert_batch($table, $keys, $values)
|
||||||
|
{
|
||||||
|
$keys = implode(', ', $keys);
|
||||||
|
$sql = "INSERT ALL\n";
|
||||||
|
|
||||||
|
for ($i = 0, $c = count($values); $i < $c; $i++)
|
||||||
|
{
|
||||||
|
$sql .= ' INTO ' . $table . ' (' . $keys . ') VALUES ' . $values[$i] . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= 'SELECT * FROM dual';
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific update string from the supplied data
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the update data
|
||||||
|
* @param array the where clause
|
||||||
|
* @param array the orderby clause
|
||||||
|
* @param array the limit clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
|
||||||
|
{
|
||||||
|
foreach ($values as $key => $val)
|
||||||
|
{
|
||||||
|
$valstr[] = $key." = ".$val;
|
||||||
|
}
|
||||||
|
|
||||||
|
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||||
|
|
||||||
|
$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
|
||||||
|
|
||||||
|
$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
|
||||||
|
|
||||||
|
$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
|
||||||
|
|
||||||
|
$sql .= $orderby.$limit;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncate statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific truncate string from the supplied data
|
||||||
|
* If the database does not support the truncate() command
|
||||||
|
* This function maps to "DELETE FROM table"
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param string the table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _truncate($table)
|
||||||
|
{
|
||||||
|
return "TRUNCATE TABLE ".$table;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific delete string from the supplied data
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the where clause
|
||||||
|
* @param string the limit clause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _delete($table, $where = array(), $like = array(), $limit = FALSE)
|
||||||
|
{
|
||||||
|
$conditions = '';
|
||||||
|
|
||||||
|
if (count($where) > 0 OR count($like) > 0)
|
||||||
|
{
|
||||||
|
$conditions = "\nWHERE ";
|
||||||
|
$conditions .= implode("\n", $this->ar_where);
|
||||||
|
|
||||||
|
if (count($where) > 0 && count($like) > 0)
|
||||||
|
{
|
||||||
|
$conditions .= " AND ";
|
||||||
|
}
|
||||||
|
$conditions .= implode("\n", $like);
|
||||||
|
}
|
||||||
|
|
||||||
|
$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
|
||||||
|
|
||||||
|
return "DELETE FROM ".$table.$conditions.$limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Limit string
|
||||||
|
*
|
||||||
|
* Generates a platform-specific LIMIT clause
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param string the sql query string
|
||||||
|
* @param integer the number of rows to limit the query to
|
||||||
|
* @param integer the offset value
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _limit($sql, $limit, $offset)
|
||||||
|
{
|
||||||
|
$limit = $offset + $limit;
|
||||||
|
$newsql = "SELECT * FROM (select inner_query.*, rownum rnum FROM ($sql) inner_query WHERE rownum < $limit)";
|
||||||
|
|
||||||
|
if ($offset != 0)
|
||||||
|
{
|
||||||
|
$newsql .= " WHERE rnum >= $offset";
|
||||||
|
}
|
||||||
|
|
||||||
|
// remember that we used limits
|
||||||
|
$this->limit_used = TRUE;
|
||||||
|
|
||||||
|
return $newsql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close DB Connection
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @param resource
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _close($conn_id)
|
||||||
|
{
|
||||||
|
@oci_close($conn_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file oci8_driver.php */
|
||||||
|
/* Location: ./system/database/drivers/oci8/oci8_driver.php */
|
248
system/database/drivers/oci8/oci8_forge.php
Normal file
248
system/database/drivers/oci8/oci8_forge.php
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Oracle Forge Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_oci8_forge extends CI_DB_forge {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create database
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _create_database($name)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop database
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the database name
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _drop_database($name)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create Table
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @param array the fields
|
||||||
|
* @param mixed primary key(s)
|
||||||
|
* @param mixed key(s)
|
||||||
|
* @param boolean should 'IF NOT EXISTS' be added to the SQL
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
|
||||||
|
{
|
||||||
|
$sql = 'CREATE TABLE ';
|
||||||
|
|
||||||
|
if ($if_not_exists === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= 'IF NOT EXISTS ';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= $this->db->_escape_identifiers($table)." (";
|
||||||
|
$current_field_count = 0;
|
||||||
|
|
||||||
|
foreach ($fields as $field=>$attributes)
|
||||||
|
{
|
||||||
|
// Numeric field names aren't allowed in databases, so if the key is
|
||||||
|
// numeric, we know it was assigned by PHP and the developer manually
|
||||||
|
// entered the field information, so we'll simply add it to the list
|
||||||
|
if (is_numeric($field))
|
||||||
|
{
|
||||||
|
$sql .= "\n\t$attributes";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$attributes = array_change_key_case($attributes, CASE_UPPER);
|
||||||
|
|
||||||
|
$sql .= "\n\t".$this->db->_protect_identifiers($field);
|
||||||
|
|
||||||
|
$sql .= ' '.$attributes['TYPE'];
|
||||||
|
|
||||||
|
if (array_key_exists('CONSTRAINT', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= '('.$attributes['CONSTRAINT'].')';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' UNSIGNED';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('DEFAULT', $attributes))
|
||||||
|
{
|
||||||
|
$sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' NULL';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sql .= ' NOT NULL';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
|
||||||
|
{
|
||||||
|
$sql .= ' AUTO_INCREMENT';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// don't add a comma on the end of the last field
|
||||||
|
if (++$current_field_count < count($fields))
|
||||||
|
{
|
||||||
|
$sql .= ',';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($primary_keys) > 0)
|
||||||
|
{
|
||||||
|
$primary_keys = $this->db->_protect_identifiers($primary_keys);
|
||||||
|
$sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($keys) && count($keys) > 0)
|
||||||
|
{
|
||||||
|
foreach ($keys as $key)
|
||||||
|
{
|
||||||
|
if (is_array($key))
|
||||||
|
{
|
||||||
|
$key = $this->db->_protect_identifiers($key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$key = array($this->db->_protect_identifiers($key));
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= ",\n\tUNIQUE COLUMNS (" . implode(', ', $key) . ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= "\n)";
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop Table
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _drop_table($table)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alter table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be altered
|
||||||
|
* Called by add_column(), drop_column(), and column_alter(),
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the ALTER type (ADD, DROP, CHANGE)
|
||||||
|
* @param string the column name
|
||||||
|
* @param string the table name
|
||||||
|
* @param string the column definition
|
||||||
|
* @param string the default value
|
||||||
|
* @param boolean should 'NOT NULL' be added
|
||||||
|
* @param string the field after which we should add the new field
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
|
||||||
|
{
|
||||||
|
$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
|
||||||
|
|
||||||
|
// DROP has everything it needs now.
|
||||||
|
if ($alter_type == 'DROP')
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql .= " $column_definition";
|
||||||
|
|
||||||
|
if ($default_value != '')
|
||||||
|
{
|
||||||
|
$sql .= " DEFAULT \"$default_value\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($null === NULL)
|
||||||
|
{
|
||||||
|
$sql .= ' NULL';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sql .= ' NOT NULL';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($after_field != '')
|
||||||
|
{
|
||||||
|
$sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename a table
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be renamed
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the old table name
|
||||||
|
* @param string the new table name
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _rename_table($table_name, $new_table_name)
|
||||||
|
{
|
||||||
|
$sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file oci8_forge.php */
|
||||||
|
/* Location: ./system/database/drivers/oci8/oci8_forge.php */
|
217
system/database/drivers/oci8/oci8_result.php
Normal file
217
system/database/drivers/oci8/oci8_result.php
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* oci8 Result Class
|
||||||
|
*
|
||||||
|
* This class extends the parent result class: CI_DB_result
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_oci8_result extends CI_DB_result {
|
||||||
|
|
||||||
|
public $stmt_id;
|
||||||
|
public $curs_id;
|
||||||
|
public $limit_used;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of rows in the result set.
|
||||||
|
*
|
||||||
|
* Oracle doesn't have a graceful way to retun the number of rows
|
||||||
|
* so we have to use what amounts to a hack.
|
||||||
|
*
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function num_rows()
|
||||||
|
{
|
||||||
|
if ($this->num_rows === 0 && count($this->result_array()) > 0)
|
||||||
|
{
|
||||||
|
$this->num_rows = count($this->result_array());
|
||||||
|
@oci_execute($this->stmt_id);
|
||||||
|
|
||||||
|
if ($this->curs_id)
|
||||||
|
{
|
||||||
|
@oci_execute($this->curs_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->num_rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of fields in the result set
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function num_fields()
|
||||||
|
{
|
||||||
|
$count = @oci_num_fields($this->stmt_id);
|
||||||
|
|
||||||
|
// if we used a limit we subtract it
|
||||||
|
if ($this->limit_used)
|
||||||
|
{
|
||||||
|
$count = $count - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $count;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch Field Names
|
||||||
|
*
|
||||||
|
* Generates an array of column names
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function list_fields()
|
||||||
|
{
|
||||||
|
$field_names = array();
|
||||||
|
for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++)
|
||||||
|
{
|
||||||
|
$field_names[] = oci_field_name($this->stmt_id, $c);
|
||||||
|
}
|
||||||
|
return $field_names;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field data
|
||||||
|
*
|
||||||
|
* Generates an array of objects containing field meta-data
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function field_data()
|
||||||
|
{
|
||||||
|
$retval = array();
|
||||||
|
for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++)
|
||||||
|
{
|
||||||
|
$F = new stdClass();
|
||||||
|
$F->name = oci_field_name($this->stmt_id, $c);
|
||||||
|
$F->type = oci_field_type($this->stmt_id, $c);
|
||||||
|
$F->max_length = oci_field_size($this->stmt_id, $c);
|
||||||
|
|
||||||
|
$retval[] = $F;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the result
|
||||||
|
*
|
||||||
|
* @return null
|
||||||
|
*/
|
||||||
|
public function free_result()
|
||||||
|
{
|
||||||
|
if (is_resource($this->result_id))
|
||||||
|
{
|
||||||
|
oci_free_statement($this->result_id);
|
||||||
|
$this->result_id = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result - associative array
|
||||||
|
*
|
||||||
|
* Returns the result set as an array
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function _fetch_assoc()
|
||||||
|
{
|
||||||
|
$id = ($this->curs_id) ? $this->curs_id : $this->stmt_id;
|
||||||
|
return oci_fetch_assoc($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result - object
|
||||||
|
*
|
||||||
|
* Returns the result set as an object
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
protected function _fetch_object()
|
||||||
|
{
|
||||||
|
$id = ($this->curs_id) ? $this->curs_id : $this->stmt_id;
|
||||||
|
return @oci_fetch_object($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query result. "array" version.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function result_array()
|
||||||
|
{
|
||||||
|
if (count($this->result_array) > 0)
|
||||||
|
{
|
||||||
|
return $this->result_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
$row = NULL;
|
||||||
|
while ($row = $this->_fetch_assoc())
|
||||||
|
{
|
||||||
|
$this->result_array[] = $row;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->result_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data Seek
|
||||||
|
*
|
||||||
|
* Moves the internal pointer to the desired offset. We call
|
||||||
|
* this internally before fetching results to make sure the
|
||||||
|
* result set starts at zero
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function _data_seek($n = 0)
|
||||||
|
{
|
||||||
|
return FALSE; // Not needed
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* End of file oci8_result.php */
|
||||||
|
/* Location: ./system/database/drivers/oci8/oci8_result.php */
|
87
system/database/drivers/oci8/oci8_utility.php
Normal file
87
system/database/drivers/oci8/oci8_utility.php
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP 5.1.6 or newer
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
|
||||||
|
* @license http://codeigniter.com/user_guide/license.html
|
||||||
|
* @link http://codeigniter.com
|
||||||
|
* @since Version 1.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Oracle Utility Class
|
||||||
|
*
|
||||||
|
* @category Database
|
||||||
|
* @author ExpressionEngine Dev Team
|
||||||
|
* @link http://codeigniter.com/user_guide/database/
|
||||||
|
*/
|
||||||
|
class CI_DB_oci8_utility extends CI_DB_utility {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List databases
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function _list_databases()
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optimize table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be optimized
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _optimize_table($table)
|
||||||
|
{
|
||||||
|
return FALSE; // Is this supported in Oracle?
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Repair table query
|
||||||
|
*
|
||||||
|
* Generates a platform-specific query so that a table can be repaired
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string the table name
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
|
function _repair_table($table)
|
||||||
|
{
|
||||||
|
return FALSE; // Is this supported in Oracle?
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Oracle Export
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param array Preferences
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function _backup($params = array())
|
||||||
|
{
|
||||||
|
// Currently unsupported
|
||||||
|
return $this->db->display_error('db_unsuported_feature');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of file oci8_utility.php */
|
||||||
|
/* Location: ./system/database/drivers/oci8/oci8_utility.php */
|
10
system/database/drivers/odbc/index.html
Normal file
10
system/database/drivers/odbc/index.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>403 Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>Directory access is forbidden.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user