Update CodeIgniter version and associated config
This commit is contained in:
parent
ca959b0367
commit
b96a69f592
@ -3,10 +3,8 @@ language: php
|
|||||||
sudo: false
|
sudo: false
|
||||||
|
|
||||||
php:
|
php:
|
||||||
- 5.4
|
|
||||||
- 5.5
|
|
||||||
- 5.6
|
|
||||||
- 7.0
|
- 7.0
|
||||||
|
- 7.1
|
||||||
- hhvm
|
- hhvm
|
||||||
|
|
||||||
install:
|
install:
|
||||||
|
@ -106,6 +106,27 @@ $config['enable_hooks'] = TRUE;
|
|||||||
*/
|
*/
|
||||||
$config['subclass_prefix'] = 'MY_';
|
$config['subclass_prefix'] = 'MY_';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Composer auto-loading
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Enabling this setting will tell CodeIgniter to look for a Composer
|
||||||
|
| package auto-loader script in application/vendor/autoload.php.
|
||||||
|
|
|
||||||
|
| $config['composer_autoload'] = TRUE;
|
||||||
|
|
|
||||||
|
| Or if you have your vendor/ directory located somewhere else, you
|
||||||
|
| can opt to set a specific path as well:
|
||||||
|
|
|
||||||
|
| $config['composer_autoload'] = '/path/to/vendor/autoload.php';
|
||||||
|
|
|
||||||
|
| For more information about Composer, please visit http://getcomposer.org/
|
||||||
|
|
|
||||||
|
| Note: This will NOT disable or override the CodeIgniter-specific
|
||||||
|
| autoloading (application/config/autoload.php)
|
||||||
|
*/
|
||||||
|
$config['composer_autoload'] = FALSE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
@ -149,11 +170,25 @@ $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
|
|||||||
| use segment based URLs.
|
| use segment based URLs.
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
$config['allow_get_array'] = TRUE;
|
|
||||||
$config['enable_query_strings'] = FALSE;
|
$config['enable_query_strings'] = FALSE;
|
||||||
$config['controller_trigger'] = 'c';
|
$config['controller_trigger'] = 'c';
|
||||||
$config['function_trigger'] = 'm';
|
$config['function_trigger'] = 'm';
|
||||||
$config['directory_trigger'] = 'd'; // experimental not currently in use
|
$config['directory_trigger'] = 'd';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Allow $_GET array
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| 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.
|
||||||
|
|
|
||||||
|
| WARNING: This feature is DEPRECATED and currently available only
|
||||||
|
| for backwards compatibility purposes!
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['allow_get_array'] = TRUE;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
@ -188,6 +223,33 @@ $config['log_threshold'] = 1;
|
|||||||
*/
|
*/
|
||||||
$config['log_path'] = '';
|
$config['log_path'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Log File Extension
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| The default filename extension for log files. The default 'php' allows for
|
||||||
|
| protecting the log files via basic scripting, when they are to be stored
|
||||||
|
| under a publicly accessible directory.
|
||||||
|
|
|
||||||
|
| Note: Leaving it blank will default to 'php'.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['log_file_extension'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Log File Permissions
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| The file system permissions to be applied on newly created log files.
|
||||||
|
|
|
||||||
|
| IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal
|
||||||
|
| integer notation (i.e. 0700, 0644, etc.)
|
||||||
|
*/
|
||||||
|
$config['log_file_permissions'] = 0644;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Date Format for Logs
|
| Date Format for Logs
|
||||||
@ -199,6 +261,17 @@ $config['log_path'] = '';
|
|||||||
*/
|
*/
|
||||||
$config['log_date_format'] = 'Y-m-d H:i:s';
|
$config['log_date_format'] = 'Y-m-d H:i:s';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Error Views Directory Path
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Leave this BLANK unless you would like to set something other than the default
|
||||||
|
| application/views/errors/ directory. Use a full server path with trailing slash.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['error_views_path'] = '';
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Cache Directory Path
|
| Cache Directory Path
|
||||||
@ -210,6 +283,24 @@ $config['log_date_format'] = 'Y-m-d H:i:s';
|
|||||||
*/
|
*/
|
||||||
$config['cache_path'] = '';
|
$config['cache_path'] = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Cache Include Query String
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Whether to take the URL query string into consideration when generating
|
||||||
|
| output cache files. Valid options are:
|
||||||
|
|
|
||||||
|
| FALSE = Disabled
|
||||||
|
| TRUE = Enabled, take all query parameters into account.
|
||||||
|
| Please be aware that this may result in numerous cache
|
||||||
|
| files generated for the same page over and over again.
|
||||||
|
| array('q') = Enabled, but only take into account the specified list
|
||||||
|
| of query parameters.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$config['cache_query_string'] = FALSE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Encryption Key
|
| Encryption Key
|
||||||
@ -226,21 +317,59 @@ $config['encryption_key'] = "xLx45kOkywjdvvVMxLov";
|
|||||||
| Session Variables
|
| Session Variables
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
| 'session_cookie_name' = the name you want for the cookie
|
| 'sess_driver'
|
||||||
| 'encrypt_sess_cookie' = TRUE/FALSE (boolean). Whether to encrypt the cookie
|
|
|
||||||
| 'session_expiration' = the number of SECONDS you want the session to last.
|
| The storage driver to use: files, database, redis, memcached
|
||||||
| by default sessions last 7200 seconds (two hours). Set to zero for no expiration.
|
|
|
||||||
| 'time_to_update' = how many seconds between CI refreshing Session Information
|
| 'sess_cookie_name'
|
||||||
|
|
|
||||||
|
| The session cookie name, must contain only [0-9a-z_-] characters
|
||||||
|
|
|
||||||
|
| 'sess_expiration'
|
||||||
|
|
|
||||||
|
| The number of SECONDS you want the session to last.
|
||||||
|
| Setting to 0 (zero) means expire when the browser is closed.
|
||||||
|
|
|
||||||
|
| 'sess_save_path'
|
||||||
|
|
|
||||||
|
| The location to save sessions to, driver dependent.
|
||||||
|
|
|
||||||
|
| For the 'files' driver, it's a path to a writable directory.
|
||||||
|
| WARNING: Only absolute paths are supported!
|
||||||
|
|
|
||||||
|
| For the 'database' driver, it's a table name.
|
||||||
|
| Please read up the manual for the format with other session drivers.
|
||||||
|
|
|
||||||
|
| IMPORTANT: You are REQUIRED to set a valid save path!
|
||||||
|
|
|
||||||
|
| 'sess_match_ip'
|
||||||
|
|
|
||||||
|
| Whether to match the user's IP address when reading the session data.
|
||||||
|
|
|
||||||
|
| WARNING: If you're using the database driver, don't forget to update
|
||||||
|
| your session table's PRIMARY KEY when changing this setting.
|
||||||
|
|
|
||||||
|
| 'sess_time_to_update'
|
||||||
|
|
|
||||||
|
| How many seconds between CI regenerating the session ID.
|
||||||
|
|
|
||||||
|
| 'sess_regenerate_destroy'
|
||||||
|
|
|
||||||
|
| Whether to destroy session data associated with the old session ID
|
||||||
|
| when auto-regenerating the session ID. When set to FALSE, the data
|
||||||
|
| will be later deleted by the garbage collector.
|
||||||
|
|
|
||||||
|
| Other session cookie settings are shared with the rest of the application,
|
||||||
|
| except for 'cookie_prefix' and 'cookie_httponly', which are ignored here.
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
$config['sess_driver'] = 'database';
|
||||||
$config['sess_cookie_name'] = 'sess';
|
$config['sess_cookie_name'] = 'sess';
|
||||||
$config['sess_expiration'] = 43200; //12 hours
|
$config['sess_expiration'] = 43200; //12 hours
|
||||||
$config['sess_encrypt_cookie'] = FALSE;
|
$config['sess_save_path'] = 'ci_sessions';
|
||||||
$config['sess_use_database'] = TRUE;
|
$config['sess_match_ip'] = FALSE;
|
||||||
$config['sess_table_name'] = 'ci_sessions';
|
|
||||||
$config['sess_match_ip'] = TRUE;
|
|
||||||
$config['sess_match_useragent'] = TRUE;
|
|
||||||
$config['sess_time_to_update'] = 300;
|
$config['sess_time_to_update'] = 300;
|
||||||
|
$config['sess_regenerate_destroy'] = FALSE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
@ -280,11 +409,15 @@ $config['global_xss_filtering'] = FALSE;
|
|||||||
| 'csrf_token_name' = The token name
|
| 'csrf_token_name' = The token name
|
||||||
| 'csrf_cookie_name' = The cookie name
|
| 'csrf_cookie_name' = The cookie name
|
||||||
| 'csrf_expire' = The number in seconds the token should expire.
|
| 'csrf_expire' = The number in seconds the token should expire.
|
||||||
|
| 'csrf_regenerate' = Regenerate token on every submission
|
||||||
|
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
|
||||||
*/
|
*/
|
||||||
$config['csrf_protection'] = TRUE;
|
$config['csrf_protection'] = FALSE;
|
||||||
$config['csrf_token_name'] = 'csrf_token';
|
$config['csrf_token_name'] = 'csrf_token';
|
||||||
$config['csrf_cookie_name'] = 'csrf_cookie';
|
$config['csrf_cookie_name'] = 'csrf_cookie';
|
||||||
$config['csrf_expire'] = 7200;
|
$config['csrf_expire'] = 7200;
|
||||||
|
$config['csrf_regenerate'] = TRUE;
|
||||||
|
$config['csrf_exclude_uris'] = array();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
@ -296,13 +429,17 @@ $config['csrf_expire'] = 7200;
|
|||||||
| Even if it does, however, not all browsers support compression
|
| Even if it does, however, not all browsers support compression
|
||||||
| so enable only if you are reasonably sure your visitors can handle it.
|
| so enable only if you are reasonably sure your visitors can handle it.
|
||||||
|
|
|
|
||||||
|
| Only used if zlib.output_compression is turned off in your php.ini.
|
||||||
|
| Please do not use it together with httpd-level output compression.
|
||||||
|
|
|
||||||
| VERY IMPORTANT: If you are getting a blank page when compression is enabled 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
|
| 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
|
| 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
|
| 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.
|
| by the output class. Do not 'echo' any values with compression enabled.
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
$config['compress_output'] = TRUE;
|
$config['compress_output'] = TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,41 +1,79 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
| -------------------------------------------------------------------
|
| -------------------------------------------------------------------
|
||||||
| DATABASE CONNECTIVITY SETTINGS
|
| DATABASE CONNECTIVITY SETTINGS
|
||||||
| -------------------------------------------------------------------
|
| -------------------------------------------------------------------
|
||||||
| This file will contain the settings needed to access your database.
|
| This file will contain the settings needed to access your database.
|
||||||
|
|
|
|
||||||
| For complete instructions please consult the "Database Connection"
|
| For complete instructions please consult the 'Database Connection'
|
||||||
| page of the User Guide.
|
| page of the User Guide.
|
||||||
|
|
|
|
||||||
| -------------------------------------------------------------------
|
| -------------------------------------------------------------------
|
||||||
| EXPLANATION OF VARIABLES
|
| EXPLANATION OF VARIABLES
|
||||||
| -------------------------------------------------------------------
|
| -------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
|
| ['dsn'] The full DSN string describe a connection to the database.
|
||||||
| ['hostname'] The hostname of your database server.
|
| ['hostname'] The hostname of your database server.
|
||||||
| ['username'] The username used to connect to the database
|
| ['username'] The username used to connect to the database
|
||||||
| ['password'] The password 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
|
| ['database'] The name of the database you want to connect to
|
||||||
| ['dbdriver'] The database type. ie: mysql. Currently supported:
|
| ['dbdriver'] The database driver. e.g.: mysqli.
|
||||||
mysql, mysqli, postgre, odbc, mssql, sqlite, oci8
|
| Currently supported:
|
||||||
|
| cubrid, ibase, mssql, mysql, mysqli, oci8,
|
||||||
|
| odbc, pdo, postgre, sqlite, sqlite3, sqlsrv
|
||||||
| ['dbprefix'] You can add an optional prefix, which will be added
|
| ['dbprefix'] You can add an optional prefix, which will be added
|
||||||
| to the table name when using the Active Record class
|
| to the table name when using the Query Builder class
|
||||||
| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
|
| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
|
||||||
| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
|
| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
|
||||||
| ['cache_on'] TRUE/FALSE - Enables/disables query caching
|
| ['cache_on'] TRUE/FALSE - Enables/disables query caching
|
||||||
| ['cachedir'] The path to the folder where cache files should be stored
|
| ['cachedir'] The path to the folder where cache files should be stored
|
||||||
| ['char_set'] The character set used in communicating with the database
|
| ['char_set'] The character set used in communicating with the database
|
||||||
| ['dbcollat'] The character collation used in communicating with the database
|
| ['dbcollat'] The character collation used in communicating with the database
|
||||||
|
| NOTE: For MySQL and MySQLi databases, this setting is only used
|
||||||
|
| as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7
|
||||||
|
| (and in table creation queries made with DB Forge).
|
||||||
|
| There is an incompatibility in PHP with mysql_real_escape_string() which
|
||||||
|
| can make your site vulnerable to SQL injection if you are using a
|
||||||
|
| multi-byte character set and are running versions lower than these.
|
||||||
|
| Sites using Latin-1 or UTF-8 database character set and collation are unaffected.
|
||||||
|
| ['swap_pre'] A default table prefix that should be swapped with the dbprefix
|
||||||
|
| ['encrypt'] Whether or not to use an encrypted connection.
|
||||||
|
|
|
||||||
|
| 'mysql' (deprecated), 'sqlsrv' and 'pdo/sqlsrv' drivers accept TRUE/FALSE
|
||||||
|
| 'mysqli' and 'pdo/mysql' drivers accept an array with the following options:
|
||||||
|
|
|
||||||
|
| 'ssl_key' - Path to the private key file
|
||||||
|
| 'ssl_cert' - Path to the public key certificate file
|
||||||
|
| 'ssl_ca' - Path to the certificate authority file
|
||||||
|
| 'ssl_capath' - Path to a directory containing trusted CA certificates in PEM format
|
||||||
|
| 'ssl_cipher' - List of *allowed* ciphers to be used for the encryption, separated by colons (':')
|
||||||
|
| 'ssl_verify' - TRUE/FALSE; Whether verify the server certificate or not
|
||||||
|
|
|
||||||
|
| ['compress'] Whether or not to use client compression (MySQL only)
|
||||||
|
| ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
|
||||||
|
| - good for ensuring strict SQL while developing
|
||||||
|
| ['ssl_options'] Used to set various SSL options that can be used when making SSL connections.
|
||||||
|
| ['failover'] array - A array with 0 or more data for connections if the main should fail.
|
||||||
|
| ['save_queries'] TRUE/FALSE - Whether to "save" all executed queries.
|
||||||
|
| NOTE: Disabling this will also effectively disable both
|
||||||
|
| $this->db->last_query() and profiling of DB queries.
|
||||||
|
| When you run a query, with this setting set to TRUE (default),
|
||||||
|
| CodeIgniter will store the SQL statement for debugging purposes.
|
||||||
|
| However, this may cause high memory usage, especially if you run
|
||||||
|
| a lot of SQL queries ... disable this to avoid that problem.
|
||||||
|
|
|
|
||||||
| The $active_group variable lets you choose which connection group to
|
| The $active_group variable lets you choose which connection group to
|
||||||
| make active. By mysql there is only one group (the "mysql" group).
|
| 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 $query_builder variables lets you determine whether or not to load
|
||||||
| the active record class
|
| the query builder class.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
$active_group = "todo";
|
$active_group = "todo";
|
||||||
$active_record = TRUE;
|
$query_builder = TRUE;
|
||||||
|
|
||||||
$db = [
|
$db = [
|
||||||
'todo' => [
|
'todo' => [
|
||||||
@ -45,7 +83,7 @@ $db = [
|
|||||||
'database' => 'todo',
|
'database' => 'todo',
|
||||||
'dbdriver' => 'postgre',
|
'dbdriver' => 'postgre',
|
||||||
'dbprefix' => 'todo_',
|
'dbprefix' => 'todo_',
|
||||||
'pconnect' => TRUE,
|
'pconnect' => FALSE,
|
||||||
'db_debug' => TRUE,
|
'db_debug' => TRUE,
|
||||||
'cache_on' => FALSE,
|
'cache_on' => FALSE,
|
||||||
'cachedir' => '',
|
'cachedir' => '',
|
||||||
@ -53,7 +91,8 @@ $db = [
|
|||||||
'dbcollat' => 'utf8_general_ci',
|
'dbcollat' => 'utf8_general_ci',
|
||||||
'swap_pre' => '',
|
'swap_pre' => '',
|
||||||
'autoinit' => TRUE,
|
'autoinit' => TRUE,
|
||||||
'stricton' => FALSE
|
'stricton' => TRUE,
|
||||||
|
'save_queries' => TRUE,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
64
application/views/errors/html/error_404.php
Normal file
64
application/views/errors/html/error_404.php
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
?><!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>404 Page Not Found</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
::selection { background-color: #E13300; color: white; }
|
||||||
|
::-moz-selection { background-color: #E13300; color: white; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: #fff;
|
||||||
|
margin: 40px;
|
||||||
|
font: 13px/20px normal Helvetica, Arial, sans-serif;
|
||||||
|
color: #4F5155;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #003399;
|
||||||
|
background-color: transparent;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: #444;
|
||||||
|
background-color: transparent;
|
||||||
|
border-bottom: 1px solid #D0D0D0;
|
||||||
|
font-size: 19px;
|
||||||
|
font-weight: normal;
|
||||||
|
margin: 0 0 14px 0;
|
||||||
|
padding: 14px 15px 10px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
font-family: Consolas, Monaco, Courier New, Courier, monospace;
|
||||||
|
font-size: 12px;
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
border: 1px solid #D0D0D0;
|
||||||
|
color: #002166;
|
||||||
|
display: block;
|
||||||
|
margin: 14px 0 14px 0;
|
||||||
|
padding: 12px 10px 12px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
margin: 10px;
|
||||||
|
border: 1px solid #D0D0D0;
|
||||||
|
box-shadow: 0 0 8px #D0D0D0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 12px 15px 12px 15px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="container">
|
||||||
|
<h1><?php echo $heading; ?></h1>
|
||||||
|
<?php echo $message; ?>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
64
application/views/errors/html/error_db.php
Normal file
64
application/views/errors/html/error_db.php
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
?><!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Database Error</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
::selection { background-color: #E13300; color: white; }
|
||||||
|
::-moz-selection { background-color: #E13300; color: white; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: #fff;
|
||||||
|
margin: 40px;
|
||||||
|
font: 13px/20px normal Helvetica, Arial, sans-serif;
|
||||||
|
color: #4F5155;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #003399;
|
||||||
|
background-color: transparent;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: #444;
|
||||||
|
background-color: transparent;
|
||||||
|
border-bottom: 1px solid #D0D0D0;
|
||||||
|
font-size: 19px;
|
||||||
|
font-weight: normal;
|
||||||
|
margin: 0 0 14px 0;
|
||||||
|
padding: 14px 15px 10px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
font-family: Consolas, Monaco, Courier New, Courier, monospace;
|
||||||
|
font-size: 12px;
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
border: 1px solid #D0D0D0;
|
||||||
|
color: #002166;
|
||||||
|
display: block;
|
||||||
|
margin: 14px 0 14px 0;
|
||||||
|
padding: 12px 10px 12px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
margin: 10px;
|
||||||
|
border: 1px solid #D0D0D0;
|
||||||
|
box-shadow: 0 0 8px #D0D0D0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 12px 15px 12px 15px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="container">
|
||||||
|
<h1><?php echo $heading; ?></h1>
|
||||||
|
<?php echo $message; ?>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
32
application/views/errors/html/error_exception.php
Normal file
32
application/views/errors/html/error_exception.php
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">
|
||||||
|
|
||||||
|
<h4>An uncaught Exception was encountered</h4>
|
||||||
|
|
||||||
|
<p>Type: <?php echo get_class($exception); ?></p>
|
||||||
|
<p>Message: <?php echo $message; ?></p>
|
||||||
|
<p>Filename: <?php echo $exception->getFile(); ?></p>
|
||||||
|
<p>Line Number: <?php echo $exception->getLine(); ?></p>
|
||||||
|
|
||||||
|
<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === TRUE): ?>
|
||||||
|
|
||||||
|
<p>Backtrace:</p>
|
||||||
|
<?php foreach ($exception->getTrace() as $error): ?>
|
||||||
|
|
||||||
|
<?php if (isset($error['file']) && strpos($error['file'], realpath(BASEPATH)) !== 0): ?>
|
||||||
|
|
||||||
|
<p style="margin-left:10px">
|
||||||
|
File: <?php echo $error['file']; ?><br />
|
||||||
|
Line: <?php echo $error['line']; ?><br />
|
||||||
|
Function: <?php echo $error['function']; ?>
|
||||||
|
</p>
|
||||||
|
<?php endif ?>
|
||||||
|
|
||||||
|
<?php endforeach ?>
|
||||||
|
|
||||||
|
<?php endif ?>
|
||||||
|
|
||||||
|
</div>
|
64
application/views/errors/html/error_general.php
Normal file
64
application/views/errors/html/error_general.php
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
?><!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Error</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
::selection { background-color: #E13300; color: white; }
|
||||||
|
::-moz-selection { background-color: #E13300; color: white; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: #fff;
|
||||||
|
margin: 40px;
|
||||||
|
font: 13px/20px normal Helvetica, Arial, sans-serif;
|
||||||
|
color: #4F5155;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #003399;
|
||||||
|
background-color: transparent;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: #444;
|
||||||
|
background-color: transparent;
|
||||||
|
border-bottom: 1px solid #D0D0D0;
|
||||||
|
font-size: 19px;
|
||||||
|
font-weight: normal;
|
||||||
|
margin: 0 0 14px 0;
|
||||||
|
padding: 14px 15px 10px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
font-family: Consolas, Monaco, Courier New, Courier, monospace;
|
||||||
|
font-size: 12px;
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
border: 1px solid #D0D0D0;
|
||||||
|
color: #002166;
|
||||||
|
display: block;
|
||||||
|
margin: 14px 0 14px 0;
|
||||||
|
padding: 12px 10px 12px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
margin: 10px;
|
||||||
|
border: 1px solid #D0D0D0;
|
||||||
|
box-shadow: 0 0 8px #D0D0D0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 12px 15px 12px 15px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="container">
|
||||||
|
<h1><?php echo $heading; ?></h1>
|
||||||
|
<?php echo $message; ?>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
33
application/views/errors/html/error_php.php
Normal file
33
application/views/errors/html/error_php.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
?>
|
||||||
|
|
||||||
|
<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>
|
||||||
|
|
||||||
|
<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === TRUE): ?>
|
||||||
|
|
||||||
|
<p>Backtrace:</p>
|
||||||
|
<?php foreach (debug_backtrace() as $error): ?>
|
||||||
|
|
||||||
|
<?php if (isset($error['file']) && strpos($error['file'], realpath(BASEPATH)) !== 0): ?>
|
||||||
|
|
||||||
|
<p style="margin-left:10px">
|
||||||
|
File: <?php echo $error['file'] ?><br />
|
||||||
|
Line: <?php echo $error['line'] ?><br />
|
||||||
|
Function: <?php echo $error['function'] ?>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<?php endif ?>
|
||||||
|
|
||||||
|
<?php endforeach ?>
|
||||||
|
|
||||||
|
<?php endif ?>
|
||||||
|
|
||||||
|
</div>
|
@ -18,7 +18,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
<p>If it sounds interesting, or useful, sign up and try it out.</p>
|
<p>If it sounds interesting, or useful, sign up and try it out.</p>
|
||||||
<p><strong>Want to try it without creating an account? Login with username: <em>guest</em> and password: <em>guest</em></strong></p>
|
<p><strong>Want to try it without creating an account? Login with username: <em>guest</em> and password: <em>guest</em></strong></p>
|
||||||
<p>It's nice to have feedback. Send suggestions/comments/criticism to <a href="mailto:tim@timshomepage.net?subject=Tim's Todo Feedback">tim (at) timshomepage.net</a> or <a href="http://twitter.com/timw4mail">@timw4mail</a> on Twitter.</p>
|
<p>It's nice to have feedback. Send suggestions/comments/criticism to <a href="mailto:tim@timshomepage.net?subject=Tim's Todo Feedback">tim (at) timshomepage.net</a>.</p>
|
||||||
</section>
|
</section>
|
||||||
<section class="right">
|
<section class="right">
|
||||||
<?= form_open('login') ?>
|
<?= form_open('login') ?>
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
<?= $this->pagination->create_links(); ?>
|
<?= $this->pagination->create_links(); ?>
|
||||||
</section>
|
</section>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
<?php elseif(count($task_list) < 1): ?>
|
<?php elseif(empty($task_list)): ?>
|
||||||
<h1><?= $list_type ?> Tasks</h1>
|
<h1><?= $list_type ?> Tasks</h1>
|
||||||
<p>You currently have no <?= $list_type ?> tasks.</p>
|
<p>You currently have no <?= $list_type ?> tasks.</p>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
"role": "Developer"
|
"role": "Developer"
|
||||||
}],
|
}],
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.4",
|
"php": ">=7.0",
|
||||||
"robmorgan/phinx": "*",
|
"robmorgan/phinx": "*",
|
||||||
"ircmaxell/password-compat": "1.0.*"
|
"ircmaxell/password-compat": "1.0.*"
|
||||||
}
|
}
|
||||||
|
49
migrations/20190220154203_recreate_session_db_table.php
Normal file
49
migrations/20190220154203_recreate_session_db_table.php
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Phinx\Migration\AbstractMigration;
|
||||||
|
|
||||||
|
class RecreateSessionDbTable extends AbstractMigration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Change Method.
|
||||||
|
*
|
||||||
|
* More information on this method is available here:
|
||||||
|
* http://docs.phinx.org/en/latest/migrations.html#the-change-method
|
||||||
|
*
|
||||||
|
* Uncomment this method if you would like to use it.
|
||||||
|
*/
|
||||||
|
public function change()
|
||||||
|
{
|
||||||
|
// Session storage table
|
||||||
|
if ($this->hasTable('todo_ci_sessions'))
|
||||||
|
{
|
||||||
|
$this->table('todo_ci_sessions')->drop();
|
||||||
|
|
||||||
|
$this->table('todo_ci_sessions', [
|
||||||
|
'id' => FALSE,
|
||||||
|
'primary_key' => 'id'
|
||||||
|
])->addColumn('id' , 'string', ['limit' => 128, 'null' => FALSE])
|
||||||
|
->addColumn('ip_address', 'string', ['limit' => 45, 'null' => FALSE])
|
||||||
|
->addColumn('timestamp', 'integer', ['default' => 0, 'null' => FALSE])
|
||||||
|
->addColumn('data', 'text', ['default' => '', 'null' => FALSE])
|
||||||
|
->create();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Migrate Up.
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Migrate Down.
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
33
phinx.yml
Normal file
33
phinx.yml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
paths:
|
||||||
|
migrations: %%PHINX_CONFIG_DIR%%/migrations
|
||||||
|
|
||||||
|
environments:
|
||||||
|
default_migration_table: phinxlog
|
||||||
|
default_database: development
|
||||||
|
|
||||||
|
development:
|
||||||
|
adapter: pgsql
|
||||||
|
host: localhost
|
||||||
|
name: todo
|
||||||
|
user: todo
|
||||||
|
pass: todo
|
||||||
|
port: 5432
|
||||||
|
charset: utf8
|
||||||
|
|
||||||
|
testing:
|
||||||
|
adapter: pgsql
|
||||||
|
host: localhost
|
||||||
|
name: todo_test
|
||||||
|
user: todo_test
|
||||||
|
pass: test
|
||||||
|
port: 5432
|
||||||
|
charset: utf8
|
||||||
|
|
||||||
|
node:
|
||||||
|
adapter: mysql
|
||||||
|
host: localhost
|
||||||
|
name: node
|
||||||
|
user: node
|
||||||
|
pass: node
|
||||||
|
port: 3306
|
||||||
|
charset: utf8
|
5
system/.htaccess
Executable file → Normal file
5
system/.htaccess
Executable file → Normal file
@ -1 +1,6 @@
|
|||||||
|
<IfModule authz_core_module>
|
||||||
|
Require all denied
|
||||||
|
</IfModule>
|
||||||
|
<IfModule !authz_core_module>
|
||||||
Deny from all
|
Deny from all
|
||||||
|
</IfModule>
|
99
system/core/Benchmark.php
Executable file → Normal file
99
system/core/Benchmark.php
Executable file → Normal file
@ -1,22 +1,44 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CodeIgniter Benchmark Class
|
* Benchmark Class
|
||||||
*
|
*
|
||||||
* This class enables you to mark points and calculate the time difference
|
* This class enables you to mark points and calculate the time difference
|
||||||
* between them. Memory consumption can also be displayed.
|
* between them. Memory consumption can also be displayed.
|
||||||
@ -24,38 +46,37 @@
|
|||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage Libraries
|
* @subpackage Libraries
|
||||||
* @category Libraries
|
* @category Libraries
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/libraries/benchmark.html
|
* @link https://codeigniter.com/user_guide/libraries/benchmark.html
|
||||||
*/
|
*/
|
||||||
class CI_Benchmark {
|
class CI_Benchmark {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of all benchmark markers and when they were added
|
* List of all benchmark markers
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
var $marker = array();
|
public $marker = array();
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a benchmark marker
|
* Set a benchmark marker
|
||||||
*
|
*
|
||||||
* Multiple calls to this function can be made so that several
|
* Multiple calls to this function can be made so that several
|
||||||
* execution points can be timed
|
* execution points can be timed.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $name Marker name
|
||||||
* @param string $name name of the marker
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function mark($name)
|
public function mark($name)
|
||||||
{
|
{
|
||||||
$this->marker[$name] = microtime();
|
$this->marker[$name] = microtime(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Elapsed time
|
||||||
|
*
|
||||||
* Calculates the time difference between two marked points.
|
* Calculates the time difference between two marked points.
|
||||||
*
|
*
|
||||||
* If the first parameter is empty this function instead returns the
|
* If the first parameter is empty this function instead returns the
|
||||||
@ -63,15 +84,17 @@ class CI_Benchmark {
|
|||||||
* execution time to be shown in a template. The output class will
|
* execution time to be shown in a template. The output class will
|
||||||
* swap the real value for this variable.
|
* swap the real value for this variable.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $point1 A particular marked point
|
||||||
* @param string a particular marked point
|
* @param string $point2 A particular marked point
|
||||||
* @param string a particular marked point
|
* @param int $decimals Number of decimal places
|
||||||
* @param integer the number of decimal places
|
*
|
||||||
* @return mixed
|
* @return string Calculated elapsed time on success,
|
||||||
|
* an '{elapsed_string}' if $point1 is empty
|
||||||
|
* or an empty string if $point1 is not found.
|
||||||
*/
|
*/
|
||||||
function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
|
public function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
|
||||||
{
|
{
|
||||||
if ($point1 == '')
|
if ($point1 === '')
|
||||||
{
|
{
|
||||||
return '{elapsed_time}';
|
return '{elapsed_time}';
|
||||||
}
|
}
|
||||||
@ -83,13 +106,10 @@ class CI_Benchmark {
|
|||||||
|
|
||||||
if ( ! isset($this->marker[$point2]))
|
if ( ! isset($this->marker[$point2]))
|
||||||
{
|
{
|
||||||
$this->marker[$point2] = microtime();
|
$this->marker[$point2] = microtime(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
list($sm, $ss) = explode(' ', $this->marker[$point1]);
|
return number_format($this->marker[$point2] - $this->marker[$point1], $decimals);
|
||||||
list($em, $es) = explode(' ', $this->marker[$point2]);
|
|
||||||
|
|
||||||
return number_format(($em + $es) - ($sm + $ss), $decimals);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -97,22 +117,17 @@ class CI_Benchmark {
|
|||||||
/**
|
/**
|
||||||
* Memory Usage
|
* Memory Usage
|
||||||
*
|
*
|
||||||
* This function returns the {memory_usage} pseudo-variable.
|
* Simply returns the {memory_usage} marker.
|
||||||
|
*
|
||||||
* This permits it to be put it anywhere in a template
|
* This permits it to be put it anywhere in a template
|
||||||
* without the memory being calculated until the end.
|
* without the memory being calculated until the end.
|
||||||
* The output class will swap the real value for this variable.
|
* The output class will swap the real value for this variable.
|
||||||
*
|
*
|
||||||
* @access public
|
* @return string '{memory_usage}'
|
||||||
* @return string
|
|
||||||
*/
|
*/
|
||||||
function memory_usage()
|
public function memory_usage()
|
||||||
{
|
{
|
||||||
return '{memory_usage}';
|
return '{memory_usage}';
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// END CI_Benchmark class
|
|
||||||
|
|
||||||
/* End of file Benchmark.php */
|
|
||||||
/* Location: ./system/core/Benchmark.php */
|
|
469
system/core/CodeIgniter.php
Executable file → Normal file
469
system/core/CodeIgniter.php
Executable file → Normal file
@ -1,19 +1,41 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* System Initialization File
|
* System Initialization File
|
||||||
@ -21,10 +43,10 @@
|
|||||||
* Loads the base classes and executes the request.
|
* Loads the base classes and executes the request.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage codeigniter
|
* @subpackage CodeIgniter
|
||||||
* @category Front-controller
|
* @category Front-controller
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/
|
* @link https://codeigniter.com/user_guide/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -33,48 +55,89 @@
|
|||||||
* @var string
|
* @var string
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
define('CI_VERSION', '2.2.0');
|
const CI_VERSION = '3.1.10';
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
* Load the framework constants
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php'))
|
if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php'))
|
||||||
{
|
{
|
||||||
require(APPPATH.'config/'.ENVIRONMENT.'/constants.php');
|
require_once(APPPATH.'config/'.ENVIRONMENT.'/constants.php');
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (file_exists(APPPATH.'config/constants.php'))
|
||||||
{
|
{
|
||||||
require(APPPATH.'config/constants.php');
|
require_once(APPPATH.'config/constants.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Load the global functions
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
require_once(BASEPATH.'core/Common.php');
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Security procedures
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( ! is_php('5.4'))
|
||||||
|
{
|
||||||
|
ini_set('magic_quotes_runtime', 0);
|
||||||
|
|
||||||
|
if ((bool) ini_get('register_globals'))
|
||||||
|
{
|
||||||
|
$_protected = array(
|
||||||
|
'_SERVER',
|
||||||
|
'_GET',
|
||||||
|
'_POST',
|
||||||
|
'_FILES',
|
||||||
|
'_REQUEST',
|
||||||
|
'_SESSION',
|
||||||
|
'_ENV',
|
||||||
|
'_COOKIE',
|
||||||
|
'GLOBALS',
|
||||||
|
'HTTP_RAW_POST_DATA',
|
||||||
|
'system_path',
|
||||||
|
'application_folder',
|
||||||
|
'view_folder',
|
||||||
|
'_protected',
|
||||||
|
'_registered'
|
||||||
|
);
|
||||||
|
|
||||||
|
$_registered = ini_get('variables_order');
|
||||||
|
foreach (array('E' => '_ENV', 'G' => '_GET', 'P' => '_POST', 'C' => '_COOKIE', 'S' => '_SERVER') as $key => $superglobal)
|
||||||
|
{
|
||||||
|
if (strpos($_registered, $key) === FALSE)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (array_keys($$superglobal) as $var)
|
||||||
|
{
|
||||||
|
if (isset($GLOBALS[$var]) && ! in_array($var, $_protected, TRUE))
|
||||||
|
{
|
||||||
|
$GLOBALS[$var] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
* Define a custom error handler so we can log PHP errors
|
* Define a custom error handler so we can log PHP errors
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
set_error_handler('_exception_handler');
|
set_error_handler('_error_handler');
|
||||||
|
set_exception_handler('_exception_handler');
|
||||||
if ( ! is_php('5.3'))
|
register_shutdown_function('_shutdown_handler');
|
||||||
{
|
|
||||||
@set_magic_quotes_runtime(0); // Kill magic quotes
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
@ -85,26 +148,39 @@
|
|||||||
* The subclass prefix allows CI to know if a core class is
|
* The subclass prefix allows CI to know if a core class is
|
||||||
* being extended via a library in the local application
|
* being extended via a library in the local application
|
||||||
* "libraries" folder. Since CI allows config items to be
|
* "libraries" folder. Since CI allows config items to be
|
||||||
* overriden via data set in the main index. php file,
|
* overridden via data set in the main index.php file,
|
||||||
* before proceeding we need to know if a subclass_prefix
|
* before proceeding we need to know if a subclass_prefix
|
||||||
* override exists. If so, we will set this value now,
|
* override exists. If so, we will set this value now,
|
||||||
* before any classes are loaded
|
* before any classes are loaded
|
||||||
* Note: Since the config file data is cached it doesn't
|
* Note: Since the config file data is cached it doesn't
|
||||||
* hurt to load it here.
|
* hurt to load it here.
|
||||||
*/
|
*/
|
||||||
if (isset($assign_to_config['subclass_prefix']) AND $assign_to_config['subclass_prefix'] != '')
|
if ( ! empty($assign_to_config['subclass_prefix']))
|
||||||
{
|
{
|
||||||
get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix']));
|
get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix']));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
* Set a liberal script execution time limit
|
* Should we use a Composer autoloader?
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0)
|
if ($composer_autoload = config_item('composer_autoload'))
|
||||||
{
|
{
|
||||||
@set_time_limit(300);
|
if ($composer_autoload === TRUE)
|
||||||
|
{
|
||||||
|
file_exists(APPPATH.'vendor/autoload.php')
|
||||||
|
? require_once(APPPATH.'vendor/autoload.php')
|
||||||
|
: log_message('error', '$config[\'composer_autoload\'] is set to TRUE but '.APPPATH.'vendor/autoload.php was not found.');
|
||||||
|
}
|
||||||
|
elseif (file_exists($composer_autoload))
|
||||||
|
{
|
||||||
|
require_once($composer_autoload);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log_message('error', 'Could not find the specified $config[\'composer_autoload\'] path: '.$composer_autoload);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -128,33 +204,96 @@
|
|||||||
* Is there a "pre_system" hook?
|
* Is there a "pre_system" hook?
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
$EXT->_call_hook('pre_system');
|
$EXT->call_hook('pre_system');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
* Instantiate the config class
|
* Instantiate the config class
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Note: It is important that Config is loaded first as
|
||||||
|
* most other classes depend on it either directly or by
|
||||||
|
* depending on another class that uses it.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
$CFG =& load_class('Config', 'core');
|
$CFG =& load_class('Config', 'core');
|
||||||
|
|
||||||
// Do we have any manually set config items in the index.php file?
|
// Do we have any manually set config items in the index.php file?
|
||||||
if (isset($assign_to_config))
|
if (isset($assign_to_config) && is_array($assign_to_config))
|
||||||
{
|
{
|
||||||
$CFG->_assign_to_config($assign_to_config);
|
foreach ($assign_to_config as $key => $value)
|
||||||
|
{
|
||||||
|
$CFG->set_item($key, $value);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Important charset-related stuff
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Configure mbstring and/or iconv if they are enabled
|
||||||
|
* and set MB_ENABLED and ICONV_ENABLED constants, so
|
||||||
|
* that we don't repeatedly do extension_loaded() or
|
||||||
|
* function_exists() calls.
|
||||||
|
*
|
||||||
|
* Note: UTF-8 class depends on this. It used to be done
|
||||||
|
* in it's constructor, but it's _not_ class-specific.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
$charset = strtoupper(config_item('charset'));
|
||||||
|
ini_set('default_charset', $charset);
|
||||||
|
|
||||||
|
if (extension_loaded('mbstring'))
|
||||||
|
{
|
||||||
|
define('MB_ENABLED', TRUE);
|
||||||
|
// mbstring.internal_encoding is deprecated starting with PHP 5.6
|
||||||
|
// and it's usage triggers E_DEPRECATED messages.
|
||||||
|
@ini_set('mbstring.internal_encoding', $charset);
|
||||||
|
// This is required for mb_convert_encoding() to strip invalid characters.
|
||||||
|
// That's utilized by CI_Utf8, but it's also done for consistency with iconv.
|
||||||
|
mb_substitute_character('none');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
define('MB_ENABLED', FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// There's an ICONV_IMPL constant, but the PHP manual says that using
|
||||||
|
// iconv's predefined constants is "strongly discouraged".
|
||||||
|
if (extension_loaded('iconv'))
|
||||||
|
{
|
||||||
|
define('ICONV_ENABLED', TRUE);
|
||||||
|
// iconv.internal_encoding is deprecated starting with PHP 5.6
|
||||||
|
// and it's usage triggers E_DEPRECATED messages.
|
||||||
|
@ini_set('iconv.internal_encoding', $charset);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
define('ICONV_ENABLED', FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_php('5.6'))
|
||||||
|
{
|
||||||
|
ini_set('php.internal_encoding', $charset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ------------------------------------------------------
|
||||||
|
* Load compatibility features
|
||||||
|
* ------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once(BASEPATH.'core/compat/mbstring.php');
|
||||||
|
require_once(BASEPATH.'core/compat/hash.php');
|
||||||
|
require_once(BASEPATH.'core/compat/password.php');
|
||||||
|
require_once(BASEPATH.'core/compat/standard.php');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
* Instantiate the UTF-8 class
|
* 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');
|
$UNI =& load_class('Utf8', 'core');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -169,14 +308,7 @@
|
|||||||
* Instantiate the routing class and set the routing
|
* Instantiate the routing class and set the routing
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
$RTR =& load_class('Router', 'core');
|
$RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL);
|
||||||
$RTR->_set_routing();
|
|
||||||
|
|
||||||
// Set any routing overrides that may exist in the main index file
|
|
||||||
if (isset($routing))
|
|
||||||
{
|
|
||||||
$RTR->_set_overrides($routing);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
@ -190,13 +322,10 @@
|
|||||||
* Is there a valid cache file? If so, we're done...
|
* Is there a valid cache file? If so, we're done...
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
if ($EXT->_call_hook('cache_override') === FALSE)
|
if ($EXT->call_hook('cache_override') === FALSE && $OUT->_display_cache($CFG, $URI) === TRUE)
|
||||||
{
|
|
||||||
if ($OUT->_display_cache($CFG, $URI) == TRUE)
|
|
||||||
{
|
{
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* -----------------------------------------------------
|
* -----------------------------------------------------
|
||||||
@ -226,76 +355,157 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
// Load the base controller class
|
// Load the base controller class
|
||||||
require BASEPATH.'core/Controller.php';
|
require_once BASEPATH.'core/Controller.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reference to the CI_Controller method.
|
||||||
|
*
|
||||||
|
* Returns current CI instance object
|
||||||
|
*
|
||||||
|
* @return CI_Controller
|
||||||
|
*/
|
||||||
function &get_instance()
|
function &get_instance()
|
||||||
{
|
{
|
||||||
return CI_Controller::get_instance();
|
return CI_Controller::get_instance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
|
if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
|
||||||
{
|
{
|
||||||
require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
|
require_once 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
|
// Set a mark point for benchmarking
|
||||||
$BM->mark('loading_time:_base_classes_end');
|
$BM->mark('loading_time:_base_classes_end');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
* Security check
|
* Sanity checks
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*
|
*
|
||||||
* None of the functions in the app controller or the
|
* The Router class has already validated the request,
|
||||||
* loader class can be called via the URI, nor can
|
* leaving us with 3 options here:
|
||||||
* controller functions that begin with an underscore
|
*
|
||||||
|
* 1) an empty class name, if we reached the default
|
||||||
|
* controller, but it didn't exist;
|
||||||
|
* 2) a query string which doesn't go through a
|
||||||
|
* file_exists() check
|
||||||
|
* 3) a regular request for a non-existing page
|
||||||
|
*
|
||||||
|
* We handle all of these as a 404 error.
|
||||||
|
*
|
||||||
|
* Furthermore, none of the methods in the app controller
|
||||||
|
* or the loader class can be called via the URI, nor can
|
||||||
|
* controller methods that begin with an underscore.
|
||||||
*/
|
*/
|
||||||
$class = $RTR->fetch_class();
|
|
||||||
$method = $RTR->fetch_method();
|
|
||||||
|
|
||||||
if ( ! class_exists($class)
|
$e404 = FALSE;
|
||||||
OR strncmp($method, '_', 1) == 0
|
$class = ucfirst($RTR->class);
|
||||||
OR in_array(strtolower($method), array_map('strtolower', get_class_methods('CI_Controller')))
|
$method = $RTR->method;
|
||||||
)
|
|
||||||
|
if (empty($class) OR ! file_exists(APPPATH.'controllers/'.$RTR->directory.$class.'.php'))
|
||||||
|
{
|
||||||
|
$e404 = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
require_once(APPPATH.'controllers/'.$RTR->directory.$class.'.php');
|
||||||
|
|
||||||
|
if ( ! class_exists($class, FALSE) OR $method[0] === '_' OR method_exists('CI_Controller', $method))
|
||||||
|
{
|
||||||
|
$e404 = TRUE;
|
||||||
|
}
|
||||||
|
elseif (method_exists($class, '_remap'))
|
||||||
|
{
|
||||||
|
$params = array($method, array_slice($URI->rsegments, 2));
|
||||||
|
$method = '_remap';
|
||||||
|
}
|
||||||
|
elseif ( ! method_exists($class, $method))
|
||||||
|
{
|
||||||
|
$e404 = TRUE;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* DO NOT CHANGE THIS, NOTHING ELSE WORKS!
|
||||||
|
*
|
||||||
|
* - method_exists() returns true for non-public methods, which passes the previous elseif
|
||||||
|
* - is_callable() returns false for PHP 4-style constructors, even if there's a __construct()
|
||||||
|
* - method_exists($class, '__construct') won't work because CI_Controller::__construct() is inherited
|
||||||
|
* - People will only complain if this doesn't work, even though it is documented that it shouldn't.
|
||||||
|
*
|
||||||
|
* ReflectionMethod::isConstructor() is the ONLY reliable check,
|
||||||
|
* knowing which method will be executed as a constructor.
|
||||||
|
*/
|
||||||
|
elseif ( ! is_callable(array($class, $method)))
|
||||||
|
{
|
||||||
|
$reflection = new ReflectionMethod($class, $method);
|
||||||
|
if ( ! $reflection->isPublic() OR $reflection->isConstructor())
|
||||||
|
{
|
||||||
|
$e404 = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($e404)
|
||||||
{
|
{
|
||||||
if ( ! empty($RTR->routes['404_override']))
|
if ( ! empty($RTR->routes['404_override']))
|
||||||
{
|
{
|
||||||
$x = explode('/', $RTR->routes['404_override']);
|
if (sscanf($RTR->routes['404_override'], '%[^/]/%s', $error_class, $error_method) !== 2)
|
||||||
$class = $x[0];
|
|
||||||
$method = (isset($x[1]) ? $x[1] : 'index');
|
|
||||||
if ( ! class_exists($class))
|
|
||||||
{
|
{
|
||||||
if ( ! file_exists(APPPATH.'controllers/'.$class.'.php'))
|
$error_method = 'index';
|
||||||
{
|
|
||||||
show_404("{$class}/{$method}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
include_once(APPPATH.'controllers/'.$class.'.php');
|
$error_class = ucfirst($error_class);
|
||||||
|
|
||||||
|
if ( ! class_exists($error_class, FALSE))
|
||||||
|
{
|
||||||
|
if (file_exists(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php'))
|
||||||
|
{
|
||||||
|
require_once(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php');
|
||||||
|
$e404 = ! class_exists($error_class, FALSE);
|
||||||
|
}
|
||||||
|
// Were we in a directory? If so, check for a global override
|
||||||
|
elseif ( ! empty($RTR->directory) && file_exists(APPPATH.'controllers/'.$error_class.'.php'))
|
||||||
|
{
|
||||||
|
require_once(APPPATH.'controllers/'.$error_class.'.php');
|
||||||
|
if (($e404 = ! class_exists($error_class, FALSE)) === FALSE)
|
||||||
|
{
|
||||||
|
$RTR->directory = '';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
show_404("{$class}/{$method}");
|
$e404 = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Did we reset the $e404 flag? If so, set the rsegments, starting from index 1
|
||||||
|
if ( ! $e404)
|
||||||
|
{
|
||||||
|
$class = $error_class;
|
||||||
|
$method = $error_method;
|
||||||
|
|
||||||
|
$URI->rsegments = array(
|
||||||
|
1 => $class,
|
||||||
|
2 => $method
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
show_404($RTR->directory.$class.'/'.$method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($method !== '_remap')
|
||||||
|
{
|
||||||
|
$params = array_slice($URI->rsegments, 2);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
* Is there a "pre_controller" hook?
|
* Is there a "pre_controller" hook?
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
$EXT->_call_hook('pre_controller');
|
$EXT->call_hook('pre_controller');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
@ -312,53 +522,14 @@
|
|||||||
* Is there a "post_controller_constructor" hook?
|
* Is there a "post_controller_constructor" hook?
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
$EXT->_call_hook('post_controller_constructor');
|
$EXT->call_hook('post_controller_constructor');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
* Call the requested method
|
* Call the requested method
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
// Is there a "remap" function? If so, we call it instead
|
call_user_func_array(array(&$CI, $method), $params);
|
||||||
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
|
// Mark a benchmark end point
|
||||||
$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');
|
$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');
|
||||||
@ -368,14 +539,14 @@
|
|||||||
* Is there a "post_controller" hook?
|
* Is there a "post_controller" hook?
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
$EXT->_call_hook('post_controller');
|
$EXT->call_hook('post_controller');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
* Send the final rendered output to the browser
|
* Send the final rendered output to the browser
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
if ($EXT->_call_hook('display_override') === FALSE)
|
if ($EXT->call_hook('display_override') === FALSE)
|
||||||
{
|
{
|
||||||
$OUT->_display();
|
$OUT->_display();
|
||||||
}
|
}
|
||||||
@ -385,18 +556,4 @@
|
|||||||
* Is there a "post_system" hook?
|
* Is there a "post_system" hook?
|
||||||
* ------------------------------------------------------
|
* ------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
$EXT->_call_hook('post_system');
|
$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 */
|
|
||||||
|
637
system/core/Common.php
Executable file → Normal file
637
system/core/Common.php
Executable file → Normal file
@ -1,19 +1,41 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Common Functions
|
* Common Functions
|
||||||
@ -21,34 +43,30 @@
|
|||||||
* Loads the base classes and executes the request.
|
* Loads the base classes and executes the request.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage codeigniter
|
* @subpackage CodeIgniter
|
||||||
* @category Common Functions
|
* @category Common Functions
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/
|
* @link https://codeigniter.com/user_guide/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('is_php'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Determines if the current version of PHP is greater then the supplied value
|
* Determines if the current version of PHP is equal to or greater than 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
|
* @param string
|
||||||
* @return bool TRUE if the current version is $version or higher
|
* @return bool TRUE if the current version is $version or higher
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('is_php'))
|
function is_php($version)
|
||||||
{
|
|
||||||
function is_php($version = '5.0.0')
|
|
||||||
{
|
{
|
||||||
static $_is_php;
|
static $_is_php;
|
||||||
$version = (string) $version;
|
$version = (string) $version;
|
||||||
|
|
||||||
if ( ! isset($_is_php[$version]))
|
if ( ! isset($_is_php[$version]))
|
||||||
{
|
{
|
||||||
$_is_php[$version] = (version_compare(PHP_VERSION, $version) < 0) ? FALSE : TRUE;
|
$_is_php[$version] = version_compare(PHP_VERSION, $version, '>=');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $_is_php[$version];
|
return $_is_php[$version];
|
||||||
@ -57,6 +75,8 @@ if ( ! function_exists('is_php'))
|
|||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('is_really_writable'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Tests for file writability
|
* Tests for file writability
|
||||||
*
|
*
|
||||||
@ -64,36 +84,35 @@ if ( ! function_exists('is_php'))
|
|||||||
* the file, based on the read-only attribute. is_writable() is also unreliable
|
* the file, based on the read-only attribute. is_writable() is also unreliable
|
||||||
* on Unix servers if safe_mode is on.
|
* on Unix servers if safe_mode is on.
|
||||||
*
|
*
|
||||||
* @access private
|
* @link https://bugs.php.net/bug.php?id=54709
|
||||||
* @return void
|
* @param string
|
||||||
|
* @return bool
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('is_really_writable'))
|
|
||||||
{
|
|
||||||
function is_really_writable($file)
|
function is_really_writable($file)
|
||||||
{
|
{
|
||||||
// If we're on a Unix server with safe_mode off we call is_writable
|
// If we're on a Unix server with safe_mode off we call is_writable
|
||||||
if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
|
if (DIRECTORY_SEPARATOR === '/' && (is_php('5.4') OR ! ini_get('safe_mode')))
|
||||||
{
|
{
|
||||||
return is_writable($file);
|
return is_writable($file);
|
||||||
}
|
}
|
||||||
|
|
||||||
// For windows servers and safe_mode "on" installations we'll actually
|
/* For Windows servers and safe_mode "on" installations we'll actually
|
||||||
// write a file then read it. Bah...
|
* write a file then read it. Bah...
|
||||||
|
*/
|
||||||
if (is_dir($file))
|
if (is_dir($file))
|
||||||
{
|
{
|
||||||
$file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));
|
$file = rtrim($file, '/').'/'.md5(mt_rand());
|
||||||
|
if (($fp = @fopen($file, 'ab')) === FALSE)
|
||||||
if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
|
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose($fp);
|
fclose($fp);
|
||||||
@chmod($file, DIR_WRITE_MODE);
|
@chmod($file, 0777);
|
||||||
@unlink($file);
|
@unlink($file);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
|
elseif ( ! is_file($file) OR ($fp = @fopen($file, 'ab')) === FALSE)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -105,6 +124,8 @@ if ( ! function_exists('is_really_writable'))
|
|||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('load_class'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Class registry
|
* Class registry
|
||||||
*
|
*
|
||||||
@ -112,15 +133,12 @@ if ( ! function_exists('is_really_writable'))
|
|||||||
* exist it is instantiated and set to a static variable. If it has
|
* exist it is instantiated and set to a static variable. If it has
|
||||||
* previously been instantiated the variable is returned.
|
* previously been instantiated the variable is returned.
|
||||||
*
|
*
|
||||||
* @access public
|
|
||||||
* @param string the class name being requested
|
* @param string the class name being requested
|
||||||
* @param string the directory where the class should be found
|
* @param string the directory where the class should be found
|
||||||
* @param string the class name prefix
|
* @param mixed an optional argument to pass to the class constructor
|
||||||
* @return object
|
* @return object
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('load_class'))
|
function &load_class($class, $directory = 'libraries', $param = NULL)
|
||||||
{
|
|
||||||
function &load_class($class, $directory = 'libraries', $prefix = 'CI_')
|
|
||||||
{
|
{
|
||||||
static $_classes = array();
|
static $_classes = array();
|
||||||
|
|
||||||
@ -138,11 +156,11 @@ if ( ! function_exists('load_class'))
|
|||||||
{
|
{
|
||||||
if (file_exists($path.$directory.'/'.$class.'.php'))
|
if (file_exists($path.$directory.'/'.$class.'.php'))
|
||||||
{
|
{
|
||||||
$name = $prefix.$class;
|
$name = 'CI_'.$class;
|
||||||
|
|
||||||
if (class_exists($name) === FALSE)
|
if (class_exists($name, FALSE) === FALSE)
|
||||||
{
|
{
|
||||||
require($path.$directory.'/'.$class.'.php');
|
require_once($path.$directory.'/'.$class.'.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -154,44 +172,48 @@ if ( ! function_exists('load_class'))
|
|||||||
{
|
{
|
||||||
$name = config_item('subclass_prefix').$class;
|
$name = config_item('subclass_prefix').$class;
|
||||||
|
|
||||||
if (class_exists($name) === FALSE)
|
if (class_exists($name, FALSE) === FALSE)
|
||||||
{
|
{
|
||||||
require(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php');
|
require_once(APPPATH.$directory.'/'.$name.'.php');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Did we find the class?
|
// Did we find the class?
|
||||||
if ($name === FALSE)
|
if ($name === FALSE)
|
||||||
{
|
{
|
||||||
// Note: We use exit() rather then show_error() in order to avoid a
|
// Note: We use exit() rather than show_error() in order to avoid a
|
||||||
// self-referencing loop with the Excptions class
|
// self-referencing loop with the Exceptions class
|
||||||
exit('Unable to locate the specified class: '.$class.'.php');
|
set_status_header(503);
|
||||||
|
echo 'Unable to locate the specified class: '.$class.'.php';
|
||||||
|
exit(5); // EXIT_UNK_CLASS
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep track of what we just loaded
|
// Keep track of what we just loaded
|
||||||
is_loaded($class);
|
is_loaded($class);
|
||||||
|
|
||||||
$_classes[$class] = new $name();
|
$_classes[$class] = isset($param)
|
||||||
|
? new $name($param)
|
||||||
|
: new $name();
|
||||||
return $_classes[$class];
|
return $_classes[$class];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('is_loaded'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Keeps track of which libraries have been loaded. This function is
|
* Keeps track of which libraries have been loaded. This function is
|
||||||
* called by the load_class() function above
|
* called by the load_class() function above
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('is_loaded'))
|
|
||||||
{
|
|
||||||
function &is_loaded($class = '')
|
function &is_loaded($class = '')
|
||||||
{
|
{
|
||||||
static $_is_loaded = array();
|
static $_is_loaded = array();
|
||||||
|
|
||||||
if ($class != '')
|
if ($class !== '')
|
||||||
{
|
{
|
||||||
$_is_loaded[strtolower($class)] = $class;
|
$_is_loaded[strtolower($class)] = $class;
|
||||||
}
|
}
|
||||||
@ -202,117 +224,205 @@ if ( ! function_exists('is_loaded'))
|
|||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('get_config'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Loads the main config.php file
|
* Loads the main config.php file
|
||||||
*
|
*
|
||||||
* This function lets us grab the config file even if the Config class
|
* This function lets us grab the config file even if the Config class
|
||||||
* hasn't been instantiated yet
|
* hasn't been instantiated yet
|
||||||
*
|
*
|
||||||
* @access private
|
* @param array
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('get_config'))
|
function &get_config(Array $replace = array())
|
||||||
{
|
{
|
||||||
function get_config($replace = array())
|
static $config;
|
||||||
{
|
|
||||||
static $_config;
|
|
||||||
|
|
||||||
if (isset($_config))
|
if (empty($config))
|
||||||
{
|
{
|
||||||
return $_config[0];
|
$file_path = APPPATH.'config/config.php';
|
||||||
|
$found = FALSE;
|
||||||
|
if (file_exists($file_path))
|
||||||
|
{
|
||||||
|
$found = TRUE;
|
||||||
|
require($file_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is the config file in the environment folder?
|
// Is the config file in the environment folder?
|
||||||
if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php'))
|
if (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);
|
require($file_path);
|
||||||
|
}
|
||||||
|
elseif ( ! $found)
|
||||||
|
{
|
||||||
|
set_status_header(503);
|
||||||
|
echo 'The configuration file does not exist.';
|
||||||
|
exit(3); // EXIT_CONFIG
|
||||||
|
}
|
||||||
|
|
||||||
// Does the $config array exist in the file?
|
// Does the $config array exist in the file?
|
||||||
if ( ! isset($config) OR ! is_array($config))
|
if ( ! isset($config) OR ! is_array($config))
|
||||||
{
|
{
|
||||||
exit('Your config file does not appear to be formatted correctly.');
|
set_status_header(503);
|
||||||
|
echo 'Your config file does not appear to be formatted correctly.';
|
||||||
|
exit(3); // EXIT_CONFIG
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Are any values being dynamically replaced?
|
// Are any values being dynamically added or replaced?
|
||||||
if (count($replace) > 0)
|
|
||||||
{
|
|
||||||
foreach ($replace as $key => $val)
|
foreach ($replace as $key => $val)
|
||||||
{
|
|
||||||
if (isset($config[$key]))
|
|
||||||
{
|
{
|
||||||
$config[$key] = $val;
|
$config[$key] = $val;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $_config[0] =& $config;
|
return $config;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('config_item'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Returns the specified config item
|
* Returns the specified config item
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('config_item'))
|
|
||||||
{
|
|
||||||
function config_item($item)
|
function config_item($item)
|
||||||
{
|
{
|
||||||
static $_config_item = array();
|
static $_config;
|
||||||
|
|
||||||
if ( ! isset($_config_item[$item]))
|
if (empty($_config))
|
||||||
{
|
{
|
||||||
$config = get_config();
|
// references cannot be directly assigned to static variables, so we use an array
|
||||||
|
$_config[0] =& get_config();
|
||||||
if ( ! isset($config[$item]))
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
$_config_item[$item] = $config[$item];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $_config_item[$item];
|
return isset($_config[0][$item]) ? $_config[0][$item] : NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('get_mimes'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns the MIME types array from config/mimes.php
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function &get_mimes()
|
||||||
|
{
|
||||||
|
static $_mimes;
|
||||||
|
|
||||||
|
if (empty($_mimes))
|
||||||
|
{
|
||||||
|
$_mimes = file_exists(APPPATH.'config/mimes.php')
|
||||||
|
? include(APPPATH.'config/mimes.php')
|
||||||
|
: array();
|
||||||
|
|
||||||
|
if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'))
|
||||||
|
{
|
||||||
|
$_mimes = array_merge($_mimes, include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $_mimes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('is_https'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Is HTTPS?
|
||||||
|
*
|
||||||
|
* Determines if the application is accessed via an encrypted
|
||||||
|
* (HTTPS) connection.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function is_https()
|
||||||
|
{
|
||||||
|
if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('is_cli'))
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is CLI?
|
||||||
|
*
|
||||||
|
* Test to see if a request was made from the command line.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function is_cli()
|
||||||
|
{
|
||||||
|
return (PHP_SAPI === 'cli' OR defined('STDIN'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('show_error'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Error Handler
|
* Error Handler
|
||||||
*
|
*
|
||||||
* This function lets us invoke the exception class and
|
* This function lets us invoke the exception class and
|
||||||
* display errors using the standard error template located
|
* display errors using the standard error template located
|
||||||
* in application/errors/errors.php
|
* in application/views/errors/error_general.php
|
||||||
* This function will send the error page directly to the
|
* This function will send the error page directly to the
|
||||||
* browser and exit.
|
* browser and exit.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string
|
||||||
|
* @param int
|
||||||
|
* @param string
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('show_error'))
|
|
||||||
{
|
|
||||||
function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered')
|
function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered')
|
||||||
{
|
{
|
||||||
|
$status_code = abs($status_code);
|
||||||
|
if ($status_code < 100)
|
||||||
|
{
|
||||||
|
$exit_status = $status_code + 9; // 9 is EXIT__AUTO_MIN
|
||||||
|
$status_code = 500;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$exit_status = 1; // EXIT_ERROR
|
||||||
|
}
|
||||||
|
|
||||||
$_error =& load_class('Exceptions', 'core');
|
$_error =& load_class('Exceptions', 'core');
|
||||||
echo $_error->show_error($heading, $message, 'error_general', $status_code);
|
echo $_error->show_error($heading, $message, 'error_general', $status_code);
|
||||||
exit;
|
exit($exit_status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('show_404'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* 404 Page Handler
|
* 404 Page Handler
|
||||||
*
|
*
|
||||||
@ -320,61 +430,76 @@ if ( ! function_exists('show_error'))
|
|||||||
* However, instead of the standard error template it displays
|
* However, instead of the standard error template it displays
|
||||||
* 404 errors.
|
* 404 errors.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string
|
||||||
|
* @param bool
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('show_404'))
|
|
||||||
{
|
|
||||||
function show_404($page = '', $log_error = TRUE)
|
function show_404($page = '', $log_error = TRUE)
|
||||||
{
|
{
|
||||||
$_error =& load_class('Exceptions', 'core');
|
$_error =& load_class('Exceptions', 'core');
|
||||||
$_error->show_404($page, $log_error);
|
$_error->show_404($page, $log_error);
|
||||||
exit;
|
exit(4); // EXIT_UNKNOWN_FILE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('log_message'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Error Logging Interface
|
* Error Logging Interface
|
||||||
*
|
*
|
||||||
* We use this as a simple mechanism to access the logging
|
* We use this as a simple mechanism to access the logging
|
||||||
* class and send messages to be logged.
|
* class and send messages to be logged.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string the error level: 'error', 'debug' or 'info'
|
||||||
|
* @param string the error message
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('log_message'))
|
function log_message($level, $message)
|
||||||
{
|
|
||||||
function log_message($level = 'error', $message, $php_error = FALSE)
|
|
||||||
{
|
{
|
||||||
static $_log;
|
static $_log;
|
||||||
|
|
||||||
if (config_item('log_threshold') == 0)
|
if ($_log === NULL)
|
||||||
{
|
{
|
||||||
return;
|
// references cannot be directly assigned to static variables, so we use an array
|
||||||
|
$_log[0] =& load_class('Log', 'core');
|
||||||
}
|
}
|
||||||
|
|
||||||
$_log =& load_class('Log');
|
$_log[0]->write_log($level, $message);
|
||||||
$_log->write_log($level, $message, $php_error);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('set_status_header'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Set HTTP Status Header
|
* Set HTTP Status Header
|
||||||
*
|
*
|
||||||
* @access public
|
|
||||||
* @param int the status code
|
* @param int the status code
|
||||||
* @param string
|
* @param string
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('set_status_header'))
|
|
||||||
{
|
|
||||||
function set_status_header($code = 200, $text = '')
|
function set_status_header($code = 200, $text = '')
|
||||||
{
|
{
|
||||||
|
if (is_cli())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($code) OR ! is_numeric($code))
|
||||||
|
{
|
||||||
|
show_error('Status codes must be numeric', 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($text))
|
||||||
|
{
|
||||||
|
is_int($code) OR $code = (int) $code;
|
||||||
$stati = array(
|
$stati = array(
|
||||||
|
100 => 'Continue',
|
||||||
|
101 => 'Switching Protocols',
|
||||||
|
|
||||||
200 => 'OK',
|
200 => 'OK',
|
||||||
201 => 'Created',
|
201 => 'Created',
|
||||||
202 => 'Accepted',
|
202 => 'Accepted',
|
||||||
@ -386,12 +511,14 @@ if ( ! function_exists('set_status_header'))
|
|||||||
300 => 'Multiple Choices',
|
300 => 'Multiple Choices',
|
||||||
301 => 'Moved Permanently',
|
301 => 'Moved Permanently',
|
||||||
302 => 'Found',
|
302 => 'Found',
|
||||||
|
303 => 'See Other',
|
||||||
304 => 'Not Modified',
|
304 => 'Not Modified',
|
||||||
305 => 'Use Proxy',
|
305 => 'Use Proxy',
|
||||||
307 => 'Temporary Redirect',
|
307 => 'Temporary Redirect',
|
||||||
|
|
||||||
400 => 'Bad Request',
|
400 => 'Bad Request',
|
||||||
401 => 'Unauthorized',
|
401 => 'Unauthorized',
|
||||||
|
402 => 'Payment Required',
|
||||||
403 => 'Forbidden',
|
403 => 'Forbidden',
|
||||||
404 => 'Not Found',
|
404 => 'Not Found',
|
||||||
405 => 'Method Not Allowed',
|
405 => 'Method Not Allowed',
|
||||||
@ -407,121 +534,188 @@ if ( ! function_exists('set_status_header'))
|
|||||||
415 => 'Unsupported Media Type',
|
415 => 'Unsupported Media Type',
|
||||||
416 => 'Requested Range Not Satisfiable',
|
416 => 'Requested Range Not Satisfiable',
|
||||||
417 => 'Expectation Failed',
|
417 => 'Expectation Failed',
|
||||||
|
422 => 'Unprocessable Entity',
|
||||||
|
426 => 'Upgrade Required',
|
||||||
|
428 => 'Precondition Required',
|
||||||
|
429 => 'Too Many Requests',
|
||||||
|
431 => 'Request Header Fields Too Large',
|
||||||
|
|
||||||
500 => 'Internal Server Error',
|
500 => 'Internal Server Error',
|
||||||
501 => 'Not Implemented',
|
501 => 'Not Implemented',
|
||||||
502 => 'Bad Gateway',
|
502 => 'Bad Gateway',
|
||||||
503 => 'Service Unavailable',
|
503 => 'Service Unavailable',
|
||||||
504 => 'Gateway Timeout',
|
504 => 'Gateway Timeout',
|
||||||
505 => 'HTTP Version Not Supported'
|
505 => 'HTTP Version Not Supported',
|
||||||
|
511 => 'Network Authentication Required',
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($code == '' OR ! is_numeric($code))
|
if (isset($stati[$code]))
|
||||||
{
|
|
||||||
show_error('Status codes must be numeric', 500);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($stati[$code]) AND $text == '')
|
|
||||||
{
|
{
|
||||||
$text = $stati[$code];
|
$text = $stati[$code];
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if ($text == '')
|
|
||||||
{
|
{
|
||||||
show_error('No status text available. Please check your status code number or supply your own message text.', 500);
|
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 (strpos(PHP_SAPI, 'cgi') === 0)
|
||||||
|
{
|
||||||
|
header('Status: '.$code.' '.$text, TRUE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (substr(php_sapi_name(), 0, 3) == 'cgi')
|
$server_protocol = (isset($_SERVER['SERVER_PROTOCOL']) && in_array($_SERVER['SERVER_PROTOCOL'], array('HTTP/1.0', 'HTTP/1.1', 'HTTP/2'), TRUE))
|
||||||
{
|
? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
|
||||||
header("Status: {$code} {$text}", TRUE);
|
header($server_protocol.' '.$code.' '.$text, TRUE, $code);
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('_error_handler'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Exception Handler
|
* Error Handler
|
||||||
*
|
*
|
||||||
* This is the custom exception handler that is declaired at the top
|
* This is the custom error handler that is declared at the (relative)
|
||||||
* of Codeigniter.php. The main reason we use this is to permit
|
* 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
|
* PHP errors to be logged in our own log files since the user may
|
||||||
* not have access to server logs. Since this function
|
* not have access to server logs. Since this function effectively
|
||||||
* effectively intercepts PHP errors, however, we also need
|
* intercepts PHP errors, however, we also need to display errors
|
||||||
* to display errors based on the current error_reporting level.
|
* based on the current error_reporting level.
|
||||||
* We do that with the use of a PHP error template.
|
* We do that with the use of a PHP error template.
|
||||||
*
|
*
|
||||||
* @access private
|
* @param int $severity
|
||||||
|
* @param string $message
|
||||||
|
* @param string $filepath
|
||||||
|
* @param int $line
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('_exception_handler'))
|
function _error_handler($severity, $message, $filepath, $line)
|
||||||
{
|
{
|
||||||
function _exception_handler($severity, $message, $filepath, $line)
|
$is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity);
|
||||||
|
|
||||||
|
// When an error occurred, set the status header to '500 Internal Server Error'
|
||||||
|
// to indicate to the client something went wrong.
|
||||||
|
// This can't be done within the $_error->show_php_error method because
|
||||||
|
// it is only called when the display_errors flag is set (which isn't usually
|
||||||
|
// the case in a production environment) or when errors are ignored because
|
||||||
|
// they are above the error_reporting threshold.
|
||||||
|
if ($is_error)
|
||||||
{
|
{
|
||||||
// We don't bother with "strict" notices since they tend to fill up
|
set_status_header(500);
|
||||||
// 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.)
|
// Should we ignore the error? We'll get the current error_reporting
|
||||||
// you'll get notices telling you that these have been deprecated.
|
// level and add its bits with the severity bits to find out.
|
||||||
if ($severity == E_STRICT)
|
if (($severity & error_reporting()) !== $severity)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$_error =& load_class('Exceptions', 'core');
|
$_error =& load_class('Exceptions', 'core');
|
||||||
|
$_error->log_exception($severity, $message, $filepath, $line);
|
||||||
|
|
||||||
// Should we display the error? We'll get the current error_reporting
|
// Should we display the error?
|
||||||
// level and add its bits with the severity bits to find out.
|
if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors')))
|
||||||
if (($severity & error_reporting()) == $severity)
|
|
||||||
{
|
{
|
||||||
$_error->show_php_error($severity, $message, $filepath, $line);
|
$_error->show_php_error($severity, $message, $filepath, $line);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Should we log the error? No? We're done...
|
// If the error is fatal, the execution of the script should be stopped because
|
||||||
if (config_item('log_threshold') == 0)
|
// errors can't be recovered from. Halting the script conforms with PHP's
|
||||||
|
// default error handling. See http://www.php.net/manual/en/errorfunc.constants.php
|
||||||
|
if ($is_error)
|
||||||
{
|
{
|
||||||
return;
|
exit(1); // EXIT_ERROR
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$_error->log_exception($severity, $message, $filepath, $line);
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('_exception_handler'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Exception Handler
|
||||||
|
*
|
||||||
|
* Sends uncaught exceptions to the logger and displays them
|
||||||
|
* only if display_errors is On so that they don't show up in
|
||||||
|
* production environments.
|
||||||
|
*
|
||||||
|
* @param Exception $exception
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _exception_handler($exception)
|
||||||
|
{
|
||||||
|
$_error =& load_class('Exceptions', 'core');
|
||||||
|
$_error->log_exception('error', 'Exception: '.$exception->getMessage(), $exception->getFile(), $exception->getLine());
|
||||||
|
|
||||||
|
is_cli() OR set_status_header(500);
|
||||||
|
// Should we display the error?
|
||||||
|
if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors')))
|
||||||
|
{
|
||||||
|
$_error->show_exception($exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(1); // EXIT_ERROR
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('_shutdown_handler'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Shutdown Handler
|
||||||
|
*
|
||||||
|
* This is the shutdown handler that is declared at the top
|
||||||
|
* of CodeIgniter.php. The main reason we use this is to simulate
|
||||||
|
* a complete custom exception handler.
|
||||||
|
*
|
||||||
|
* E_STRICT is purposively neglected because such events may have
|
||||||
|
* been caught. Duplication or none? None is preferred for now.
|
||||||
|
*
|
||||||
|
* @link http://insomanic.me.uk/post/229851073/php-trick-catching-fatal-errors-e-error-with-a
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function _shutdown_handler()
|
||||||
|
{
|
||||||
|
$last_error = error_get_last();
|
||||||
|
if (isset($last_error) &&
|
||||||
|
($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING)))
|
||||||
|
{
|
||||||
|
_error_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('remove_invisible_characters'))
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Remove Invisible Characters
|
* Remove Invisible Characters
|
||||||
*
|
*
|
||||||
* This prevents sandwiching null characters
|
* This prevents sandwiching null characters
|
||||||
* between ascii characters, like Java\0script.
|
* between ascii characters, like Java\0script.
|
||||||
*
|
*
|
||||||
* @access public
|
|
||||||
* @param string
|
* @param string
|
||||||
|
* @param bool
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
if ( ! function_exists('remove_invisible_characters'))
|
|
||||||
{
|
|
||||||
function remove_invisible_characters($str, $url_encoded = TRUE)
|
function remove_invisible_characters($str, $url_encoded = TRUE)
|
||||||
{
|
{
|
||||||
$non_displayables = array();
|
$non_displayables = array();
|
||||||
|
|
||||||
// every control character except newline (dec 10)
|
// every control character except newline (dec 10),
|
||||||
// carriage return (dec 13), and horizontal tab (dec 09)
|
// carriage return (dec 13) and horizontal tab (dec 09)
|
||||||
|
|
||||||
if ($url_encoded)
|
if ($url_encoded)
|
||||||
{
|
{
|
||||||
$non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15
|
$non_displayables[] = '/%0[0-8bcef]/i'; // url encoded 00-08, 11, 12, 14, 15
|
||||||
$non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31
|
$non_displayables[] = '/%1[0-9a-f]/i'; // url encoded 16-31
|
||||||
|
$non_displayables[] = '/%7f/i'; // url encoded 127
|
||||||
}
|
}
|
||||||
|
|
||||||
$non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127
|
$non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127
|
||||||
@ -538,27 +732,118 @@ if ( ! function_exists('remove_invisible_characters'))
|
|||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns HTML escaped variable
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param mixed
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
if ( ! function_exists('html_escape'))
|
if ( ! function_exists('html_escape'))
|
||||||
{
|
{
|
||||||
function html_escape($var)
|
/**
|
||||||
|
* Returns HTML escaped variable.
|
||||||
|
*
|
||||||
|
* @param mixed $var The input string or array of strings to be escaped.
|
||||||
|
* @param bool $double_encode $double_encode set to FALSE prevents escaping twice.
|
||||||
|
* @return mixed The escaped string or array of strings as a result.
|
||||||
|
*/
|
||||||
|
function html_escape($var, $double_encode = TRUE)
|
||||||
{
|
{
|
||||||
|
if (empty($var))
|
||||||
|
{
|
||||||
|
return $var;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_array($var))
|
if (is_array($var))
|
||||||
{
|
{
|
||||||
return array_map('html_escape', $var);
|
foreach (array_keys($var) as $key)
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
return htmlspecialchars($var, ENT_QUOTES, config_item('charset'));
|
$var[$key] = html_escape($var[$key], $double_encode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $var;
|
||||||
|
}
|
||||||
|
|
||||||
|
return htmlspecialchars($var, ENT_QUOTES, config_item('charset'), $double_encode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file Common.php */
|
// ------------------------------------------------------------------------
|
||||||
/* Location: ./system/core/Common.php */
|
|
||||||
|
if ( ! function_exists('_stringify_attributes'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Stringify attributes for use in HTML tags.
|
||||||
|
*
|
||||||
|
* Helper function used to convert a string, array, or object
|
||||||
|
* of attributes to a string.
|
||||||
|
*
|
||||||
|
* @param mixed string, array, object
|
||||||
|
* @param bool
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function _stringify_attributes($attributes, $js = FALSE)
|
||||||
|
{
|
||||||
|
$atts = NULL;
|
||||||
|
|
||||||
|
if (empty($attributes))
|
||||||
|
{
|
||||||
|
return $atts;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_string($attributes))
|
||||||
|
{
|
||||||
|
return ' '.$attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
$attributes = (array) $attributes;
|
||||||
|
|
||||||
|
foreach ($attributes as $key => $val)
|
||||||
|
{
|
||||||
|
$atts .= ($js) ? $key.'='.$val.',' : ' '.$key.'="'.$val.'"';
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtrim($atts, ',');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('function_usable'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Function usable
|
||||||
|
*
|
||||||
|
* Executes a function_exists() check, and if the Suhosin PHP
|
||||||
|
* extension is loaded - checks whether the function that is
|
||||||
|
* checked might be disabled in there as well.
|
||||||
|
*
|
||||||
|
* This is useful as function_exists() will return FALSE for
|
||||||
|
* functions disabled via the *disable_functions* php.ini
|
||||||
|
* setting, but not for *suhosin.executor.func.blacklist* and
|
||||||
|
* *suhosin.executor.disable_eval*. These settings will just
|
||||||
|
* terminate script execution if a disabled function is executed.
|
||||||
|
*
|
||||||
|
* The above described behavior turned out to be a bug in Suhosin,
|
||||||
|
* but even though a fix was committed for 0.9.34 on 2012-02-12,
|
||||||
|
* that version is yet to be released. This function will therefore
|
||||||
|
* be just temporary, but would probably be kept for a few years.
|
||||||
|
*
|
||||||
|
* @link http://www.hardened-php.net/suhosin/
|
||||||
|
* @param string $function_name Function to check for
|
||||||
|
* @return bool TRUE if the function exists and is safe to call,
|
||||||
|
* FALSE otherwise.
|
||||||
|
*/
|
||||||
|
function function_usable($function_name)
|
||||||
|
{
|
||||||
|
static $_suhosin_func_blacklist;
|
||||||
|
|
||||||
|
if (function_exists($function_name))
|
||||||
|
{
|
||||||
|
if ( ! isset($_suhosin_func_blacklist))
|
||||||
|
{
|
||||||
|
$_suhosin_func_blacklist = extension_loaded('suhosin')
|
||||||
|
? explode(',', trim(ini_get('suhosin.executor.func.blacklist')))
|
||||||
|
: array();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ! in_array($function_name, $_suhosin_func_blacklist, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
360
system/core/Config.php
Executable file → Normal file
360
system/core/Config.php
Executable file → Normal file
@ -1,30 +1,52 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CodeIgniter Config Class
|
* Config Class
|
||||||
*
|
*
|
||||||
* This class contains functions that enable config files to be managed
|
* This class contains functions that enable config files to be managed
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage Libraries
|
* @subpackage Libraries
|
||||||
* @category Libraries
|
* @category Libraries
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/libraries/config.html
|
* @link https://codeigniter.com/user_guide/libraries/config.html
|
||||||
*/
|
*/
|
||||||
class CI_Config {
|
class CI_Config {
|
||||||
|
|
||||||
@ -33,46 +55,53 @@ class CI_Config {
|
|||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
var $config = array();
|
public $config = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of all loaded config files
|
* List of all loaded config files
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
var $is_loaded = array();
|
public $is_loaded = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of paths to search when trying to load a config file
|
* List of paths to search when trying to load a config file.
|
||||||
*
|
*
|
||||||
|
* @used-by CI_Loader
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
var $_config_paths = array(APPPATH);
|
public $_config_paths = array(APPPATH);
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Class constructor
|
||||||
*
|
*
|
||||||
* Sets the $config data from the primary config.php file as a class variable
|
* Sets the $config data from the primary config.php file as a class variable.
|
||||||
*
|
*
|
||||||
* @access public
|
* @return void
|
||||||
* @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()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->config = get_config();
|
$this->config =& get_config();
|
||||||
log_message('debug', "Config Class Initialized");
|
|
||||||
|
|
||||||
// Set the base_url automatically if none was provided
|
// Set the base_url automatically if none was provided
|
||||||
if ($this->config['base_url'] == '')
|
if (empty($this->config['base_url']))
|
||||||
{
|
{
|
||||||
if (isset($_SERVER['HTTP_HOST']))
|
if (isset($_SERVER['SERVER_ADDR']))
|
||||||
{
|
{
|
||||||
$base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
|
if (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE)
|
||||||
$base_url .= '://'. $_SERVER['HTTP_HOST'];
|
{
|
||||||
$base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
|
$server_addr = '['.$_SERVER['SERVER_ADDR'].']';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$server_addr = $_SERVER['SERVER_ADDR'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$base_url = (is_https() ? 'https' : 'http').'://'.$server_addr
|
||||||
|
.substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME'])));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$base_url = 'http://localhost/';
|
$base_url = 'http://localhost/';
|
||||||
@ -80,6 +109,8 @@ class CI_Config {
|
|||||||
|
|
||||||
$this->set_item('base_url', $base_url);
|
$this->set_item('base_url', $base_url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_message('info', 'Config Class Initialized');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -87,42 +118,27 @@ class CI_Config {
|
|||||||
/**
|
/**
|
||||||
* Load Config File
|
* Load Config File
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $file Configuration file name
|
||||||
* @param string the config file name
|
* @param bool $use_sections Whether configuration values should be loaded into their own section
|
||||||
* @param boolean if configuration values should be loaded into their own section
|
* @param bool $fail_gracefully Whether to just return FALSE or display an error message
|
||||||
* @param boolean true if errors should just return false, false if an error message should be displayed
|
* @return bool TRUE if the file was loaded correctly or FALSE on failure
|
||||||
* @return boolean if the file was loaded correctly
|
|
||||||
*/
|
*/
|
||||||
function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
|
public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
|
||||||
{
|
{
|
||||||
$file = ($file == '') ? 'config' : str_replace('.php', '', $file);
|
$file = ($file === '') ? 'config' : str_replace('.php', '', $file);
|
||||||
$found = FALSE;
|
|
||||||
$loaded = FALSE;
|
$loaded = FALSE;
|
||||||
|
|
||||||
$check_locations = defined('ENVIRONMENT')
|
|
||||||
? array(ENVIRONMENT.'/'.$file, $file)
|
|
||||||
: array($file);
|
|
||||||
|
|
||||||
foreach ($this->_config_paths as $path)
|
foreach ($this->_config_paths as $path)
|
||||||
{
|
{
|
||||||
foreach ($check_locations as $location)
|
foreach (array($file, ENVIRONMENT.DIRECTORY_SEPARATOR.$file) as $location)
|
||||||
{
|
{
|
||||||
$file_path = $path.'config/'.$location.'.php';
|
$file_path = $path.'config/'.$location.'.php';
|
||||||
|
|
||||||
if (in_array($file_path, $this->is_loaded, TRUE))
|
if (in_array($file_path, $this->is_loaded, TRUE))
|
||||||
{
|
{
|
||||||
$loaded = TRUE;
|
return TRUE;
|
||||||
continue 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_exists($file_path))
|
if ( ! file_exists($file_path))
|
||||||
{
|
|
||||||
$found = TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($found === FALSE)
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -135,19 +151,15 @@ class CI_Config {
|
|||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.');
|
show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($use_sections === TRUE)
|
if ($use_sections === TRUE)
|
||||||
{
|
{
|
||||||
if (isset($this->config[$file]))
|
$this->config[$file] = isset($this->config[$file])
|
||||||
{
|
? array_merge($this->config[$file], $config)
|
||||||
$this->config[$file] = array_merge($this->config[$file], $config);
|
: $config;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$this->config[$file] = $config;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -155,23 +167,22 @@ class CI_Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->is_loaded[] = $file_path;
|
$this->is_loaded[] = $file_path;
|
||||||
unset($config);
|
$config = NULL;
|
||||||
|
|
||||||
$loaded = TRUE;
|
$loaded = TRUE;
|
||||||
log_message('debug', 'Config file loaded: '.$file_path);
|
log_message('debug', 'Config file loaded: '.$file_path);
|
||||||
break;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($loaded === FALSE)
|
if ($loaded === TRUE)
|
||||||
{
|
{
|
||||||
if ($fail_gracefully === TRUE)
|
return TRUE;
|
||||||
|
}
|
||||||
|
elseif ($fail_gracefully === TRUE)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
show_error('The configuration file '.$file.'.php does not exist.');
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
show_error('The configuration file '.$file.'.php does not exist.');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -179,59 +190,35 @@ class CI_Config {
|
|||||||
/**
|
/**
|
||||||
* Fetch a config file item
|
* Fetch a config file item
|
||||||
*
|
*
|
||||||
*
|
* @param string $item Config item name
|
||||||
* @access public
|
* @param string $index Index name
|
||||||
* @param string the config item name
|
* @return string|null The configuration item or NULL if the item doesn't exist
|
||||||
* @param string the index name
|
|
||||||
* @param bool
|
|
||||||
* @return string
|
|
||||||
*/
|
*/
|
||||||
function item($item, $index = '')
|
public function item($item, $index = '')
|
||||||
{
|
{
|
||||||
if ($index == '')
|
if ($index == '')
|
||||||
{
|
{
|
||||||
if ( ! isset($this->config[$item]))
|
return isset($this->config[$item]) ? $this->config[$item] : NULL;
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$pref = $this->config[$item];
|
return isset($this->config[$index], $this->config[$index][$item]) ? $this->config[$index][$item] : NULL;
|
||||||
}
|
|
||||||
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)
|
* Fetch a config file item with slash appended (if not empty)
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $item Config item name
|
||||||
* @param string the config item name
|
* @return string|null The configuration item or NULL if the item doesn't exist
|
||||||
* @param bool
|
|
||||||
* @return string
|
|
||||||
*/
|
*/
|
||||||
function slash_item($item)
|
public function slash_item($item)
|
||||||
{
|
{
|
||||||
if ( ! isset($this->config[$item]))
|
if ( ! isset($this->config[$item]))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return NULL;
|
||||||
}
|
}
|
||||||
if( trim($this->config[$item]) == '')
|
elseif (trim($this->config[$item]) === '')
|
||||||
{
|
{
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
@ -243,79 +230,121 @@ class CI_Config {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Site URL
|
* Site URL
|
||||||
|
*
|
||||||
* Returns base_url . index_page [. uri_string]
|
* Returns base_url . index_page [. uri_string]
|
||||||
*
|
*
|
||||||
* @access public
|
* @uses CI_Config::_uri_string()
|
||||||
* @param string the URI string
|
*
|
||||||
|
* @param string|string[] $uri URI string or an array of segments
|
||||||
|
* @param string $protocol
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function site_url($uri = '')
|
public function site_url($uri = '', $protocol = NULL)
|
||||||
{
|
{
|
||||||
if ($uri == '')
|
$base_url = $this->slash_item('base_url');
|
||||||
{
|
|
||||||
return $this->slash_item('base_url').$this->item('index_page');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->item('enable_query_strings') == FALSE)
|
if (isset($protocol))
|
||||||
{
|
{
|
||||||
$suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix');
|
// For protocol-relative links
|
||||||
return $this->slash_item('base_url').$this->slash_item('index_page').$this->_uri_string($uri).$suffix;
|
if ($protocol === '')
|
||||||
|
{
|
||||||
|
$base_url = substr($base_url, strpos($base_url, '//'));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return $this->slash_item('base_url').$this->item('index_page').'?'.$this->_uri_string($uri);
|
$base_url = $protocol.substr($base_url, strpos($base_url, '://'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (empty($uri))
|
||||||
|
{
|
||||||
|
return $base_url.$this->item('index_page');
|
||||||
|
}
|
||||||
|
|
||||||
|
$uri = $this->_uri_string($uri);
|
||||||
|
|
||||||
|
if ($this->item('enable_query_strings') === FALSE)
|
||||||
|
{
|
||||||
|
$suffix = isset($this->config['url_suffix']) ? $this->config['url_suffix'] : '';
|
||||||
|
|
||||||
|
if ($suffix !== '')
|
||||||
|
{
|
||||||
|
if (($offset = strpos($uri, '?')) !== FALSE)
|
||||||
|
{
|
||||||
|
$uri = substr($uri, 0, $offset).$suffix.substr($uri, $offset);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$uri .= $suffix;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $base_url.$this->slash_item('index_page').$uri;
|
||||||
|
}
|
||||||
|
elseif (strpos($uri, '?') === FALSE)
|
||||||
|
{
|
||||||
|
$uri = '?'.$uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $base_url.$this->item('index_page').$uri;
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base URL
|
* Base URL
|
||||||
|
*
|
||||||
* Returns base_url [. uri_string]
|
* Returns base_url [. uri_string]
|
||||||
*
|
*
|
||||||
* @access public
|
* @uses CI_Config::_uri_string()
|
||||||
* @param string $uri
|
*
|
||||||
|
* @param string|string[] $uri URI string or an array of segments
|
||||||
|
* @param string $protocol
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function base_url($uri = '')
|
public function base_url($uri = '', $protocol = NULL)
|
||||||
{
|
{
|
||||||
return $this->slash_item('base_url').ltrim($this->_uri_string($uri), '/');
|
$base_url = $this->slash_item('base_url');
|
||||||
|
|
||||||
|
if (isset($protocol))
|
||||||
|
{
|
||||||
|
// For protocol-relative links
|
||||||
|
if ($protocol === '')
|
||||||
|
{
|
||||||
|
$base_url = substr($base_url, strpos($base_url, '//'));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$base_url = $protocol.substr($base_url, strpos($base_url, '://'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $base_url.$this->_uri_string($uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build URI string for use in Config::site_url() and Config::base_url()
|
* Build URI string
|
||||||
*
|
*
|
||||||
* @access protected
|
* @used-by CI_Config::site_url()
|
||||||
* @param $uri
|
* @used-by CI_Config::base_url()
|
||||||
|
*
|
||||||
|
* @param string|string[] $uri URI string or an array of segments
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected function _uri_string($uri)
|
protected function _uri_string($uri)
|
||||||
{
|
{
|
||||||
if ($this->item('enable_query_strings') == FALSE)
|
if ($this->item('enable_query_strings') === FALSE)
|
||||||
{
|
{
|
||||||
if (is_array($uri))
|
is_array($uri) && $uri = implode('/', $uri);
|
||||||
|
return ltrim($uri, '/');
|
||||||
|
}
|
||||||
|
elseif (is_array($uri))
|
||||||
{
|
{
|
||||||
$uri = implode('/', $uri);
|
return http_build_query($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;
|
return $uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,12 +353,12 @@ class CI_Config {
|
|||||||
/**
|
/**
|
||||||
* System URL
|
* System URL
|
||||||
*
|
*
|
||||||
* @access public
|
* @deprecated 3.0.0 Encourages insecure practices
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function system_url()
|
public function system_url()
|
||||||
{
|
{
|
||||||
$x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH));
|
$x = explode('/', preg_replace('|/*(.+?)/*$|', '\\1', BASEPATH));
|
||||||
return $this->slash_item('base_url').end($x).'/';
|
return $this->slash_item('base_url').end($x).'/';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,42 +367,13 @@ class CI_Config {
|
|||||||
/**
|
/**
|
||||||
* Set a config file item
|
* Set a config file item
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $item Config item key
|
||||||
* @param string the config item key
|
* @param string $value Config item value
|
||||||
* @param string the config item value
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function set_item($item, $value)
|
public function set_item($item, $value)
|
||||||
{
|
{
|
||||||
$this->config[$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 */
|
|
||||||
|
72
system/core/Controller.php
Executable file → Normal file
72
system/core/Controller.php
Executable file → Normal file
@ -1,22 +1,44 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CodeIgniter Application Controller Class
|
* Application Controller Class
|
||||||
*
|
*
|
||||||
* This class object is the super class that every library in
|
* This class object is the super class that every library in
|
||||||
* CodeIgniter will be assigned to.
|
* CodeIgniter will be assigned to.
|
||||||
@ -24,15 +46,22 @@
|
|||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage Libraries
|
* @subpackage Libraries
|
||||||
* @category Libraries
|
* @category Libraries
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/general/controllers.html
|
* @link https://codeigniter.com/user_guide/general/controllers.html
|
||||||
*/
|
*/
|
||||||
class CI_Controller {
|
class CI_Controller {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reference to the CI singleton
|
||||||
|
*
|
||||||
|
* @var object
|
||||||
|
*/
|
||||||
private static $instance;
|
private static $instance;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Class constructor
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@ -47,18 +76,21 @@ class CI_Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->load =& load_class('Loader', 'core');
|
$this->load =& load_class('Loader', 'core');
|
||||||
|
|
||||||
$this->load->initialize();
|
$this->load->initialize();
|
||||||
|
log_message('info', 'Controller Class Initialized');
|
||||||
log_message('debug', "Controller Class Initialized");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the CI singleton
|
||||||
|
*
|
||||||
|
* @static
|
||||||
|
* @return object
|
||||||
|
*/
|
||||||
public static function &get_instance()
|
public static function &get_instance()
|
||||||
{
|
{
|
||||||
return self::$instance;
|
return self::$instance;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// END Controller class
|
|
||||||
|
|
||||||
/* End of file Controller.php */
|
}
|
||||||
/* Location: ./system/core/Controller.php */
|
|
||||||
|
227
system/core/Exceptions.php
Executable file → Normal file
227
system/core/Exceptions.php
Executable file → Normal file
@ -1,19 +1,41 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exceptions Class
|
* Exceptions Class
|
||||||
@ -21,31 +43,24 @@
|
|||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage Libraries
|
* @subpackage Libraries
|
||||||
* @category Exceptions
|
* @category Exceptions
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/libraries/exceptions.html
|
* @link https://codeigniter.com/user_guide/libraries/exceptions.html
|
||||||
*/
|
*/
|
||||||
class CI_Exceptions {
|
class CI_Exceptions {
|
||||||
var $action;
|
|
||||||
var $severity;
|
|
||||||
var $message;
|
|
||||||
var $filename;
|
|
||||||
var $line;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Nesting level of the output buffering mechanism
|
* Nesting level of the output buffering mechanism
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
* @access public
|
|
||||||
*/
|
*/
|
||||||
var $ob_level;
|
public $ob_level;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List if available error levels
|
* List of available error levels
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
* @access public
|
|
||||||
*/
|
*/
|
||||||
var $levels = array(
|
public $levels = array(
|
||||||
E_ERROR => 'Error',
|
E_ERROR => 'Error',
|
||||||
E_WARNING => 'Warning',
|
E_WARNING => 'Warning',
|
||||||
E_PARSE => 'Parsing Error',
|
E_PARSE => 'Parsing Error',
|
||||||
@ -60,9 +75,10 @@ class CI_Exceptions {
|
|||||||
E_STRICT => 'Runtime Notice'
|
E_STRICT => 'Runtime Notice'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Class constructor
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@ -75,45 +91,52 @@ class CI_Exceptions {
|
|||||||
/**
|
/**
|
||||||
* Exception Logger
|
* Exception Logger
|
||||||
*
|
*
|
||||||
* This function logs PHP generated error messages
|
* Logs PHP generated error messages
|
||||||
*
|
*
|
||||||
* @access private
|
* @param int $severity Log level
|
||||||
* @param string the error severity
|
* @param string $message Error message
|
||||||
* @param string the error string
|
* @param string $filepath File path
|
||||||
* @param string the error filepath
|
* @param int $line Line number
|
||||||
* @param string the error line number
|
* @return void
|
||||||
* @return string
|
|
||||||
*/
|
*/
|
||||||
function log_exception($severity, $message, $filepath, $line)
|
public function log_exception($severity, $message, $filepath, $line)
|
||||||
{
|
{
|
||||||
$severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];
|
$severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity;
|
||||||
|
log_message('error', 'Severity: '.$severity.' --> '.$message.' '.$filepath.' '.$line);
|
||||||
log_message('error', 'Severity: '.$severity.' --> '.$message. ' '.$filepath.' '.$line, TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 404 Page Not Found Handler
|
* 404 Error Handler
|
||||||
*
|
*
|
||||||
* @access private
|
* @uses CI_Exceptions::show_error()
|
||||||
* @param string the page
|
*
|
||||||
* @param bool log error yes/no
|
* @param string $page Page URI
|
||||||
* @return string
|
* @param bool $log_error Whether to log the error
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
function show_404($page = '', $log_error = TRUE)
|
public function show_404($page = '', $log_error = TRUE)
|
||||||
{
|
{
|
||||||
$heading = "404 Page Not Found";
|
if (is_cli())
|
||||||
$message = "The page you requested was not found.";
|
{
|
||||||
|
$heading = 'Not Found';
|
||||||
|
$message = 'The controller/method pair you requested was not found.';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$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
|
// By default we log this, but allow a dev to skip it
|
||||||
if ($log_error)
|
if ($log_error)
|
||||||
{
|
{
|
||||||
log_message('error', '404 Page Not Found --> '.$page);
|
log_message('error', $heading.': '.$page);
|
||||||
}
|
}
|
||||||
|
|
||||||
echo $this->show_error($heading, $message, 'error_404', 404);
|
echo $this->show_error($heading, $message, 'error_404', 404);
|
||||||
exit;
|
exit(4); // EXIT_UNKNOWN_FILE
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -121,29 +144,42 @@ class CI_Exceptions {
|
|||||||
/**
|
/**
|
||||||
* General Error Page
|
* General Error Page
|
||||||
*
|
*
|
||||||
* This function takes an error message as input
|
* Takes an error message as input (either as a string or an array)
|
||||||
* (either as a string or an array) and displays
|
* and displays it using the specified template.
|
||||||
* it using the specified template.
|
|
||||||
*
|
*
|
||||||
* @access private
|
* @param string $heading Page heading
|
||||||
* @param string the heading
|
* @param string|string[] $message Error message
|
||||||
* @param string the message
|
* @param string $template Template name
|
||||||
* @param string the template name
|
* @param int $status_code (default: 500)
|
||||||
* @param int the status code
|
*
|
||||||
* @return string
|
* @return string Error page output
|
||||||
*/
|
*/
|
||||||
function show_error($heading, $message, $template = 'error_general', $status_code = 500)
|
public function show_error($heading, $message, $template = 'error_general', $status_code = 500)
|
||||||
|
{
|
||||||
|
$templates_path = config_item('error_views_path');
|
||||||
|
if (empty($templates_path))
|
||||||
|
{
|
||||||
|
$templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_cli())
|
||||||
|
{
|
||||||
|
$message = "\t".(is_array($message) ? implode("\n\t", $message) : $message);
|
||||||
|
$template = 'cli'.DIRECTORY_SEPARATOR.$template;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
set_status_header($status_code);
|
set_status_header($status_code);
|
||||||
|
$message = '<p>'.(is_array($message) ? implode('</p><p>', $message) : $message).'</p>';
|
||||||
$message = '<p>'.implode('</p><p>', ( ! is_array($message)) ? array($message) : $message).'</p>';
|
$template = 'html'.DIRECTORY_SEPARATOR.$template;
|
||||||
|
}
|
||||||
|
|
||||||
if (ob_get_level() > $this->ob_level + 1)
|
if (ob_get_level() > $this->ob_level + 1)
|
||||||
{
|
{
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
}
|
}
|
||||||
ob_start();
|
ob_start();
|
||||||
include(APPPATH.'errors/'.$template.'.php');
|
include($templates_path.$template.'.php');
|
||||||
$buffer = ob_get_contents();
|
$buffer = ob_get_contents();
|
||||||
ob_end_clean();
|
ob_end_clean();
|
||||||
return $buffer;
|
return $buffer;
|
||||||
@ -151,43 +187,88 @@ class CI_Exceptions {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
public function show_exception($exception)
|
||||||
|
{
|
||||||
|
$templates_path = config_item('error_views_path');
|
||||||
|
if (empty($templates_path))
|
||||||
|
{
|
||||||
|
$templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
$message = $exception->getMessage();
|
||||||
|
if (empty($message))
|
||||||
|
{
|
||||||
|
$message = '(null)';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_cli())
|
||||||
|
{
|
||||||
|
$templates_path .= 'cli'.DIRECTORY_SEPARATOR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$templates_path .= 'html'.DIRECTORY_SEPARATOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ob_get_level() > $this->ob_level + 1)
|
||||||
|
{
|
||||||
|
ob_end_flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
include($templates_path.'error_exception.php');
|
||||||
|
$buffer = ob_get_contents();
|
||||||
|
ob_end_clean();
|
||||||
|
echo $buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Native PHP error handler
|
* Native PHP error handler
|
||||||
*
|
*
|
||||||
* @access private
|
* @param int $severity Error level
|
||||||
* @param string the error severity
|
* @param string $message Error message
|
||||||
* @param string the error string
|
* @param string $filepath File path
|
||||||
* @param string the error filepath
|
* @param int $line Line number
|
||||||
* @param string the error line number
|
* @return void
|
||||||
* @return string
|
|
||||||
*/
|
*/
|
||||||
function show_php_error($severity, $message, $filepath, $line)
|
public function show_php_error($severity, $message, $filepath, $line)
|
||||||
{
|
{
|
||||||
$severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];
|
$templates_path = config_item('error_views_path');
|
||||||
|
if (empty($templates_path))
|
||||||
|
{
|
||||||
|
$templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR;
|
||||||
|
}
|
||||||
|
|
||||||
$filepath = str_replace("\\", "/", $filepath);
|
$severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity;
|
||||||
|
|
||||||
// For safety reasons we do not show the full file path
|
// For safety reasons we don't show the full file path in non-CLI requests
|
||||||
|
if ( ! is_cli())
|
||||||
|
{
|
||||||
|
$filepath = str_replace('\\', '/', $filepath);
|
||||||
if (FALSE !== strpos($filepath, '/'))
|
if (FALSE !== strpos($filepath, '/'))
|
||||||
{
|
{
|
||||||
$x = explode('/', $filepath);
|
$x = explode('/', $filepath);
|
||||||
$filepath = $x[count($x)-2].'/'.end($x);
|
$filepath = $x[count($x)-2].'/'.end($x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$template = 'html'.DIRECTORY_SEPARATOR.'error_php';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$template = 'cli'.DIRECTORY_SEPARATOR.'error_php';
|
||||||
|
}
|
||||||
|
|
||||||
if (ob_get_level() > $this->ob_level + 1)
|
if (ob_get_level() > $this->ob_level + 1)
|
||||||
{
|
{
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
}
|
}
|
||||||
ob_start();
|
ob_start();
|
||||||
include(APPPATH.'errors/error_php.php');
|
include($templates_path.$template.'.php');
|
||||||
$buffer = ob_get_contents();
|
$buffer = ob_get_contents();
|
||||||
ob_end_clean();
|
ob_end_clean();
|
||||||
echo $buffer;
|
echo $buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
// END Exceptions Class
|
|
||||||
|
|
||||||
/* End of file Exceptions.php */
|
|
||||||
/* Location: ./system/core/Exceptions.php */
|
|
216
system/core/Hooks.php
Executable file → Normal file
216
system/core/Hooks.php
Executable file → Normal file
@ -1,95 +1,114 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CodeIgniter Hooks Class
|
* Hooks Class
|
||||||
*
|
*
|
||||||
* Provides a mechanism to extend the base system without hacking.
|
* Provides a mechanism to extend the base system without hacking.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage Libraries
|
* @subpackage Libraries
|
||||||
* @category Libraries
|
* @category Libraries
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/libraries/encryption.html
|
* @link https://codeigniter.com/user_guide/general/hooks.html
|
||||||
*/
|
*/
|
||||||
class CI_Hooks {
|
class CI_Hooks {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines wether hooks are enabled
|
* Determines whether hooks are enabled
|
||||||
*
|
*
|
||||||
* @var bool
|
* @var bool
|
||||||
*/
|
*/
|
||||||
var $enabled = FALSE;
|
public $enabled = FALSE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of all hooks set in config/hooks.php
|
* List of all hooks set in config/hooks.php
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
var $hooks = array();
|
public $hooks = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines wether hook is in progress, used to prevent infinte loops
|
* Array with class objects to use hooks methods
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $_objects = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In progress flag
|
||||||
|
*
|
||||||
|
* Determines whether hook is in progress, used to prevent infinte loops
|
||||||
*
|
*
|
||||||
* @var bool
|
* @var bool
|
||||||
*/
|
*/
|
||||||
var $in_progress = FALSE;
|
protected $_in_progress = FALSE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Class constructor
|
||||||
*
|
*
|
||||||
*/
|
|
||||||
function __construct()
|
|
||||||
{
|
|
||||||
$this->_initialize();
|
|
||||||
log_message('debug', "Hooks Class Initialized");
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the Hooks Preferences
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function _initialize()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$CFG =& load_class('Config', 'core');
|
$CFG =& load_class('Config', 'core');
|
||||||
|
log_message('info', 'Hooks Class Initialized');
|
||||||
|
|
||||||
// If hooks are not enabled in the config file
|
// If hooks are not enabled in the config file
|
||||||
// there is nothing else to do
|
// there is nothing else to do
|
||||||
|
if ($CFG->item('enable_hooks') === FALSE)
|
||||||
if ($CFG->item('enable_hooks') == FALSE)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Grab the "hooks" definition file.
|
// Grab the "hooks" definition file.
|
||||||
// If there are no hooks, we're done.
|
if (file_exists(APPPATH.'config/hooks.php'))
|
||||||
|
|
||||||
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');
|
include(APPPATH.'config/hooks.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'))
|
||||||
|
{
|
||||||
|
include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there are no hooks, we're done.
|
||||||
if ( ! isset($hook) OR ! is_array($hook))
|
if ( ! isset($hook) OR ! is_array($hook))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@ -104,20 +123,21 @@ class CI_Hooks {
|
|||||||
/**
|
/**
|
||||||
* Call Hook
|
* Call Hook
|
||||||
*
|
*
|
||||||
* Calls a particular hook
|
* Calls a particular hook. Called by CodeIgniter.php.
|
||||||
*
|
*
|
||||||
* @access private
|
* @uses CI_Hooks::_run_hook()
|
||||||
* @param string the hook name
|
*
|
||||||
* @return mixed
|
* @param string $which Hook name
|
||||||
|
* @return bool TRUE on success or FALSE on failure
|
||||||
*/
|
*/
|
||||||
function _call_hook($which = '')
|
public function call_hook($which = '')
|
||||||
{
|
{
|
||||||
if ( ! $this->enabled OR ! isset($this->hooks[$which]))
|
if ( ! $this->enabled OR ! isset($this->hooks[$which]))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($this->hooks[$which][0]) AND is_array($this->hooks[$which][0]))
|
if (is_array($this->hooks[$which]) && ! isset($this->hooks[$which]['function']))
|
||||||
{
|
{
|
||||||
foreach ($this->hooks[$which] as $val)
|
foreach ($this->hooks[$which] as $val)
|
||||||
{
|
{
|
||||||
@ -139,13 +159,21 @@ class CI_Hooks {
|
|||||||
*
|
*
|
||||||
* Runs a particular hook
|
* Runs a particular hook
|
||||||
*
|
*
|
||||||
* @access private
|
* @param array $data Hook details
|
||||||
* @param array the hook details
|
* @return bool TRUE on success or FALSE on failure
|
||||||
* @return bool
|
|
||||||
*/
|
*/
|
||||||
function _run_hook($data)
|
protected function _run_hook($data)
|
||||||
{
|
{
|
||||||
if ( ! is_array($data))
|
// Closures/lambda functions and array($object, 'method') callables
|
||||||
|
if (is_callable($data))
|
||||||
|
{
|
||||||
|
is_array($data)
|
||||||
|
? $data[0]->{$data[1]}()
|
||||||
|
: $data();
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
elseif ( ! is_array($data))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -156,8 +184,7 @@ class CI_Hooks {
|
|||||||
|
|
||||||
// If the script being called happens to have the same
|
// If the script being called happens to have the same
|
||||||
// hook call within it a loop can happen
|
// hook call within it a loop can happen
|
||||||
|
if ($this->_in_progress === TRUE)
|
||||||
if ($this->in_progress == TRUE)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -166,7 +193,7 @@ class CI_Hooks {
|
|||||||
// Set file path
|
// Set file path
|
||||||
// -----------------------------------
|
// -----------------------------------
|
||||||
|
|
||||||
if ( ! isset($data['filepath']) OR ! isset($data['filename']))
|
if ( ! isset($data['filepath'], $data['filename']))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -178,71 +205,62 @@ class CI_Hooks {
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------
|
// Determine and class and/or function names
|
||||||
// Set class/function name
|
$class = empty($data['class']) ? FALSE : $data['class'];
|
||||||
// -----------------------------------
|
$function = empty($data['function']) ? FALSE : $data['function'];
|
||||||
|
$params = isset($data['params']) ? $data['params'] : '';
|
||||||
|
|
||||||
$class = FALSE;
|
if (empty($function))
|
||||||
$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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------
|
// Set the _in_progress flag
|
||||||
// Set the in_progress flag
|
$this->_in_progress = TRUE;
|
||||||
// -----------------------------------
|
|
||||||
|
|
||||||
$this->in_progress = TRUE;
|
|
||||||
|
|
||||||
// -----------------------------------
|
|
||||||
// Call the requested class and/or function
|
// Call the requested class and/or function
|
||||||
// -----------------------------------
|
|
||||||
|
|
||||||
if ($class !== FALSE)
|
if ($class !== FALSE)
|
||||||
{
|
{
|
||||||
if ( ! class_exists($class))
|
// The object is stored?
|
||||||
|
if (isset($this->_objects[$class]))
|
||||||
{
|
{
|
||||||
require($filepath);
|
if (method_exists($this->_objects[$class], $function))
|
||||||
}
|
{
|
||||||
|
$this->_objects[$class]->$function($params);
|
||||||
$HOOK = new $class;
|
|
||||||
$HOOK->$function($params);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
return $this->_in_progress = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
class_exists($class, FALSE) OR require_once($filepath);
|
||||||
|
|
||||||
|
if ( ! class_exists($class, FALSE) OR ! method_exists($class, $function))
|
||||||
|
{
|
||||||
|
return $this->_in_progress = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the object and execute the method
|
||||||
|
$this->_objects[$class] = new $class();
|
||||||
|
$this->_objects[$class]->$function($params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
function_exists($function) OR require_once($filepath);
|
||||||
|
|
||||||
if ( ! function_exists($function))
|
if ( ! function_exists($function))
|
||||||
{
|
{
|
||||||
require($filepath);
|
return $this->_in_progress = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
$function($params);
|
$function($params);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->in_progress = FALSE;
|
$this->_in_progress = FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// END CI_Hooks class
|
|
||||||
|
|
||||||
/* End of file Hooks.php */
|
|
||||||
/* Location: ./system/core/Hooks.php */
|
|
918
system/core/Input.php
Executable file → Normal file
918
system/core/Input.php
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
159
system/core/Lang.php
Executable file → Normal file
159
system/core/Lang.php
Executable file → Normal file
@ -1,19 +1,41 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Language Class
|
* Language Class
|
||||||
@ -21,8 +43,8 @@
|
|||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage Libraries
|
* @subpackage Libraries
|
||||||
* @category Language
|
* @category Language
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/libraries/language.html
|
* @link https://codeigniter.com/user_guide/libraries/language.html
|
||||||
*/
|
*/
|
||||||
class CI_Lang {
|
class CI_Lang {
|
||||||
|
|
||||||
@ -31,22 +53,23 @@ class CI_Lang {
|
|||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
var $language = array();
|
public $language = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of loaded language files
|
* List of loaded language files
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
var $is_loaded = array();
|
public $is_loaded = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Class constructor
|
||||||
*
|
*
|
||||||
* @access public
|
* @return void
|
||||||
*/
|
*/
|
||||||
function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
log_message('debug', "Language Class Initialized");
|
log_message('info', 'Language Class Initialized');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -54,98 +77,122 @@ class CI_Lang {
|
|||||||
/**
|
/**
|
||||||
* Load a language file
|
* Load a language file
|
||||||
*
|
*
|
||||||
* @access public
|
* @param mixed $langfile Language file name
|
||||||
* @param mixed the name of the language file to be loaded. Can be an array
|
* @param string $idiom Language name (english, etc.)
|
||||||
* @param string the language (english, etc.)
|
* @param bool $return Whether to return the loaded array of translations
|
||||||
* @param bool return loaded array of translations
|
* @param bool $add_suffix Whether to add suffix to $langfile
|
||||||
* @param bool add suffix to $langfile
|
* @param string $alt_path Alternative path to look for the language file
|
||||||
* @param string alternative path to look for language file
|
*
|
||||||
* @return mixed
|
* @return void|string[] Array containing translations, if $return is set to TRUE
|
||||||
*/
|
*/
|
||||||
function load($langfile = '', $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '')
|
public function load($langfile, $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '')
|
||||||
{
|
{
|
||||||
|
if (is_array($langfile))
|
||||||
|
{
|
||||||
|
foreach ($langfile as $value)
|
||||||
|
{
|
||||||
|
$this->load($value, $idiom, $return, $add_suffix, $alt_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$langfile = str_replace('.php', '', $langfile);
|
$langfile = str_replace('.php', '', $langfile);
|
||||||
|
|
||||||
if ($add_suffix == TRUE)
|
if ($add_suffix === TRUE)
|
||||||
{
|
{
|
||||||
$langfile = str_replace('_lang.', '', $langfile).'_lang';
|
$langfile = preg_replace('/_lang$/', '', $langfile).'_lang';
|
||||||
}
|
}
|
||||||
|
|
||||||
$langfile .= '.php';
|
$langfile .= '.php';
|
||||||
|
|
||||||
if (in_array($langfile, $this->is_loaded, TRUE))
|
if (empty($idiom) OR ! preg_match('/^[a-z_-]+$/i', $idiom))
|
||||||
|
{
|
||||||
|
$config =& get_config();
|
||||||
|
$idiom = empty($config['language']) ? 'english' : $config['language'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($return === FALSE && isset($this->is_loaded[$langfile]) && $this->is_loaded[$langfile] === $idiom)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$config = get_config();
|
// Load the base file, so any others found can override it
|
||||||
|
$basepath = BASEPATH.'language/'.$idiom.'/'.$langfile;
|
||||||
if ($idiom == '')
|
if (($found = file_exists($basepath)) === TRUE)
|
||||||
{
|
{
|
||||||
$deft_lang = ( ! isset($config['language'])) ? 'english' : $config['language'];
|
include($basepath);
|
||||||
$idiom = ($deft_lang == '') ? 'english' : $deft_lang;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine where the language file is and load it
|
// Do we have an alternative path to look in?
|
||||||
if ($alt_path != '' && file_exists($alt_path.'language/'.$idiom.'/'.$langfile))
|
if ($alt_path !== '')
|
||||||
{
|
{
|
||||||
include($alt_path.'language/'.$idiom.'/'.$langfile);
|
$alt_path .= 'language/'.$idiom.'/'.$langfile;
|
||||||
|
if (file_exists($alt_path))
|
||||||
|
{
|
||||||
|
include($alt_path);
|
||||||
|
$found = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$found = FALSE;
|
|
||||||
|
|
||||||
foreach (get_instance()->load->get_package_paths(TRUE) as $package_path)
|
foreach (get_instance()->load->get_package_paths(TRUE) as $package_path)
|
||||||
{
|
{
|
||||||
if (file_exists($package_path.'language/'.$idiom.'/'.$langfile))
|
$package_path .= 'language/'.$idiom.'/'.$langfile;
|
||||||
|
if ($basepath !== $package_path && file_exists($package_path))
|
||||||
{
|
{
|
||||||
include($package_path.'language/'.$idiom.'/'.$langfile);
|
include($package_path);
|
||||||
$found = TRUE;
|
$found = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($found !== TRUE)
|
if ($found !== TRUE)
|
||||||
{
|
{
|
||||||
show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile);
|
show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
if ( ! isset($lang) OR ! is_array($lang))
|
||||||
if ( ! isset($lang))
|
|
||||||
{
|
{
|
||||||
log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);
|
log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);
|
||||||
|
|
||||||
|
if ($return === TRUE)
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($return == TRUE)
|
if ($return === TRUE)
|
||||||
{
|
{
|
||||||
return $lang;
|
return $lang;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->is_loaded[] = $langfile;
|
$this->is_loaded[$langfile] = $idiom;
|
||||||
$this->language = array_merge($this->language, $lang);
|
$this->language = array_merge($this->language, $lang);
|
||||||
unset($lang);
|
|
||||||
|
|
||||||
log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile);
|
log_message('info', 'Language file loaded: language/'.$idiom.'/'.$langfile);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch a single line of text from the language array
|
* Language line
|
||||||
*
|
*
|
||||||
* @access public
|
* Fetches a single line of text from the language array
|
||||||
* @param string $line the language line
|
*
|
||||||
* @return string
|
* @param string $line Language line key
|
||||||
|
* @param bool $log_errors Whether to log an error message if the line is not found
|
||||||
|
* @return string Translation
|
||||||
*/
|
*/
|
||||||
function line($line = '')
|
public function line($line, $log_errors = TRUE)
|
||||||
{
|
{
|
||||||
$value = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line];
|
$value = isset($this->language[$line]) ? $this->language[$line] : FALSE;
|
||||||
|
|
||||||
// Because killer robots like unicorns!
|
// Because killer robots like unicorns!
|
||||||
if ($value === FALSE)
|
if ($value === FALSE && $log_errors === TRUE)
|
||||||
{
|
{
|
||||||
log_message('error', 'Could not find the language line "'.$line.'"');
|
log_message('error', 'Could not find the language line "'.$line.'"');
|
||||||
}
|
}
|
||||||
@ -154,7 +201,3 @@ class CI_Lang {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// END Language Class
|
|
||||||
|
|
||||||
/* End of file Lang.php */
|
|
||||||
/* Location: ./system/core/Lang.php */
|
|
||||||
|
1163
system/core/Loader.php
Executable file → Normal file
1163
system/core/Loader.php
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
296
system/core/Log.php
Normal file
296
system/core/Log.php
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author EllisLab Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logging Class
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Libraries
|
||||||
|
* @category Logging
|
||||||
|
* @author EllisLab Dev Team
|
||||||
|
* @link https://codeigniter.com/user_guide/general/errors.html
|
||||||
|
*/
|
||||||
|
class CI_Log {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path to save log files
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $_log_path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* File permissions
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
protected $_file_permissions = 0644;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Level of logging
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
protected $_threshold = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of threshold levels to log
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $_threshold_array = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format of timestamp for log files
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $_date_fmt = 'Y-m-d H:i:s';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filename extension
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $_file_ext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not the logger can write to the log files
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected $_enabled = TRUE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Predefined logging levels
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $_levels = array('ERROR' => 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mbstring.func_overload flag
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected static $func_overload;
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class constructor
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$config =& get_config();
|
||||||
|
|
||||||
|
isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload'));
|
||||||
|
|
||||||
|
$this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/';
|
||||||
|
$this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '')
|
||||||
|
? ltrim($config['log_file_extension'], '.') : 'php';
|
||||||
|
|
||||||
|
file_exists($this->_log_path) OR mkdir($this->_log_path, 0755, TRUE);
|
||||||
|
|
||||||
|
if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path))
|
||||||
|
{
|
||||||
|
$this->_enabled = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_numeric($config['log_threshold']))
|
||||||
|
{
|
||||||
|
$this->_threshold = (int) $config['log_threshold'];
|
||||||
|
}
|
||||||
|
elseif (is_array($config['log_threshold']))
|
||||||
|
{
|
||||||
|
$this->_threshold = 0;
|
||||||
|
$this->_threshold_array = array_flip($config['log_threshold']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! empty($config['log_date_format']))
|
||||||
|
{
|
||||||
|
$this->_date_fmt = $config['log_date_format'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! empty($config['log_file_permissions']) && is_int($config['log_file_permissions']))
|
||||||
|
{
|
||||||
|
$this->_file_permissions = $config['log_file_permissions'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write Log File
|
||||||
|
*
|
||||||
|
* Generally this function will be called using the global log_message() function
|
||||||
|
*
|
||||||
|
* @param string $level The error level: 'error', 'debug' or 'info'
|
||||||
|
* @param string $msg The error message
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function write_log($level, $msg)
|
||||||
|
{
|
||||||
|
if ($this->_enabled === FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$level = strtoupper($level);
|
||||||
|
|
||||||
|
if (( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))
|
||||||
|
&& ! isset($this->_threshold_array[$this->_levels[$level]]))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$filepath = $this->_log_path.'log-'.date('Y-m-d').'.'.$this->_file_ext;
|
||||||
|
$message = '';
|
||||||
|
|
||||||
|
if ( ! file_exists($filepath))
|
||||||
|
{
|
||||||
|
$newfile = TRUE;
|
||||||
|
// Only add protection to php files
|
||||||
|
if ($this->_file_ext === 'php')
|
||||||
|
{
|
||||||
|
$message .= "<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>\n\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $fp = @fopen($filepath, 'ab'))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
flock($fp, LOCK_EX);
|
||||||
|
|
||||||
|
// Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format
|
||||||
|
if (strpos($this->_date_fmt, 'u') !== FALSE)
|
||||||
|
{
|
||||||
|
$microtime_full = microtime(TRUE);
|
||||||
|
$microtime_short = sprintf("%06d", ($microtime_full - floor($microtime_full)) * 1000000);
|
||||||
|
$date = new DateTime(date('Y-m-d H:i:s.'.$microtime_short, $microtime_full));
|
||||||
|
$date = $date->format($this->_date_fmt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$date = date($this->_date_fmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
$message .= $this->_format_line($level, $date, $msg);
|
||||||
|
|
||||||
|
for ($written = 0, $length = self::strlen($message); $written < $length; $written += $result)
|
||||||
|
{
|
||||||
|
if (($result = fwrite($fp, self::substr($message, $written))) === FALSE)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flock($fp, LOCK_UN);
|
||||||
|
fclose($fp);
|
||||||
|
|
||||||
|
if (isset($newfile) && $newfile === TRUE)
|
||||||
|
{
|
||||||
|
chmod($filepath, $this->_file_permissions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return is_int($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format the log line.
|
||||||
|
*
|
||||||
|
* This is for extensibility of log formatting
|
||||||
|
* If you want to change the log format, extend the CI_Log class and override this method
|
||||||
|
*
|
||||||
|
* @param string $level The error level
|
||||||
|
* @param string $date Formatted date string
|
||||||
|
* @param string $message The log message
|
||||||
|
* @return string Formatted log line with a new line character '\n' at the end
|
||||||
|
*/
|
||||||
|
protected function _format_line($level, $date, $message)
|
||||||
|
{
|
||||||
|
return $level.' - '.$date.' --> '.$message."\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Byte-safe strlen()
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static function strlen($str)
|
||||||
|
{
|
||||||
|
return (self::$func_overload)
|
||||||
|
? mb_strlen($str, '8bit')
|
||||||
|
: strlen($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Byte-safe substr()
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @param int $start
|
||||||
|
* @param int $length
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function substr($str, $start, $length = NULL)
|
||||||
|
{
|
||||||
|
if (self::$func_overload)
|
||||||
|
{
|
||||||
|
// mb_substr($str, $start, null, '8bit') returns an empty
|
||||||
|
// string on PHP 5.3
|
||||||
|
isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start);
|
||||||
|
return mb_substr($str, $start, $length, '8bit');
|
||||||
|
}
|
||||||
|
|
||||||
|
return isset($length)
|
||||||
|
? substr($str, $start, $length)
|
||||||
|
: substr($str, $start);
|
||||||
|
}
|
||||||
|
}
|
75
system/core/Model.php
Executable file → Normal file
75
system/core/Model.php
Executable file → Normal file
@ -1,57 +1,76 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CodeIgniter Model Class
|
* Model Class
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage Libraries
|
* @subpackage Libraries
|
||||||
* @category Libraries
|
* @category Libraries
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/libraries/config.html
|
* @link https://codeigniter.com/user_guide/libraries/config.html
|
||||||
*/
|
*/
|
||||||
class CI_Model {
|
class CI_Model {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Class constructor
|
||||||
*
|
*
|
||||||
* @access public
|
* @link https://github.com/bcit-ci/CodeIgniter/issues/5332
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
function __construct()
|
public function __construct() {}
|
||||||
{
|
|
||||||
log_message('debug', "Model Class Initialized");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __get
|
* __get magic
|
||||||
*
|
*
|
||||||
* Allows models to access CI's loaded classes using the same
|
* Allows models to access CI's loaded classes using the same
|
||||||
* syntax as controllers.
|
* syntax as controllers.
|
||||||
*
|
*
|
||||||
* @param string
|
* @param string $key
|
||||||
* @access private
|
|
||||||
*/
|
*/
|
||||||
function __get($key)
|
public function __get($key)
|
||||||
{
|
{
|
||||||
$CI =& get_instance();
|
// Debugging note:
|
||||||
return $CI->$key;
|
// If you're here because you're getting an error message
|
||||||
|
// saying 'Undefined Property: system/core/Model.php', it's
|
||||||
|
// most likely a typo in your model code.
|
||||||
|
return get_instance()->$key;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// END Model Class
|
|
||||||
|
|
||||||
/* End of file Model.php */
|
}
|
||||||
/* Location: ./system/core/Model.php */
|
|
||||||
|
686
system/core/Output.php
Executable file → Normal file
686
system/core/Output.php
Executable file → Normal file
@ -1,112 +1,156 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Output Class
|
* Output Class
|
||||||
*
|
*
|
||||||
* Responsible for sending final output to browser
|
* Responsible for sending final output to the browser.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage Libraries
|
* @subpackage Libraries
|
||||||
* @category Output
|
* @category Output
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/libraries/output.html
|
* @link https://codeigniter.com/user_guide/libraries/output.html
|
||||||
*/
|
*/
|
||||||
class CI_Output {
|
class CI_Output {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Current output string
|
* Final output string
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
* @access protected
|
|
||||||
*/
|
*/
|
||||||
protected $final_output;
|
public $final_output;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cache expiration time
|
* Cache expiration time
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
* @access protected
|
|
||||||
*/
|
*/
|
||||||
protected $cache_expiration = 0;
|
public $cache_expiration = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of server headers
|
* List of server headers
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
* @access protected
|
|
||||||
*/
|
*/
|
||||||
protected $headers = array();
|
public $headers = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of mime types
|
* List of mime types
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
* @access protected
|
|
||||||
*/
|
*/
|
||||||
protected $mime_types = array();
|
public $mimes = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines wether profiler is enabled
|
* Mime-type for the current page
|
||||||
*
|
*
|
||||||
* @var book
|
* @var string
|
||||||
* @access protected
|
|
||||||
*/
|
*/
|
||||||
protected $enable_profiler = FALSE;
|
protected $mime_type = 'text/html';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if output compression is enabled
|
* Enable Profiler flag
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $enable_profiler = FALSE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* php.ini zlib.output_compression flag
|
||||||
*
|
*
|
||||||
* @var bool
|
* @var bool
|
||||||
* @access protected
|
|
||||||
*/
|
*/
|
||||||
protected $_zlib_oc = FALSE;
|
protected $_zlib_oc = FALSE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CI output compression flag
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected $_compress_output = FALSE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of profiler sections
|
* List of profiler sections
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
* @access protected
|
|
||||||
*/
|
*/
|
||||||
protected $_profiler_sections = array();
|
protected $_profiler_sections = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether or not to parse variables like {elapsed_time} and {memory_usage}
|
* Parse markers flag
|
||||||
|
*
|
||||||
|
* Whether or not to parse variables like {elapsed_time} and {memory_usage}.
|
||||||
*
|
*
|
||||||
* @var bool
|
* @var bool
|
||||||
* @access protected
|
|
||||||
*/
|
*/
|
||||||
protected $parse_exec_vars = TRUE;
|
public $parse_exec_vars = TRUE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* mbstring.func_overload flag
|
||||||
*
|
*
|
||||||
|
* @var bool
|
||||||
*/
|
*/
|
||||||
function __construct()
|
protected static $func_overload;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class constructor
|
||||||
|
*
|
||||||
|
* Determines whether zLib output compression will be used.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->_zlib_oc = @ini_get('zlib.output_compression');
|
$this->_zlib_oc = (bool) ini_get('zlib.output_compression');
|
||||||
|
$this->_compress_output = (
|
||||||
|
$this->_zlib_oc === FALSE
|
||||||
|
&& config_item('compress_output') === TRUE
|
||||||
|
&& extension_loaded('zlib')
|
||||||
|
);
|
||||||
|
|
||||||
|
isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload'));
|
||||||
|
|
||||||
// Get mime types for later
|
// Get mime types for later
|
||||||
if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'))
|
$this->mimes =& get_mimes();
|
||||||
{
|
|
||||||
include APPPATH.'config/'.ENVIRONMENT.'/mimes.php';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
include APPPATH.'config/mimes.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
log_message('info', 'Output Class Initialized');
|
||||||
$this->mime_types = $mimes;
|
|
||||||
|
|
||||||
log_message('debug', "Output Class Initialized");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -114,12 +158,11 @@ class CI_Output {
|
|||||||
/**
|
/**
|
||||||
* Get Output
|
* Get Output
|
||||||
*
|
*
|
||||||
* Returns the current output string
|
* Returns the current output string.
|
||||||
*
|
*
|
||||||
* @access public
|
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function get_output()
|
public function get_output()
|
||||||
{
|
{
|
||||||
return $this->final_output;
|
return $this->final_output;
|
||||||
}
|
}
|
||||||
@ -129,16 +172,14 @@ class CI_Output {
|
|||||||
/**
|
/**
|
||||||
* Set Output
|
* Set Output
|
||||||
*
|
*
|
||||||
* Sets the output string
|
* Sets the output string.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $output Output data
|
||||||
* @param string
|
* @return CI_Output
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
function set_output($output)
|
public function set_output($output)
|
||||||
{
|
{
|
||||||
$this->final_output = $output;
|
$this->final_output = $output;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,23 +188,14 @@ class CI_Output {
|
|||||||
/**
|
/**
|
||||||
* Append Output
|
* Append Output
|
||||||
*
|
*
|
||||||
* Appends data onto the output string
|
* Appends data onto the output string.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $output Data to append
|
||||||
* @param string
|
* @return CI_Output
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
function append_output($output)
|
public function append_output($output)
|
||||||
{
|
|
||||||
if ($this->final_output == '')
|
|
||||||
{
|
|
||||||
$this->final_output = $output;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
$this->final_output .= $output;
|
$this->final_output .= $output;
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,52 +204,49 @@ class CI_Output {
|
|||||||
/**
|
/**
|
||||||
* Set Header
|
* Set Header
|
||||||
*
|
*
|
||||||
* Lets you set a server header which will be outputted with the final display.
|
* Lets you set a server header which will be sent with the final output.
|
||||||
*
|
*
|
||||||
* Note: If a file is cached, headers will not be sent. We need to figure out
|
* Note: If a file is cached, headers will not be sent.
|
||||||
* how to permit header data to be saved with the cache data...
|
* @todo We need to figure out how to permit headers to be cached.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $header Header
|
||||||
* @param string
|
* @param bool $replace Whether to replace the old header value, if already set
|
||||||
* @param bool
|
* @return CI_Output
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
function set_header($header, $replace = TRUE)
|
public function set_header($header, $replace = TRUE)
|
||||||
{
|
{
|
||||||
// If zlib.output_compression is enabled it will compress the output,
|
// If zlib.output_compression is enabled it will compress the output,
|
||||||
// but it will not modify the content-length header to compensate for
|
// but it will not modify the content-length header to compensate for
|
||||||
// the reduction, causing the browser to hang waiting for more data.
|
// the reduction, causing the browser to hang waiting for more data.
|
||||||
// We'll just skip content-length in those cases.
|
// We'll just skip content-length in those cases.
|
||||||
|
if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) === 0)
|
||||||
if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) == 0)
|
|
||||||
{
|
{
|
||||||
return;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->headers[] = array($header, $replace);
|
$this->headers[] = array($header, $replace);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set Content Type Header
|
* Set Content-Type Header
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $mime_type Extension of the file we're outputting
|
||||||
* @param string extension of the file we're outputting
|
* @param string $charset Character set (default: NULL)
|
||||||
* @return void
|
* @return CI_Output
|
||||||
*/
|
*/
|
||||||
function set_content_type($mime_type)
|
public function set_content_type($mime_type, $charset = NULL)
|
||||||
{
|
{
|
||||||
if (strpos($mime_type, '/') === FALSE)
|
if (strpos($mime_type, '/') === FALSE)
|
||||||
{
|
{
|
||||||
$extension = ltrim($mime_type, '.');
|
$extension = ltrim($mime_type, '.');
|
||||||
|
|
||||||
// Is this extension supported?
|
// Is this extension supported?
|
||||||
if (isset($this->mime_types[$extension]))
|
if (isset($this->mimes[$extension]))
|
||||||
{
|
{
|
||||||
$mime_type =& $this->mime_types[$extension];
|
$mime_type =& $this->mimes[$extension];
|
||||||
|
|
||||||
if (is_array($mime_type))
|
if (is_array($mime_type))
|
||||||
{
|
{
|
||||||
@ -226,28 +255,89 @@ class CI_Output {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$header = 'Content-Type: '.$mime_type;
|
$this->mime_type = $mime_type;
|
||||||
|
|
||||||
|
if (empty($charset))
|
||||||
|
{
|
||||||
|
$charset = config_item('charset');
|
||||||
|
}
|
||||||
|
|
||||||
|
$header = 'Content-Type: '.$mime_type
|
||||||
|
.(empty($charset) ? '' : '; charset='.$charset);
|
||||||
|
|
||||||
$this->headers[] = array($header, TRUE);
|
$this->headers[] = array($header, TRUE);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set HTTP Status Header
|
* Get Current Content-Type Header
|
||||||
* moved to Common procedural functions in 1.7.2
|
|
||||||
*
|
*
|
||||||
* @access public
|
* @return string 'text/html', if not already set
|
||||||
* @param int the status code
|
|
||||||
* @param string
|
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
function set_status_header($code = 200, $text = '')
|
public function get_content_type()
|
||||||
|
{
|
||||||
|
for ($i = 0, $c = count($this->headers); $i < $c; $i++)
|
||||||
|
{
|
||||||
|
if (sscanf($this->headers[$i][0], 'Content-Type: %[^;]', $content_type) === 1)
|
||||||
|
{
|
||||||
|
return $content_type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'text/html';
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Header
|
||||||
|
*
|
||||||
|
* @param string $header
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function get_header($header)
|
||||||
|
{
|
||||||
|
// Combine headers already sent with our batched headers
|
||||||
|
$headers = array_merge(
|
||||||
|
// We only need [x][0] from our multi-dimensional array
|
||||||
|
array_map('array_shift', $this->headers),
|
||||||
|
headers_list()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (empty($headers) OR empty($header))
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count backwards, in order to get the last matching header
|
||||||
|
for ($c = count($headers) - 1; $c > -1; $c--)
|
||||||
|
{
|
||||||
|
if (strncasecmp($header, $headers[$c], $l = self::strlen($header)) === 0)
|
||||||
|
{
|
||||||
|
return trim(self::substr($headers[$c], $l+1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set HTTP Status Header
|
||||||
|
*
|
||||||
|
* As of version 1.7.2, this is an alias for common function
|
||||||
|
* set_status_header().
|
||||||
|
*
|
||||||
|
* @param int $code Status code (default: 200)
|
||||||
|
* @param string $text Optional message
|
||||||
|
* @return CI_Output
|
||||||
|
*/
|
||||||
|
public function set_status_header($code = 200, $text = '')
|
||||||
{
|
{
|
||||||
set_status_header($code, $text);
|
set_status_header($code, $text);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -256,14 +346,12 @@ class CI_Output {
|
|||||||
/**
|
/**
|
||||||
* Enable/disable Profiler
|
* Enable/disable Profiler
|
||||||
*
|
*
|
||||||
* @access public
|
* @param bool $val TRUE to enable or FALSE to disable
|
||||||
* @param bool
|
* @return CI_Output
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
function enable_profiler($val = TRUE)
|
public function enable_profiler($val = TRUE)
|
||||||
{
|
{
|
||||||
$this->enable_profiler = (is_bool($val)) ? $val : TRUE;
|
$this->enable_profiler = is_bool($val) ? $val : TRUE;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,17 +360,23 @@ class CI_Output {
|
|||||||
/**
|
/**
|
||||||
* Set Profiler Sections
|
* Set Profiler Sections
|
||||||
*
|
*
|
||||||
* Allows override of default / config settings for Profiler section display
|
* Allows override of default/config settings for
|
||||||
|
* Profiler section display.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param array $sections Profiler sections
|
||||||
* @param array
|
* @return CI_Output
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
function set_profiler_sections($sections)
|
public function set_profiler_sections($sections)
|
||||||
{
|
{
|
||||||
|
if (isset($sections['query_toggle_count']))
|
||||||
|
{
|
||||||
|
$this->_profiler_sections['query_toggle_count'] = (int) $sections['query_toggle_count'];
|
||||||
|
unset($sections['query_toggle_count']);
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($sections as $section => $enable)
|
foreach ($sections as $section => $enable)
|
||||||
{
|
{
|
||||||
$this->_profiler_sections[$section] = ($enable !== FALSE) ? TRUE : FALSE;
|
$this->_profiler_sections[$section] = ($enable !== FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
@ -293,14 +387,12 @@ class CI_Output {
|
|||||||
/**
|
/**
|
||||||
* Set Cache
|
* Set Cache
|
||||||
*
|
*
|
||||||
* @access public
|
* @param int $time Cache expiration time in minutes
|
||||||
* @param integer
|
* @return CI_Output
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
function cache($time)
|
public function cache($time)
|
||||||
{
|
{
|
||||||
$this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time;
|
$this->cache_expiration = is_numeric($time) ? $time : 0;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,27 +401,27 @@ class CI_Output {
|
|||||||
/**
|
/**
|
||||||
* Display Output
|
* Display Output
|
||||||
*
|
*
|
||||||
* All "view" data is automatically put into this variable by the controller class:
|
* Processes and sends finalized output data to the browser along
|
||||||
|
* with any server headers and profile data. It also stops benchmark
|
||||||
|
* timers so the page rendering speed and memory usage can be shown.
|
||||||
*
|
*
|
||||||
* $this->final_output
|
* Note: All "view" data is automatically put into $this->final_output
|
||||||
|
* by controller class.
|
||||||
*
|
*
|
||||||
* This function sends the finalized output data to the browser along
|
* @uses CI_Output::$final_output
|
||||||
* with any server headers and profile data. It also stops the
|
* @param string $output Output data override
|
||||||
* benchmark timer so the page rendering speed and memory usage can be shown.
|
* @return void
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param string
|
|
||||||
* @return mixed
|
|
||||||
*/
|
*/
|
||||||
function _display($output = '')
|
public function _display($output = '')
|
||||||
{
|
{
|
||||||
// Note: We use globals because we can't use $CI =& get_instance()
|
// Note: We use load_class() because we can't use $CI =& get_instance()
|
||||||
// since this function is sometimes called by the caching mechanism,
|
// since this function is sometimes called by the caching mechanism,
|
||||||
// which happens before the CI super object is available.
|
// which happens before the CI super object is available.
|
||||||
global $BM, $CFG;
|
$BM =& load_class('Benchmark', 'core');
|
||||||
|
$CFG =& load_class('Config', 'core');
|
||||||
|
|
||||||
// Grab the super object if we can.
|
// Grab the super object if we can.
|
||||||
if (class_exists('CI_Controller'))
|
if (class_exists('CI_Controller', FALSE))
|
||||||
{
|
{
|
||||||
$CI =& get_instance();
|
$CI =& get_instance();
|
||||||
}
|
}
|
||||||
@ -337,7 +429,7 @@ class CI_Output {
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
// Set the output data
|
// Set the output data
|
||||||
if ($output == '')
|
if ($output === '')
|
||||||
{
|
{
|
||||||
$output =& $this->final_output;
|
$output =& $this->final_output;
|
||||||
}
|
}
|
||||||
@ -361,25 +453,19 @@ class CI_Output {
|
|||||||
|
|
||||||
if ($this->parse_exec_vars === TRUE)
|
if ($this->parse_exec_vars === TRUE)
|
||||||
{
|
{
|
||||||
$memory = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB';
|
$memory = round(memory_get_usage() / 1024 / 1024, 2).'MB';
|
||||||
|
$output = str_replace(array('{elapsed_time}', '{memory_usage}'), array($elapsed, $memory), $output);
|
||||||
$output = str_replace('{elapsed_time}', $elapsed, $output);
|
|
||||||
$output = str_replace('{memory_usage}', $memory, $output);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
// Is compression requested?
|
// Is compression requested?
|
||||||
if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc == FALSE)
|
if (isset($CI) // This means that we're not serving a cache file, if we were, it would already be compressed
|
||||||
{
|
&& $this->_compress_output === TRUE
|
||||||
if (extension_loaded('zlib'))
|
&& isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)
|
||||||
{
|
|
||||||
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) AND strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)
|
|
||||||
{
|
{
|
||||||
ob_start('ob_gzhandler');
|
ob_start('ob_gzhandler');
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
@ -399,20 +485,34 @@ class CI_Output {
|
|||||||
// simply echo out the data and exit.
|
// simply echo out the data and exit.
|
||||||
if ( ! isset($CI))
|
if ( ! isset($CI))
|
||||||
{
|
{
|
||||||
|
if ($this->_compress_output === TRUE)
|
||||||
|
{
|
||||||
|
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)
|
||||||
|
{
|
||||||
|
header('Content-Encoding: gzip');
|
||||||
|
header('Content-Length: '.self::strlen($output));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// User agent doesn't support gzip compression,
|
||||||
|
// so we'll have to decompress our cache
|
||||||
|
$output = gzinflate(self::substr($output, 10, -8));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
echo $output;
|
echo $output;
|
||||||
log_message('debug', "Final output sent to browser");
|
log_message('info', 'Final output sent to browser');
|
||||||
log_message('debug', "Total execution time: ".$elapsed);
|
log_message('debug', 'Total execution time: '.$elapsed);
|
||||||
return TRUE;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
// Do we need to generate profile data?
|
// Do we need to generate profile data?
|
||||||
// If so, load the Profile class and run it.
|
// If so, load the Profile class and run it.
|
||||||
if ($this->enable_profiler == TRUE)
|
if ($this->enable_profiler === TRUE)
|
||||||
{
|
{
|
||||||
$CI->load->library('profiler');
|
$CI->load->library('profiler');
|
||||||
|
|
||||||
if ( ! empty($this->_profiler_sections))
|
if ( ! empty($this->_profiler_sections))
|
||||||
{
|
{
|
||||||
$CI->profiler->set_sections($this->_profiler_sections);
|
$CI->profiler->set_sections($this->_profiler_sections);
|
||||||
@ -420,19 +520,12 @@ class CI_Output {
|
|||||||
|
|
||||||
// If the output data contains closing </body> and </html> tags
|
// If the output data contains closing </body> and </html> tags
|
||||||
// we will remove them and add them back after we insert the profile data
|
// 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, -1, $count).$CI->profiler->run();
|
||||||
|
if ($count > 0)
|
||||||
{
|
{
|
||||||
$output = preg_replace("|</body>.*?</html>|is", '', $output);
|
|
||||||
$output .= $CI->profiler->run();
|
|
||||||
$output .= '</body></html>';
|
$output .= '</body></html>';
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
$output .= $CI->profiler->run();
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Does the controller contain a function named _output()?
|
// Does the controller contain a function named _output()?
|
||||||
// If so send the output there. Otherwise, echo it.
|
// If so send the output there. Otherwise, echo it.
|
||||||
@ -445,130 +538,305 @@ class CI_Output {
|
|||||||
echo $output; // Send it to the browser!
|
echo $output; // Send it to the browser!
|
||||||
}
|
}
|
||||||
|
|
||||||
log_message('debug', "Final output sent to browser");
|
log_message('info', 'Final output sent to browser');
|
||||||
log_message('debug', "Total execution time: ".$elapsed);
|
log_message('debug', 'Total execution time: '.$elapsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a Cache File
|
* Write Cache
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $output Output data to cache
|
||||||
* @param string
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function _write_cache($output)
|
public function _write_cache($output)
|
||||||
{
|
{
|
||||||
$CI =& get_instance();
|
$CI =& get_instance();
|
||||||
$path = $CI->config->item('cache_path');
|
$path = $CI->config->item('cache_path');
|
||||||
|
$cache_path = ($path === '') ? APPPATH.'cache/' : $path;
|
||||||
$cache_path = ($path == '') ? APPPATH.'cache/' : $path;
|
|
||||||
|
|
||||||
if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
|
if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
|
||||||
{
|
{
|
||||||
log_message('error', "Unable to write cache file: ".$cache_path);
|
log_message('error', 'Unable to write cache file: '.$cache_path);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$uri = $CI->config->item('base_url').
|
$uri = $CI->config->item('base_url')
|
||||||
$CI->config->item('index_page').
|
.$CI->config->item('index_page')
|
||||||
$CI->uri->uri_string();
|
.$CI->uri->uri_string();
|
||||||
|
|
||||||
|
if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING']))
|
||||||
|
{
|
||||||
|
if (is_array($cache_query_string))
|
||||||
|
{
|
||||||
|
$uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$uri .= '?'.$_SERVER['QUERY_STRING'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$cache_path .= md5($uri);
|
$cache_path .= md5($uri);
|
||||||
|
|
||||||
if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE))
|
if ( ! $fp = @fopen($cache_path, 'w+b'))
|
||||||
{
|
{
|
||||||
log_message('error', "Unable to write cache file: ".$cache_path);
|
log_message('error', 'Unable to write cache file: '.$cache_path);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( ! flock($fp, LOCK_EX))
|
||||||
|
{
|
||||||
|
log_message('error', 'Unable to secure a file lock for file at: '.$cache_path);
|
||||||
|
fclose($fp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If output compression is enabled, compress the cache
|
||||||
|
// itself, so that we don't have to do that each time
|
||||||
|
// we're serving it
|
||||||
|
if ($this->_compress_output === TRUE)
|
||||||
|
{
|
||||||
|
$output = gzencode($output);
|
||||||
|
|
||||||
|
if ($this->get_header('content-type') === NULL)
|
||||||
|
{
|
||||||
|
$this->set_content_type($this->mime_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$expire = time() + ($this->cache_expiration * 60);
|
$expire = time() + ($this->cache_expiration * 60);
|
||||||
|
|
||||||
if (flock($fp, LOCK_EX))
|
// Put together our serialized info.
|
||||||
|
$cache_info = serialize(array(
|
||||||
|
'expire' => $expire,
|
||||||
|
'headers' => $this->headers
|
||||||
|
));
|
||||||
|
|
||||||
|
$output = $cache_info.'ENDCI--->'.$output;
|
||||||
|
|
||||||
|
for ($written = 0, $length = self::strlen($output); $written < $length; $written += $result)
|
||||||
{
|
{
|
||||||
fwrite($fp, $expire.'TS--->'.$output);
|
if (($result = fwrite($fp, self::substr($output, $written))) === FALSE)
|
||||||
flock($fp, LOCK_UN);
|
{
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
|
|
||||||
|
flock($fp, LOCK_UN);
|
||||||
|
fclose($fp);
|
||||||
|
|
||||||
|
if ( ! is_int($result))
|
||||||
{
|
{
|
||||||
log_message('error', "Unable to secure a file lock for file at: ".$cache_path);
|
@unlink($cache_path);
|
||||||
|
log_message('error', 'Unable to write the complete cache content at: '.$cache_path);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fclose($fp);
|
|
||||||
@chmod($cache_path, FILE_WRITE_MODE);
|
|
||||||
|
|
||||||
log_message('debug', "Cache file written: ".$cache_path);
|
chmod($cache_path, 0640);
|
||||||
|
log_message('debug', 'Cache file written: '.$cache_path);
|
||||||
|
|
||||||
|
// Send HTTP cache-control headers to browser to match file cache settings.
|
||||||
|
$this->set_cache_header($_SERVER['REQUEST_TIME'], $expire);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update/serve a cached file
|
* Update/serve cached output
|
||||||
*
|
*
|
||||||
* @access public
|
* @uses CI_Config
|
||||||
* @param object config class
|
* @uses CI_URI
|
||||||
* @param object uri class
|
*
|
||||||
* @return void
|
* @param object &$CFG CI_Config class instance
|
||||||
|
* @param object &$URI CI_URI class instance
|
||||||
|
* @return bool TRUE on success or FALSE on failure
|
||||||
*/
|
*/
|
||||||
function _display_cache(&$CFG, &$URI)
|
public function _display_cache(&$CFG, &$URI)
|
||||||
{
|
{
|
||||||
$cache_path = ($CFG->item('cache_path') == '') ? APPPATH.'cache/' : $CFG->item('cache_path');
|
$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
|
// Build the file path. The file name is an MD5 hash of the full URI
|
||||||
$uri = $CFG->item('base_url').
|
$uri = $CFG->item('base_url').$CFG->item('index_page').$URI->uri_string;
|
||||||
$CFG->item('index_page').
|
|
||||||
$URI->uri_string;
|
if (($cache_query_string = $CFG->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING']))
|
||||||
|
{
|
||||||
|
if (is_array($cache_query_string))
|
||||||
|
{
|
||||||
|
$uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$uri .= '?'.$_SERVER['QUERY_STRING'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$filepath = $cache_path.md5($uri);
|
$filepath = $cache_path.md5($uri);
|
||||||
|
|
||||||
if ( ! @file_exists($filepath))
|
if ( ! file_exists($filepath) OR ! $fp = @fopen($filepath, 'rb'))
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! $fp = @fopen($filepath, FOPEN_READ))
|
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
flock($fp, LOCK_SH);
|
flock($fp, LOCK_SH);
|
||||||
|
|
||||||
$cache = '';
|
$cache = (filesize($filepath) > 0) ? fread($fp, filesize($filepath)) : '';
|
||||||
if (filesize($filepath) > 0)
|
|
||||||
{
|
|
||||||
$cache = fread($fp, filesize($filepath));
|
|
||||||
}
|
|
||||||
|
|
||||||
flock($fp, LOCK_UN);
|
flock($fp, LOCK_UN);
|
||||||
fclose($fp);
|
fclose($fp);
|
||||||
|
|
||||||
// Strip out the embedded timestamp
|
// Look for embedded serialized file info.
|
||||||
if ( ! preg_match("/(\d+TS--->)/", $cache, $match))
|
if ( ! preg_match('/^(.*)ENDCI--->/', $cache, $match))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Has the file expired? If so we'll delete it.
|
$cache_info = unserialize($match[1]);
|
||||||
if (time() >= trim(str_replace('TS--->', '', $match['1'])))
|
$expire = $cache_info['expire'];
|
||||||
{
|
|
||||||
if (is_really_writable($cache_path))
|
$last_modified = filemtime($filepath);
|
||||||
|
|
||||||
|
// Has the file expired?
|
||||||
|
if ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path))
|
||||||
{
|
{
|
||||||
|
// If so we'll delete it.
|
||||||
@unlink($filepath);
|
@unlink($filepath);
|
||||||
log_message('debug', "Cache file has expired. File deleted");
|
log_message('debug', 'Cache file has expired. File deleted.');
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send the HTTP cache control headers
|
||||||
|
$this->set_cache_header($last_modified, $expire);
|
||||||
|
|
||||||
|
// Add headers from cache file.
|
||||||
|
foreach ($cache_info['headers'] as $header)
|
||||||
|
{
|
||||||
|
$this->set_header($header[0], $header[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display the cache
|
// Display the cache
|
||||||
$this->_display(str_replace($match['0'], '', $cache));
|
$this->_display(self::substr($cache, self::strlen($match[0])));
|
||||||
log_message('debug', "Cache file is current. Sending it to browser.");
|
log_message('debug', 'Cache file is current. Sending it to browser.');
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete cache
|
||||||
|
*
|
||||||
|
* @param string $uri URI string
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function delete_cache($uri = '')
|
||||||
|
{
|
||||||
|
$CI =& get_instance();
|
||||||
|
$cache_path = $CI->config->item('cache_path');
|
||||||
|
if ($cache_path === '')
|
||||||
|
{
|
||||||
|
$cache_path = APPPATH.'cache/';
|
||||||
}
|
}
|
||||||
// END Output Class
|
|
||||||
|
|
||||||
/* End of file Output.php */
|
if ( ! is_dir($cache_path))
|
||||||
/* Location: ./system/core/Output.php */
|
{
|
||||||
|
log_message('error', 'Unable to find cache path: '.$cache_path);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($uri))
|
||||||
|
{
|
||||||
|
$uri = $CI->uri->uri_string();
|
||||||
|
|
||||||
|
if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING']))
|
||||||
|
{
|
||||||
|
if (is_array($cache_query_string))
|
||||||
|
{
|
||||||
|
$uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$uri .= '?'.$_SERVER['QUERY_STRING'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$cache_path .= md5($CI->config->item('base_url').$CI->config->item('index_page').ltrim($uri, '/'));
|
||||||
|
|
||||||
|
if ( ! @unlink($cache_path))
|
||||||
|
{
|
||||||
|
log_message('error', 'Unable to delete cache file for '.$uri);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Cache Header
|
||||||
|
*
|
||||||
|
* Set the HTTP headers to match the server-side file cache settings
|
||||||
|
* in order to reduce bandwidth.
|
||||||
|
*
|
||||||
|
* @param int $last_modified Timestamp of when the page was last modified
|
||||||
|
* @param int $expiration Timestamp of when should the requested page expire from cache
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function set_cache_header($last_modified, $expiration)
|
||||||
|
{
|
||||||
|
$max_age = $expiration - $_SERVER['REQUEST_TIME'];
|
||||||
|
|
||||||
|
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))
|
||||||
|
{
|
||||||
|
$this->set_status_header(304);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
header('Pragma: public');
|
||||||
|
header('Cache-Control: max-age='.$max_age.', public');
|
||||||
|
header('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT');
|
||||||
|
header('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Byte-safe strlen()
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static function strlen($str)
|
||||||
|
{
|
||||||
|
return (self::$func_overload)
|
||||||
|
? mb_strlen($str, '8bit')
|
||||||
|
: strlen($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Byte-safe substr()
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @param int $start
|
||||||
|
* @param int $length
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function substr($str, $start, $length = NULL)
|
||||||
|
{
|
||||||
|
if (self::$func_overload)
|
||||||
|
{
|
||||||
|
// mb_substr($str, $start, null, '8bit') returns an empty
|
||||||
|
// string on PHP 5.3
|
||||||
|
isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start);
|
||||||
|
return mb_substr($str, $start, $length, '8bit');
|
||||||
|
}
|
||||||
|
|
||||||
|
return isset($length)
|
||||||
|
? substr($str, $start, $length)
|
||||||
|
: substr($str, $start);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
573
system/core/Router.php
Executable file → Normal file
573
system/core/Router.php
Executable file → Normal file
@ -1,19 +1,41 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Router Class
|
* Router Class
|
||||||
@ -22,330 +44,317 @@
|
|||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage Libraries
|
* @subpackage Libraries
|
||||||
* @author ExpressionEngine Dev Team
|
|
||||||
* @category Libraries
|
* @category Libraries
|
||||||
* @link http://codeigniter.com/user_guide/general/routing.html
|
* @author EllisLab Dev Team
|
||||||
|
* @link https://codeigniter.com/user_guide/general/routing.html
|
||||||
*/
|
*/
|
||||||
class CI_Router {
|
class CI_Router {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Config class
|
* CI_Config class object
|
||||||
*
|
*
|
||||||
* @var object
|
* @var object
|
||||||
* @access public
|
|
||||||
*/
|
*/
|
||||||
var $config;
|
public $config;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of routes
|
* List of routes
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
* @access public
|
|
||||||
*/
|
*/
|
||||||
var $routes = array();
|
public $routes = array();
|
||||||
/**
|
|
||||||
* List of error routes
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
var $error_routes = array();
|
|
||||||
/**
|
/**
|
||||||
* Current class name
|
* Current class name
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
* @access public
|
|
||||||
*/
|
*/
|
||||||
var $class = '';
|
public $class = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Current method name
|
* Current method name
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
* @access public
|
|
||||||
*/
|
*/
|
||||||
var $method = 'index';
|
public $method = 'index';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sub-directory that contains the requested controller class
|
* Sub-directory that contains the requested controller class
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
* @access public
|
|
||||||
*/
|
*/
|
||||||
var $directory = '';
|
public $directory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default controller (and method if specific)
|
* Default controller (and method if specific)
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
* @access public
|
|
||||||
*/
|
*/
|
||||||
var $default_controller;
|
public $default_controller;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Translate URI dashes
|
||||||
|
*
|
||||||
|
* Determines whether dashes in controller & method segments
|
||||||
|
* should be automatically replaced by underscores.
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $translate_uri_dashes = FALSE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable query strings flag
|
||||||
|
*
|
||||||
|
* Determines whether to use GET parameters or segment URIs
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $enable_query_strings = FALSE;
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class constructor
|
||||||
*
|
*
|
||||||
* Runs the route mapping function.
|
* Runs the route mapping function.
|
||||||
|
*
|
||||||
|
* @param array $routing
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
function __construct()
|
public function __construct($routing = NULL)
|
||||||
{
|
{
|
||||||
$this->config =& load_class('Config', 'core');
|
$this->config =& load_class('Config', 'core');
|
||||||
$this->uri =& load_class('URI', 'core');
|
$this->uri =& load_class('URI', 'core');
|
||||||
log_message('debug', "Router Class Initialized");
|
|
||||||
|
$this->enable_query_strings = ( ! is_cli() && $this->config->item('enable_query_strings') === TRUE);
|
||||||
|
|
||||||
|
// If a directory override is configured, it has to be set before any dynamic routing logic
|
||||||
|
is_array($routing) && isset($routing['directory']) && $this->set_directory($routing['directory']);
|
||||||
|
$this->_set_routing();
|
||||||
|
|
||||||
|
// Set any routing overrides that may exist in the main index file
|
||||||
|
if (is_array($routing))
|
||||||
|
{
|
||||||
|
empty($routing['controller']) OR $this->set_class($routing['controller']);
|
||||||
|
empty($routing['function']) OR $this->set_method($routing['function']);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_message('info', 'Router Class Initialized');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the route mapping
|
* Set route mapping
|
||||||
*
|
*
|
||||||
* This function determines what should be served based on the URI request,
|
* Determines what should be served based on the URI request,
|
||||||
* as well as any "routes" that have been set in the routing config file.
|
* as well as any "routes" that have been set in the routing config file.
|
||||||
*
|
*
|
||||||
* @access private
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function _set_routing()
|
protected function _set_routing()
|
||||||
{
|
{
|
||||||
// Are query strings enabled in the config file? Normally CI doesn't utilize query strings
|
// Load the routes.php file. It would be great if we could
|
||||||
// since URI segments are more search-engine friendly, but they can optionally be used.
|
// skip this for enable_query_strings = TRUE, but then
|
||||||
// If this feature is enabled, we will gather the directory/class/method a little differently
|
// default_controller would be empty ...
|
||||||
$segments = array();
|
if (file_exists(APPPATH.'config/routes.php'))
|
||||||
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');
|
include(APPPATH.'config/routes.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->routes = ( ! isset($route) OR ! is_array($route)) ? array() : $route;
|
if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php'))
|
||||||
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);
|
include(APPPATH.'config/'.ENVIRONMENT.'/routes.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch the complete URI string
|
// Validate & get reserved routes
|
||||||
$this->uri->_fetch_uri_string();
|
if (isset($route) && is_array($route))
|
||||||
|
|
||||||
// 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();
|
isset($route['default_controller']) && $this->default_controller = $route['default_controller'];
|
||||||
|
isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes'];
|
||||||
|
unset($route['default_controller'], $route['translate_uri_dashes']);
|
||||||
|
$this->routes = $route;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do we need to remove the URL suffix?
|
// Are query strings enabled in the config file? Normally CI doesn't utilize query strings
|
||||||
$this->uri->_remove_url_suffix();
|
// 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
|
||||||
|
if ($this->enable_query_strings)
|
||||||
|
{
|
||||||
|
// If the directory is set at this time, it means an override exists, so skip the checks
|
||||||
|
if ( ! isset($this->directory))
|
||||||
|
{
|
||||||
|
$_d = $this->config->item('directory_trigger');
|
||||||
|
$_d = isset($_GET[$_d]) ? trim($_GET[$_d], " \t\n\r\0\x0B/") : '';
|
||||||
|
|
||||||
// Compile the segments into an array
|
if ($_d !== '')
|
||||||
$this->uri->_explode_segments();
|
{
|
||||||
|
$this->uri->filter_uri($_d);
|
||||||
// Parse any custom routing that may exist
|
$this->set_directory($_d);
|
||||||
$this->_parse_routes();
|
}
|
||||||
|
|
||||||
// Re-index the segment array so that it starts with 1 rather than 0
|
|
||||||
$this->uri->_reindex_segments();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
$_c = trim($this->config->item('controller_trigger'));
|
||||||
|
if ( ! empty($_GET[$_c]))
|
||||||
|
{
|
||||||
|
$this->uri->filter_uri($_GET[$_c]);
|
||||||
|
$this->set_class($_GET[$_c]);
|
||||||
|
|
||||||
/**
|
$_f = trim($this->config->item('function_trigger'));
|
||||||
* Set the default controller
|
if ( ! empty($_GET[$_f]))
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function _set_default_controller()
|
|
||||||
{
|
{
|
||||||
if ($this->default_controller === FALSE)
|
$this->uri->filter_uri($_GET[$_f]);
|
||||||
{
|
$this->set_method($_GET[$_f]);
|
||||||
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->uri->rsegments = array(
|
||||||
$this->set_method($x[1]);
|
1 => $this->class,
|
||||||
$this->_set_request($x);
|
2 => $this->method
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->set_class($this->default_controller);
|
$this->_set_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
|
// Routing rules don't apply to query strings and we don't need to detect
|
||||||
$this->uri->_reindex_segments();
|
// directories, so we're done here
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
log_message('debug', "No URI present. Default controller set.");
|
// Is there anything to parse?
|
||||||
|
if ($this->uri->uri_string !== '')
|
||||||
|
{
|
||||||
|
$this->_parse_routes();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->_set_default_controller();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the Route
|
* Set request route
|
||||||
*
|
*
|
||||||
* This function takes an array of URI segments as
|
* Takes an array of URI segments as input and sets the class/method
|
||||||
* input, and sets the current class/method
|
* to be called.
|
||||||
*
|
*
|
||||||
* @access private
|
* @used-by CI_Router::_parse_routes()
|
||||||
* @param array
|
* @param array $segments URI segments
|
||||||
* @param bool
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function _set_request($segments = array())
|
protected function _set_request($segments = array())
|
||||||
{
|
{
|
||||||
$segments = $this->_validate_request($segments);
|
$segments = $this->_validate_request($segments);
|
||||||
|
// If we don't have any segments left - try the default controller;
|
||||||
if (count($segments) == 0)
|
// WARNING: Directories get shifted out of the segments array!
|
||||||
|
if (empty($segments))
|
||||||
{
|
{
|
||||||
return $this->_set_default_controller();
|
$this->_set_default_controller();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->translate_uri_dashes === TRUE)
|
||||||
|
{
|
||||||
|
$segments[0] = str_replace('-', '_', $segments[0]);
|
||||||
|
if (isset($segments[1]))
|
||||||
|
{
|
||||||
|
$segments[1] = str_replace('-', '_', $segments[1]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->set_class($segments[0]);
|
$this->set_class($segments[0]);
|
||||||
|
|
||||||
if (isset($segments[1]))
|
if (isset($segments[1]))
|
||||||
{
|
{
|
||||||
// A standard method request
|
|
||||||
$this->set_method($segments[1]);
|
$this->set_method($segments[1]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// This lets the "routed" segment array identify that the default
|
|
||||||
// index method is being used.
|
|
||||||
$segments[1] = 'index';
|
$segments[1] = 'index';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update our "routed" segment array to contain the segments.
|
array_unshift($segments, NULL);
|
||||||
// Note: If there is no custom routing, this array will be
|
unset($segments[0]);
|
||||||
// identical to $this->uri->segments
|
|
||||||
$this->uri->rsegments = $segments;
|
$this->uri->rsegments = $segments;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validates the supplied segments. Attempts to determine the path to
|
* Set default controller
|
||||||
* the controller.
|
|
||||||
*
|
*
|
||||||
* @access private
|
* @return void
|
||||||
* @param array
|
|
||||||
* @return array
|
|
||||||
*/
|
*/
|
||||||
function _validate_request($segments)
|
protected function _set_default_controller()
|
||||||
{
|
{
|
||||||
if (count($segments) == 0)
|
if (empty($this->default_controller))
|
||||||
{
|
{
|
||||||
return $segments;
|
show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Does the requested controller exist in the root folder?
|
// Is the method being specified?
|
||||||
if (file_exists(APPPATH.'controllers/'.$segments[0].'.php'))
|
if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2)
|
||||||
{
|
{
|
||||||
return $segments;
|
$method = 'index';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is the controller in a sub-folder?
|
if ( ! file_exists(APPPATH.'controllers/'.$this->directory.ucfirst($class).'.php'))
|
||||||
if (is_dir(APPPATH.'controllers/'.$segments[0]))
|
|
||||||
{
|
{
|
||||||
// Set the directory and remove it from the segment array
|
// This will trigger 404 later
|
||||||
$this->set_directory($segments[0]);
|
return;
|
||||||
$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?
|
$this->set_class($class);
|
||||||
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php'))
|
$this->set_method($method);
|
||||||
{
|
|
||||||
$this->directory = '';
|
// Assign routed segments, index starting from 1
|
||||||
return array();
|
$this->uri->rsegments = array(
|
||||||
|
1 => $class,
|
||||||
|
2 => $method
|
||||||
|
);
|
||||||
|
|
||||||
|
log_message('debug', 'No URI present. Default controller set.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate request
|
||||||
|
*
|
||||||
|
* Attempts validate the URI request and determine the controller path.
|
||||||
|
*
|
||||||
|
* @used-by CI_Router::_set_request()
|
||||||
|
* @param array $segments URI segments
|
||||||
|
* @return mixed URI segments
|
||||||
|
*/
|
||||||
|
protected function _validate_request($segments)
|
||||||
|
{
|
||||||
|
$c = count($segments);
|
||||||
|
$directory_override = isset($this->directory);
|
||||||
|
|
||||||
|
// Loop through our segments and return as soon as a controller
|
||||||
|
// is found or when such a directory doesn't exist
|
||||||
|
while ($c-- > 0)
|
||||||
|
{
|
||||||
|
$test = $this->directory
|
||||||
|
.ucfirst($this->translate_uri_dashes === TRUE ? str_replace('-', '_', $segments[0]) : $segments[0]);
|
||||||
|
|
||||||
|
if ( ! file_exists(APPPATH.'controllers/'.$test.'.php')
|
||||||
|
&& $directory_override === FALSE
|
||||||
|
&& is_dir(APPPATH.'controllers/'.$this->directory.$segments[0])
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$this->set_directory(array_shift($segments), TRUE);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $segments;
|
return $segments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This means that all segments were actually directories
|
||||||
// If we've gotten this far it means that the URI does not correlate to a valid
|
return $segments;
|
||||||
// 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]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -353,58 +362,76 @@ class CI_Router {
|
|||||||
/**
|
/**
|
||||||
* Parse Routes
|
* Parse Routes
|
||||||
*
|
*
|
||||||
* This function matches any routes that may exist in
|
* Matches any routes that may exist in the config/routes.php file
|
||||||
* the config/routes.php file against the URI to
|
* against the URI to determine if the class/method need to be remapped.
|
||||||
* determine if the class/method need to be remapped.
|
|
||||||
*
|
*
|
||||||
* @access private
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function _parse_routes()
|
protected function _parse_routes()
|
||||||
{
|
{
|
||||||
// Turn the segment array into a URI string
|
// Turn the segment array into a URI string
|
||||||
$uri = implode('/', $this->uri->segments);
|
$uri = implode('/', $this->uri->segments);
|
||||||
|
|
||||||
// Is there a literal match? If so we're done
|
// Get HTTP verb
|
||||||
if (isset($this->routes[$uri]))
|
$http_verb = isset($_SERVER['REQUEST_METHOD']) ? strtolower($_SERVER['REQUEST_METHOD']) : 'cli';
|
||||||
{
|
|
||||||
return $this->_set_request(explode('/', $this->routes[$uri]));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loop through the route array looking for wild-cards
|
// Loop through the route array looking for wildcards
|
||||||
foreach ($this->routes as $key => $val)
|
foreach ($this->routes as $key => $val)
|
||||||
{
|
{
|
||||||
// Convert wild-cards to RegEx
|
// Check if route format is using HTTP verbs
|
||||||
$key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));
|
if (is_array($val))
|
||||||
|
{
|
||||||
|
$val = array_change_key_case($val, CASE_LOWER);
|
||||||
|
if (isset($val[$http_verb]))
|
||||||
|
{
|
||||||
|
$val = $val[$http_verb];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert wildcards to RegEx
|
||||||
|
$key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key);
|
||||||
|
|
||||||
// Does the RegEx match?
|
// Does the RegEx match?
|
||||||
if (preg_match('#^'.$key.'$#', $uri))
|
if (preg_match('#^'.$key.'$#', $uri, $matches))
|
||||||
{
|
{
|
||||||
// Do we have a back-reference?
|
// Are we using callbacks to process back-references?
|
||||||
if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE)
|
if ( ! is_string($val) && is_callable($val))
|
||||||
|
{
|
||||||
|
// Remove the original string from the matches array.
|
||||||
|
array_shift($matches);
|
||||||
|
|
||||||
|
// Execute the callback using the values in matches as its parameters.
|
||||||
|
$val = call_user_func_array($val, $matches);
|
||||||
|
}
|
||||||
|
// Are we using the default routing method for back-references?
|
||||||
|
elseif (strpos($val, '$') !== FALSE && strpos($key, '(') !== FALSE)
|
||||||
{
|
{
|
||||||
$val = preg_replace('#^'.$key.'$#', $val, $uri);
|
$val = preg_replace('#^'.$key.'$#', $val, $uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->_set_request(explode('/', $val));
|
$this->_set_request(explode('/', $val));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we got this far it means we didn't encounter a
|
// If we got this far it means we didn't encounter a
|
||||||
// matching route so we'll set the site default route
|
// matching route so we'll set the site default route
|
||||||
$this->_set_request($this->uri->segments);
|
$this->_set_request(array_values($this->uri->segments));
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the class name
|
* Set class name
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $class Class name
|
||||||
* @param string
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function set_class($class)
|
public function set_class($class)
|
||||||
{
|
{
|
||||||
$this->class = str_replace(array('/', '.'), '', $class);
|
$this->class = str_replace(array('/', '.'), '', $class);
|
||||||
}
|
}
|
||||||
@ -414,10 +441,10 @@ class CI_Router {
|
|||||||
/**
|
/**
|
||||||
* Fetch the current class
|
* Fetch the current class
|
||||||
*
|
*
|
||||||
* @access public
|
* @deprecated 3.0.0 Read the 'class' property instead
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function fetch_class()
|
public function fetch_class()
|
||||||
{
|
{
|
||||||
return $this->class;
|
return $this->class;
|
||||||
}
|
}
|
||||||
@ -425,13 +452,12 @@ class CI_Router {
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the method name
|
* Set method name
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $method Method name
|
||||||
* @param string
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function set_method($method)
|
public function set_method($method)
|
||||||
{
|
{
|
||||||
$this->method = $method;
|
$this->method = $method;
|
||||||
}
|
}
|
||||||
@ -441,82 +467,49 @@ class CI_Router {
|
|||||||
/**
|
/**
|
||||||
* Fetch the current method
|
* Fetch the current method
|
||||||
*
|
*
|
||||||
* @access public
|
* @deprecated 3.0.0 Read the 'method' property instead
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function fetch_method()
|
public function fetch_method()
|
||||||
{
|
{
|
||||||
if ($this->method == $this->fetch_class())
|
|
||||||
{
|
|
||||||
return 'index';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->method;
|
return $this->method;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the directory name
|
* Set directory name
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $dir Directory name
|
||||||
* @param string
|
* @param bool $append Whether we're appending rather than setting the full value
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function set_directory($dir)
|
public function set_directory($dir, $append = FALSE)
|
||||||
{
|
{
|
||||||
$this->directory = str_replace(array('/', '.'), '', $dir).'/';
|
if ($append !== TRUE OR empty($this->directory))
|
||||||
|
{
|
||||||
|
$this->directory = str_replace('.', '', trim($dir, '/')).'/';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->directory .= str_replace('.', '', trim($dir, '/')).'/';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch the sub-directory (if any) that contains the requested controller class
|
* Fetch directory
|
||||||
*
|
*
|
||||||
* @access public
|
* Feches the sub-directory (if any) that contains the requested
|
||||||
|
* controller class.
|
||||||
|
*
|
||||||
|
* @deprecated 3.0.0 Read the 'directory' property instead
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function fetch_directory()
|
public function fetch_directory()
|
||||||
{
|
{
|
||||||
return $this->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 */
|
|
877
system/core/Security.php
Executable file → Normal file
877
system/core/Security.php
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
663
system/core/URI.php
Executable file → Normal file
663
system/core/URI.php
Executable file → Normal file
@ -1,19 +1,41 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* URI Class
|
* URI Class
|
||||||
@ -23,356 +45,338 @@
|
|||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage Libraries
|
* @subpackage Libraries
|
||||||
* @category URI
|
* @category URI
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/libraries/uri.html
|
* @link https://codeigniter.com/user_guide/libraries/uri.html
|
||||||
*/
|
*/
|
||||||
class CI_URI {
|
class CI_URI {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of cached uri segments
|
* List of cached URI segments
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
* @access public
|
|
||||||
*/
|
*/
|
||||||
var $keyval = array();
|
public $keyval = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Current uri string
|
* Current URI string
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
* @access public
|
|
||||||
*/
|
*/
|
||||||
var $uri_string;
|
public $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
|
* List of URI segments
|
||||||
*
|
*
|
||||||
* Simply globalizes the $RTR object. The front
|
* Starts at 1 instead of 0.
|
||||||
* loads the Router class early on so it's not available
|
|
||||||
* normally as other classes are.
|
|
||||||
*
|
*
|
||||||
* @access public
|
* @var array
|
||||||
*/
|
*/
|
||||||
function __construct()
|
public $segments = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of routed URI segments
|
||||||
|
*
|
||||||
|
* Starts at 1 instead of 0.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public $rsegments = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permitted URI chars
|
||||||
|
*
|
||||||
|
* PCRE character group allowed in URI segments
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $_permitted_uri_chars;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class constructor
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->config =& load_class('Config', 'core');
|
$this->config =& load_class('Config', 'core');
|
||||||
log_message('debug', "URI Class Initialized");
|
|
||||||
|
// If query strings are enabled, we don't need to parse any segments.
|
||||||
|
// However, they don't make sense under CLI.
|
||||||
|
if (is_cli() OR $this->config->item('enable_query_strings') !== TRUE)
|
||||||
|
{
|
||||||
|
$this->_permitted_uri_chars = $this->config->item('permitted_uri_chars');
|
||||||
|
|
||||||
|
// If it's a CLI request, ignore the configuration
|
||||||
|
if (is_cli())
|
||||||
|
{
|
||||||
|
$uri = $this->_parse_argv();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$protocol = $this->config->item('uri_protocol');
|
||||||
|
empty($protocol) && $protocol = 'REQUEST_URI';
|
||||||
|
|
||||||
|
switch ($protocol)
|
||||||
|
{
|
||||||
|
case 'AUTO': // For BC purposes only
|
||||||
|
case 'REQUEST_URI':
|
||||||
|
$uri = $this->_parse_request_uri();
|
||||||
|
break;
|
||||||
|
case 'QUERY_STRING':
|
||||||
|
$uri = $this->_parse_query_string();
|
||||||
|
break;
|
||||||
|
case 'PATH_INFO':
|
||||||
|
default:
|
||||||
|
$uri = isset($_SERVER[$protocol])
|
||||||
|
? $_SERVER[$protocol]
|
||||||
|
: $this->_parse_request_uri();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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);
|
$this->_set_uri_string($uri);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is there a PATH_INFO variable?
|
log_message('info', 'URI Class Initialized');
|
||||||
// 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
|
* Set URI String
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $str
|
||||||
* @param string
|
* @return void
|
||||||
* @return string
|
|
||||||
*/
|
*/
|
||||||
function _set_uri_string($str)
|
protected function _set_uri_string($str)
|
||||||
{
|
{
|
||||||
// Filter out control characters
|
// Filter out control characters and trim slashes
|
||||||
$str = remove_invisible_characters($str, FALSE);
|
$this->uri_string = trim(remove_invisible_characters($str, FALSE), '/');
|
||||||
|
|
||||||
// If the URI contains only a slash we'll kill it
|
if ($this->uri_string !== '')
|
||||||
$this->uri_string = ($str == '/') ? '' : $str;
|
{
|
||||||
|
// Remove the URL suffix, if present
|
||||||
|
if (($suffix = (string) $this->config->item('url_suffix')) !== '')
|
||||||
|
{
|
||||||
|
$slen = strlen($suffix);
|
||||||
|
|
||||||
|
if (substr($this->uri_string, -$slen) === $suffix)
|
||||||
|
{
|
||||||
|
$this->uri_string = substr($this->uri_string, 0, -$slen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->segments[0] = NULL;
|
||||||
|
// Populate the segments array
|
||||||
|
foreach (explode('/', trim($this->uri_string, '/')) as $val)
|
||||||
|
{
|
||||||
|
$val = trim($val);
|
||||||
|
// Filter segments for security
|
||||||
|
$this->filter_uri($val);
|
||||||
|
|
||||||
|
if ($val !== '')
|
||||||
|
{
|
||||||
|
$this->segments[] = $val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unset($this->segments[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detects the URI
|
* Parse REQUEST_URI
|
||||||
*
|
*
|
||||||
* This function will detect the URI automatically and fix the query string
|
* Will parse REQUEST_URI and automatically detect the URI from it,
|
||||||
* if necessary.
|
* while fixing the query string if necessary.
|
||||||
*
|
*
|
||||||
* @access private
|
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
private function _detect_uri()
|
protected function _parse_request_uri()
|
||||||
{
|
{
|
||||||
if ( ! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME']))
|
if ( ! isset($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']))
|
||||||
{
|
{
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$uri = $_SERVER['REQUEST_URI'];
|
// parse_url() returns false if no host is present, but the path or query string
|
||||||
|
// contains a colon followed by a number
|
||||||
|
$uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']);
|
||||||
|
$query = isset($uri['query']) ? $uri['query'] : '';
|
||||||
|
$uri = isset($uri['path']) ? $uri['path'] : '';
|
||||||
|
|
||||||
|
if (isset($_SERVER['SCRIPT_NAME'][0]))
|
||||||
|
{
|
||||||
if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0)
|
if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0)
|
||||||
{
|
{
|
||||||
$uri = substr($uri, strlen($_SERVER['SCRIPT_NAME']));
|
$uri = (string) substr($uri, strlen($_SERVER['SCRIPT_NAME']));
|
||||||
}
|
}
|
||||||
elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0)
|
elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0)
|
||||||
{
|
{
|
||||||
$uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME'])));
|
$uri = (string) 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
|
// 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.
|
// URI is found, and also fixes the QUERY_STRING server var and $_GET array.
|
||||||
if (strncmp($uri, '?/', 2) === 0)
|
if (trim($uri, '/') === '' && strncmp($query, '/', 1) === 0)
|
||||||
{
|
{
|
||||||
$uri = substr($uri, 2);
|
$query = explode('?', $query, 2);
|
||||||
}
|
$uri = $query[0];
|
||||||
$parts = preg_split('#\?#i', $uri, 2);
|
$_SERVER['QUERY_STRING'] = isset($query[1]) ? $query[1] : '';
|
||||||
$uri = $parts[0];
|
|
||||||
if (isset($parts[1]))
|
|
||||||
{
|
|
||||||
$_SERVER['QUERY_STRING'] = $parts[1];
|
|
||||||
parse_str($_SERVER['QUERY_STRING'], $_GET);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$_SERVER['QUERY_STRING'] = '';
|
$_SERVER['QUERY_STRING'] = $query;
|
||||||
$_GET = array();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($uri == '/' || empty($uri))
|
parse_str($_SERVER['QUERY_STRING'], $_GET);
|
||||||
|
|
||||||
|
if ($uri === '/' OR $uri === '')
|
||||||
{
|
{
|
||||||
return '/';
|
return '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
$uri = parse_url($uri, PHP_URL_PATH);
|
|
||||||
|
|
||||||
// Do some final cleaning of the URI and return it
|
// Do some final cleaning of the URI and return it
|
||||||
return str_replace(array('//', '../'), '/', trim($uri, '/'));
|
return $this->_remove_relative_directory($uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse cli arguments
|
* Parse QUERY_STRING
|
||||||
|
*
|
||||||
|
* Will parse QUERY_STRING and automatically detect the URI from it.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function _parse_query_string()
|
||||||
|
{
|
||||||
|
$uri = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');
|
||||||
|
|
||||||
|
if (trim($uri, '/') === '')
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
elseif (strncmp($uri, '/', 1) === 0)
|
||||||
|
{
|
||||||
|
$uri = explode('?', $uri, 2);
|
||||||
|
$_SERVER['QUERY_STRING'] = isset($uri[1]) ? $uri[1] : '';
|
||||||
|
$uri = $uri[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_str($_SERVER['QUERY_STRING'], $_GET);
|
||||||
|
|
||||||
|
return $this->_remove_relative_directory($uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse CLI arguments
|
||||||
*
|
*
|
||||||
* Take each command line argument and assume it is a URI segment.
|
* Take each command line argument and assume it is a URI segment.
|
||||||
*
|
*
|
||||||
* @access private
|
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
private function _parse_cli_args()
|
protected function _parse_argv()
|
||||||
{
|
{
|
||||||
$args = array_slice($_SERVER['argv'], 1);
|
$args = array_slice($_SERVER['argv'], 1);
|
||||||
|
return $args ? implode('/', $args) : '';
|
||||||
return $args ? '/' . implode('/', $args) : '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filter segments for malicious characters
|
* Remove relative directory (../) and multi slashes (///)
|
||||||
*
|
*
|
||||||
* @access private
|
* Do some final cleaning of the URI and return it, currently only used in self::_parse_request_uri()
|
||||||
* @param string
|
*
|
||||||
|
* @param string $uri
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function _filter_uri($str)
|
protected function _remove_relative_directory($uri)
|
||||||
{
|
{
|
||||||
if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
|
$uris = array();
|
||||||
|
$tok = strtok($uri, '/');
|
||||||
|
while ($tok !== FALSE)
|
||||||
{
|
{
|
||||||
// preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards
|
if (( ! empty($tok) OR $tok === '0') && $tok !== '..')
|
||||||
// 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))
|
$uris[] = $tok;
|
||||||
|
}
|
||||||
|
$tok = strtok('/');
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode('/', $uris);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter URI
|
||||||
|
*
|
||||||
|
* Filters segments for malicious characters.
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function filter_uri(&$str)
|
||||||
|
{
|
||||||
|
if ( ! empty($str) && ! empty($this->_permitted_uri_chars) && ! preg_match('/^['.$this->_permitted_uri_chars.']+$/i'.(UTF8_ENABLED ? 'u' : ''), $str))
|
||||||
{
|
{
|
||||||
show_error('The URI you submitted has disallowed characters.', 400);
|
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
|
* Fetch URI Segment
|
||||||
*
|
*
|
||||||
* @access private
|
* @see CI_URI::$segments
|
||||||
* @return void
|
* @param int $n Index
|
||||||
|
* @param mixed $no_result What to return if the segment index is not found
|
||||||
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
function _remove_url_suffix()
|
public function segment($n, $no_result = NULL)
|
||||||
{
|
{
|
||||||
if ($this->config->item('url_suffix') != "")
|
return isset($this->segments[$n]) ? $this->segments[$n] : $no_result;
|
||||||
{
|
|
||||||
$this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Explode the URI Segments. The individual segments will
|
* Fetch URI "routed" Segment
|
||||||
* be stored in the $this->segments array.
|
|
||||||
*
|
*
|
||||||
* @access private
|
* Returns the re-routed URI segment (assuming routing rules are used)
|
||||||
* @return void
|
* based on the index provided. If there is no routing, will return
|
||||||
|
* the same result as CI_URI::segment().
|
||||||
|
*
|
||||||
|
* @see CI_URI::$rsegments
|
||||||
|
* @see CI_URI::segment()
|
||||||
|
* @param int $n Index
|
||||||
|
* @param mixed $no_result What to return if the segment index is not found
|
||||||
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
function _explode_segments()
|
public function rsegment($n, $no_result = NULL)
|
||||||
{
|
{
|
||||||
foreach (explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
|
return isset($this->rsegments[$n]) ? $this->rsegments[$n] : $no_result;
|
||||||
{
|
|
||||||
// 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
|
* URI to assoc
|
||||||
*
|
*
|
||||||
* This function returns the URI segment based on the number provided.
|
* Generates an associative array of URI data starting at the supplied
|
||||||
*
|
* segment index. For example, if this is your URI:
|
||||||
* @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
|
* example.com/user/search/name/joe/location/UK/gender/male
|
||||||
*
|
*
|
||||||
* You can use this function to generate an array with this prototype:
|
* You can use this method to generate an array with this prototype:
|
||||||
*
|
*
|
||||||
* array (
|
* array (
|
||||||
* name => joe
|
* name => joe
|
||||||
@ -380,25 +384,29 @@ class CI_URI {
|
|||||||
* gender => male
|
* gender => male
|
||||||
* )
|
* )
|
||||||
*
|
*
|
||||||
* @access public
|
* @param int $n Index (default: 3)
|
||||||
* @param integer the starting segment number
|
* @param array $default Default values
|
||||||
* @param array an array of default values
|
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
function uri_to_assoc($n = 3, $default = array())
|
public function uri_to_assoc($n = 3, $default = array())
|
||||||
{
|
{
|
||||||
return $this->_uri_to_assoc($n, $default, 'segment');
|
return $this->_uri_to_assoc($n, $default, 'segment');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Identical to above only it uses the re-routed segment array
|
* Routed URI to assoc
|
||||||
*
|
*
|
||||||
* @access public
|
* Identical to CI_URI::uri_to_assoc(), only it uses the re-routed
|
||||||
* @param integer the starting segment number
|
* segment array.
|
||||||
* @param array an array of default values
|
*
|
||||||
|
* @see CI_URI::uri_to_assoc()
|
||||||
|
* @param int $n Index (default: 3)
|
||||||
|
* @param array $default Default values
|
||||||
* @return array
|
* @return array
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
function ruri_to_assoc($n = 3, $default = array())
|
public function ruri_to_assoc($n = 3, $default = array())
|
||||||
{
|
{
|
||||||
return $this->_uri_to_assoc($n, $default, 'rsegment');
|
return $this->_uri_to_assoc($n, $default, 'rsegment');
|
||||||
}
|
}
|
||||||
@ -406,54 +414,40 @@ class CI_URI {
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate a key value pair from the URI string or Re-routed URI string
|
* Internal URI-to-assoc
|
||||||
*
|
*
|
||||||
* @access private
|
* Generates a key/value pair from the URI string or re-routed URI string.
|
||||||
* @param integer the starting segment number
|
*
|
||||||
* @param array an array of default values
|
* @used-by CI_URI::uri_to_assoc()
|
||||||
* @param string which array we should use
|
* @used-by CI_URI::ruri_to_assoc()
|
||||||
|
* @param int $n Index (default: 3)
|
||||||
|
* @param array $default Default values
|
||||||
|
* @param string $which Array name ('segment' or 'rsegment')
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
function _uri_to_assoc($n = 3, $default = array(), $which = 'segment')
|
protected 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))
|
if ( ! is_numeric($n))
|
||||||
{
|
{
|
||||||
return $default;
|
return $default;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($this->keyval[$n]))
|
if (isset($this->keyval[$which], $this->keyval[$which][$n]))
|
||||||
{
|
{
|
||||||
return $this->keyval[$n];
|
return $this->keyval[$which][$n];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$total_segments = "total_{$which}s";
|
||||||
|
$segment_array = "{$which}_array";
|
||||||
|
|
||||||
if ($this->$total_segments() < $n)
|
if ($this->$total_segments() < $n)
|
||||||
{
|
{
|
||||||
if (count($default) == 0)
|
return (count($default) === 0)
|
||||||
{
|
? array()
|
||||||
return array();
|
: array_fill_keys($default, NULL);
|
||||||
}
|
|
||||||
|
|
||||||
$retval = array();
|
|
||||||
foreach ($default as $val)
|
|
||||||
{
|
|
||||||
$retval[$val] = FALSE;
|
|
||||||
}
|
|
||||||
return $retval;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$segments = array_slice($this->$segment_array(), ($n - 1));
|
$segments = array_slice($this->$segment_array(), ($n - 1));
|
||||||
|
|
||||||
$i = 0;
|
$i = 0;
|
||||||
$lastval = '';
|
$lastval = '';
|
||||||
$retval = array();
|
$retval = array();
|
||||||
@ -465,7 +459,7 @@ class CI_URI {
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$retval[$seg] = FALSE;
|
$retval[$seg] = NULL;
|
||||||
$lastval = $seg;
|
$lastval = $seg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -478,27 +472,28 @@ class CI_URI {
|
|||||||
{
|
{
|
||||||
if ( ! array_key_exists($val, $retval))
|
if ( ! array_key_exists($val, $retval))
|
||||||
{
|
{
|
||||||
$retval[$val] = FALSE;
|
$retval[$val] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cache the array for reuse
|
// Cache the array for reuse
|
||||||
$this->keyval[$n] = $retval;
|
isset($this->keyval[$which]) OR $this->keyval[$which] = array();
|
||||||
|
$this->keyval[$which][$n] = $retval;
|
||||||
return $retval;
|
return $retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate a URI string from an associative array
|
* Assoc to URI
|
||||||
*
|
*
|
||||||
|
* Generates a URI string from an associative array.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param array $array Input array of key/value pairs
|
||||||
* @param array an associative array of key/values
|
* @return string URI string
|
||||||
* @return array
|
|
||||||
*/
|
*/
|
||||||
function assoc_to_uri($array)
|
public function assoc_to_uri($array)
|
||||||
{
|
{
|
||||||
$temp = array();
|
$temp = array();
|
||||||
foreach ((array) $array as $key => $val)
|
foreach ((array) $array as $key => $val)
|
||||||
@ -513,14 +508,15 @@ class CI_URI {
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch a URI Segment and add a trailing slash
|
* Slash segment
|
||||||
*
|
*
|
||||||
* @access public
|
* Fetches an URI segment with a slash.
|
||||||
* @param integer
|
*
|
||||||
* @param string
|
* @param int $n Index
|
||||||
|
* @param string $where Where to add the slash ('trailing' or 'leading')
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function slash_segment($n, $where = 'trailing')
|
public function slash_segment($n, $where = 'trailing')
|
||||||
{
|
{
|
||||||
return $this->_slash_segment($n, $where, 'segment');
|
return $this->_slash_segment($n, $where, 'segment');
|
||||||
}
|
}
|
||||||
@ -528,14 +524,15 @@ class CI_URI {
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch a URI Segment and add a trailing slash
|
* Slash routed segment
|
||||||
*
|
*
|
||||||
* @access public
|
* Fetches an URI routed segment with a slash.
|
||||||
* @param integer
|
*
|
||||||
* @param string
|
* @param int $n Index
|
||||||
|
* @param string $where Where to add the slash ('trailing' or 'leading')
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function slash_rsegment($n, $where = 'trailing')
|
public function slash_rsegment($n, $where = 'trailing')
|
||||||
{
|
{
|
||||||
return $this->_slash_segment($n, $where, 'rsegment');
|
return $this->_slash_segment($n, $where, 'rsegment');
|
||||||
}
|
}
|
||||||
@ -543,24 +540,27 @@ class CI_URI {
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch a URI Segment and add a trailing slash - helper function
|
* Internal Slash segment
|
||||||
*
|
*
|
||||||
* @access private
|
* Fetches an URI Segment and adds a slash to it.
|
||||||
* @param integer
|
*
|
||||||
* @param string
|
* @used-by CI_URI::slash_segment()
|
||||||
* @param string
|
* @used-by CI_URI::slash_rsegment()
|
||||||
|
*
|
||||||
|
* @param int $n Index
|
||||||
|
* @param string $where Where to add the slash ('trailing' or 'leading')
|
||||||
|
* @param string $which Array name ('segment' or 'rsegment')
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function _slash_segment($n, $where = 'trailing', $which = 'segment')
|
protected function _slash_segment($n, $where = 'trailing', $which = 'segment')
|
||||||
{
|
{
|
||||||
$leading = '/';
|
$leading = $trailing = '/';
|
||||||
$trailing = '/';
|
|
||||||
|
|
||||||
if ($where == 'trailing')
|
if ($where === 'trailing')
|
||||||
{
|
{
|
||||||
$leading = '';
|
$leading = '';
|
||||||
}
|
}
|
||||||
elseif ($where == 'leading')
|
elseif ($where === 'leading')
|
||||||
{
|
{
|
||||||
$trailing = '';
|
$trailing = '';
|
||||||
}
|
}
|
||||||
@ -573,10 +573,9 @@ class CI_URI {
|
|||||||
/**
|
/**
|
||||||
* Segment Array
|
* Segment Array
|
||||||
*
|
*
|
||||||
* @access public
|
* @return array CI_URI::$segments
|
||||||
* @return array
|
|
||||||
*/
|
*/
|
||||||
function segment_array()
|
public function segment_array()
|
||||||
{
|
{
|
||||||
return $this->segments;
|
return $this->segments;
|
||||||
}
|
}
|
||||||
@ -586,10 +585,9 @@ class CI_URI {
|
|||||||
/**
|
/**
|
||||||
* Routed Segment Array
|
* Routed Segment Array
|
||||||
*
|
*
|
||||||
* @access public
|
* @return array CI_URI::$rsegments
|
||||||
* @return array
|
|
||||||
*/
|
*/
|
||||||
function rsegment_array()
|
public function rsegment_array()
|
||||||
{
|
{
|
||||||
return $this->rsegments;
|
return $this->rsegments;
|
||||||
}
|
}
|
||||||
@ -599,10 +597,9 @@ class CI_URI {
|
|||||||
/**
|
/**
|
||||||
* Total number of segments
|
* Total number of segments
|
||||||
*
|
*
|
||||||
* @access public
|
* @return int
|
||||||
* @return integer
|
|
||||||
*/
|
*/
|
||||||
function total_segments()
|
public function total_segments()
|
||||||
{
|
{
|
||||||
return count($this->segments);
|
return count($this->segments);
|
||||||
}
|
}
|
||||||
@ -612,10 +609,9 @@ class CI_URI {
|
|||||||
/**
|
/**
|
||||||
* Total number of routed segments
|
* Total number of routed segments
|
||||||
*
|
*
|
||||||
* @access public
|
* @return int
|
||||||
* @return integer
|
|
||||||
*/
|
*/
|
||||||
function total_rsegments()
|
public function total_rsegments()
|
||||||
{
|
{
|
||||||
return count($this->rsegments);
|
return count($this->rsegments);
|
||||||
}
|
}
|
||||||
@ -623,32 +619,25 @@ class CI_URI {
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch the entire URI string
|
* Fetch URI string
|
||||||
*
|
*
|
||||||
* @access public
|
* @return string CI_URI::$uri_string
|
||||||
* @return string
|
|
||||||
*/
|
*/
|
||||||
function uri_string()
|
public function uri_string()
|
||||||
{
|
{
|
||||||
return $this->uri_string;
|
return $this->uri_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch the entire Re-routed URI string
|
* Fetch Re-routed URI string
|
||||||
*
|
*
|
||||||
* @access public
|
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function ruri_string()
|
public function ruri_string()
|
||||||
{
|
{
|
||||||
return '/'.implode('/', $this->rsegment_array());
|
return ltrim(load_class('Router', 'core')->directory, '/').implode('/', $this->rsegments);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// END URI Class
|
|
||||||
|
|
||||||
/* End of file URI.php */
|
|
||||||
/* Location: ./system/core/URI.php */
|
|
145
system/core/Utf8.php
Executable file → Normal file
145
system/core/Utf8.php
Executable file → Normal file
@ -1,19 +1,41 @@
|
|||||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
<?php
|
||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.1.6 or newer
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc.
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://codeigniter.com/user_guide/license.html
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 2.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 2.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utf8 Class
|
* Utf8 Class
|
||||||
@ -23,52 +45,36 @@
|
|||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @subpackage Libraries
|
* @subpackage Libraries
|
||||||
* @category UTF-8
|
* @category UTF-8
|
||||||
* @author ExpressionEngine Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/libraries/utf8.html
|
* @link https://codeigniter.com/user_guide/libraries/utf8.html
|
||||||
*/
|
*/
|
||||||
class CI_Utf8 {
|
class CI_Utf8 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Class constructor
|
||||||
*
|
*
|
||||||
* Determines if UTF-8 support is to be enabled
|
* Determines if UTF-8 support is to be enabled.
|
||||||
*
|
*
|
||||||
|
* @return void
|
||||||
*/
|
*/
|
||||||
function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
log_message('debug', "Utf8 Class Initialized");
|
|
||||||
|
|
||||||
global $CFG;
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
preg_match('/./u', 'é') === 1 // PCRE must support UTF-8
|
defined('PREG_BAD_UTF8_ERROR') // PCRE must support UTF-8
|
||||||
AND function_exists('iconv') // iconv must be installed
|
&& (ICONV_ENABLED === TRUE OR MB_ENABLED === TRUE) // iconv or mbstring must be installed
|
||||||
AND ini_get('mbstring.func_overload') != 1 // Multibyte string function overloading cannot be enabled
|
&& strtoupper(config_item('charset')) === 'UTF-8' // Application charset must be UTF-8
|
||||||
AND $CFG->item('charset') == 'UTF-8' // Application charset must be UTF-8
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
log_message('debug', "UTF-8 Support Enabled");
|
|
||||||
|
|
||||||
define('UTF8_ENABLED', TRUE);
|
define('UTF8_ENABLED', TRUE);
|
||||||
|
log_message('debug', 'UTF-8 Support Enabled');
|
||||||
// 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
|
else
|
||||||
{
|
{
|
||||||
define('MB_ENABLED', FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log_message('debug', "UTF-8 Support Disabled");
|
|
||||||
define('UTF8_ENABLED', FALSE);
|
define('UTF8_ENABLED', FALSE);
|
||||||
|
log_message('debug', 'UTF-8 Support Disabled');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_message('info', 'Utf8 Class Initialized');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -76,18 +82,24 @@ class CI_Utf8 {
|
|||||||
/**
|
/**
|
||||||
* Clean UTF-8 strings
|
* Clean UTF-8 strings
|
||||||
*
|
*
|
||||||
* Ensures strings are UTF-8
|
* Ensures strings contain only valid UTF-8 characters.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $str String to clean
|
||||||
* @param string
|
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function clean_string($str)
|
public function clean_string($str)
|
||||||
{
|
{
|
||||||
if ($this->_is_ascii($str) === FALSE)
|
if ($this->is_ascii($str) === FALSE)
|
||||||
|
{
|
||||||
|
if (MB_ENABLED)
|
||||||
|
{
|
||||||
|
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
|
||||||
|
}
|
||||||
|
elseif (ICONV_ENABLED)
|
||||||
{
|
{
|
||||||
$str = @iconv('UTF-8', 'UTF-8//IGNORE', $str);
|
$str = @iconv('UTF-8', 'UTF-8//IGNORE', $str);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $str;
|
return $str;
|
||||||
}
|
}
|
||||||
@ -99,13 +111,12 @@ class CI_Utf8 {
|
|||||||
*
|
*
|
||||||
* Removes all ASCII control characters except horizontal tabs,
|
* Removes all ASCII control characters except horizontal tabs,
|
||||||
* line feeds, and carriage returns, as all others can cause
|
* line feeds, and carriage returns, as all others can cause
|
||||||
* problems in XML
|
* problems in XML.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $str String to clean
|
||||||
* @param string
|
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function safe_ascii_for_xml($str)
|
public function safe_ascii_for_xml($str)
|
||||||
{
|
{
|
||||||
return remove_invisible_characters($str, FALSE);
|
return remove_invisible_characters($str, FALSE);
|
||||||
}
|
}
|
||||||
@ -115,29 +126,24 @@ class CI_Utf8 {
|
|||||||
/**
|
/**
|
||||||
* Convert to UTF-8
|
* Convert to UTF-8
|
||||||
*
|
*
|
||||||
* Attempts to convert a string to UTF-8
|
* Attempts to convert a string to UTF-8.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $str Input string
|
||||||
* @param string
|
* @param string $encoding Input encoding
|
||||||
* @param string - input encoding
|
* @return string $str encoded in UTF-8 or FALSE on failure
|
||||||
* @return string
|
|
||||||
*/
|
*/
|
||||||
function convert_to_utf8($str, $encoding)
|
public function convert_to_utf8($str, $encoding)
|
||||||
{
|
{
|
||||||
if (function_exists('iconv'))
|
if (MB_ENABLED)
|
||||||
{
|
{
|
||||||
$str = @iconv($encoding, 'UTF-8', $str);
|
return mb_convert_encoding($str, 'UTF-8', $encoding);
|
||||||
}
|
}
|
||||||
elseif (function_exists('mb_convert_encoding'))
|
elseif (ICONV_ENABLED)
|
||||||
{
|
{
|
||||||
$str = @mb_convert_encoding($str, 'UTF-8', $encoding);
|
return @iconv($encoding, 'UTF-8', $str);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $str;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -145,21 +151,14 @@ class CI_Utf8 {
|
|||||||
/**
|
/**
|
||||||
* Is ASCII?
|
* Is ASCII?
|
||||||
*
|
*
|
||||||
* Tests if a string is standard 7-bit ASCII or not
|
* Tests if a string is standard 7-bit ASCII or not.
|
||||||
*
|
*
|
||||||
* @access public
|
* @param string $str String to check
|
||||||
* @param string
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
function _is_ascii($str)
|
public function is_ascii($str)
|
||||||
{
|
{
|
||||||
return (preg_match('/[^\x00-\x7F]/S', $str) == 0);
|
return (preg_match('/[^\x00-\x7F]/S', $str) === 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
|
|
||||||
}
|
}
|
||||||
// End Utf8 Class
|
|
||||||
|
|
||||||
/* End of file Utf8.php */
|
|
||||||
/* Location: ./system/core/Utf8.php */
|
|
254
system/core/compat/hash.php
Normal file
254
system/core/compat/hash.php
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author EllisLab Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 3.0.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHP ext/hash compatibility package
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage CodeIgniter
|
||||||
|
* @category Compatibility
|
||||||
|
* @author Andrey Andreev
|
||||||
|
* @link https://codeigniter.com/user_guide/
|
||||||
|
* @link http://php.net/hash
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (is_php('5.6'))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('hash_equals'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* hash_equals()
|
||||||
|
*
|
||||||
|
* @link http://php.net/hash_equals
|
||||||
|
* @param string $known_string
|
||||||
|
* @param string $user_string
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function hash_equals($known_string, $user_string)
|
||||||
|
{
|
||||||
|
if ( ! is_string($known_string))
|
||||||
|
{
|
||||||
|
trigger_error('hash_equals(): Expected known_string to be a string, '.strtolower(gettype($known_string)).' given', E_USER_WARNING);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
elseif ( ! is_string($user_string))
|
||||||
|
{
|
||||||
|
trigger_error('hash_equals(): Expected user_string to be a string, '.strtolower(gettype($user_string)).' given', E_USER_WARNING);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
elseif (($length = strlen($known_string)) !== strlen($user_string))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$diff = 0;
|
||||||
|
for ($i = 0; $i < $length; $i++)
|
||||||
|
{
|
||||||
|
$diff |= ord($known_string[$i]) ^ ord($user_string[$i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($diff === 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (is_php('5.5'))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('hash_pbkdf2'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* hash_pbkdf2()
|
||||||
|
*
|
||||||
|
* @link http://php.net/hash_pbkdf2
|
||||||
|
* @param string $algo
|
||||||
|
* @param string $password
|
||||||
|
* @param string $salt
|
||||||
|
* @param int $iterations
|
||||||
|
* @param int $length
|
||||||
|
* @param bool $raw_output
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function hash_pbkdf2($algo, $password, $salt, $iterations, $length = 0, $raw_output = FALSE)
|
||||||
|
{
|
||||||
|
if ( ! in_array(strtolower($algo), hash_algos(), TRUE))
|
||||||
|
{
|
||||||
|
trigger_error('hash_pbkdf2(): Unknown hashing algorithm: '.$algo, E_USER_WARNING);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($type = gettype($iterations)) !== 'integer')
|
||||||
|
{
|
||||||
|
if ($type === 'object' && method_exists($iterations, '__toString'))
|
||||||
|
{
|
||||||
|
$iterations = (string) $iterations;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_string($iterations) && is_numeric($iterations))
|
||||||
|
{
|
||||||
|
$iterations = (int) $iterations;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
trigger_error('hash_pbkdf2() expects parameter 4 to be long, '.$type.' given', E_USER_WARNING);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($iterations < 1)
|
||||||
|
{
|
||||||
|
trigger_error('hash_pbkdf2(): Iterations must be a positive integer: '.$iterations, E_USER_WARNING);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($type = gettype($length)) !== 'integer')
|
||||||
|
{
|
||||||
|
if ($type === 'object' && method_exists($length, '__toString'))
|
||||||
|
{
|
||||||
|
$length = (string) $length;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_string($length) && is_numeric($length))
|
||||||
|
{
|
||||||
|
$length = (int) $length;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
trigger_error('hash_pbkdf2() expects parameter 5 to be long, '.$type.' given', E_USER_WARNING);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($length < 0)
|
||||||
|
{
|
||||||
|
trigger_error('hash_pbkdf2(): Length must be greater than or equal to 0: '.$length, E_USER_WARNING);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$hash_length = defined('MB_OVERLOAD_STRING')
|
||||||
|
? mb_strlen(hash($algo, NULL, TRUE), '8bit')
|
||||||
|
: strlen(hash($algo, NULL, TRUE));
|
||||||
|
empty($length) && $length = $hash_length;
|
||||||
|
|
||||||
|
// Pre-hash password inputs longer than the algorithm's block size
|
||||||
|
// (i.e. prepare HMAC key) to mitigate potential DoS attacks.
|
||||||
|
static $block_sizes;
|
||||||
|
empty($block_sizes) && $block_sizes = array(
|
||||||
|
'gost' => 32,
|
||||||
|
'haval128,3' => 128,
|
||||||
|
'haval160,3' => 128,
|
||||||
|
'haval192,3' => 128,
|
||||||
|
'haval224,3' => 128,
|
||||||
|
'haval256,3' => 128,
|
||||||
|
'haval128,4' => 128,
|
||||||
|
'haval160,4' => 128,
|
||||||
|
'haval192,4' => 128,
|
||||||
|
'haval224,4' => 128,
|
||||||
|
'haval256,4' => 128,
|
||||||
|
'haval128,5' => 128,
|
||||||
|
'haval160,5' => 128,
|
||||||
|
'haval192,5' => 128,
|
||||||
|
'haval224,5' => 128,
|
||||||
|
'haval256,5' => 128,
|
||||||
|
'md2' => 16,
|
||||||
|
'md4' => 64,
|
||||||
|
'md5' => 64,
|
||||||
|
'ripemd128' => 64,
|
||||||
|
'ripemd160' => 64,
|
||||||
|
'ripemd256' => 64,
|
||||||
|
'ripemd320' => 64,
|
||||||
|
'salsa10' => 64,
|
||||||
|
'salsa20' => 64,
|
||||||
|
'sha1' => 64,
|
||||||
|
'sha224' => 64,
|
||||||
|
'sha256' => 64,
|
||||||
|
'sha384' => 128,
|
||||||
|
'sha512' => 128,
|
||||||
|
'snefru' => 32,
|
||||||
|
'snefru256' => 32,
|
||||||
|
'tiger128,3' => 64,
|
||||||
|
'tiger160,3' => 64,
|
||||||
|
'tiger192,3' => 64,
|
||||||
|
'tiger128,4' => 64,
|
||||||
|
'tiger160,4' => 64,
|
||||||
|
'tiger192,4' => 64,
|
||||||
|
'whirlpool' => 64
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isset($block_sizes[$algo], $password[$block_sizes[$algo]]))
|
||||||
|
{
|
||||||
|
$password = hash($algo, $password, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
$hash = '';
|
||||||
|
// Note: Blocks are NOT 0-indexed
|
||||||
|
for ($bc = (int) ceil($length / $hash_length), $bi = 1; $bi <= $bc; $bi++)
|
||||||
|
{
|
||||||
|
$key = $derived_key = hash_hmac($algo, $salt.pack('N', $bi), $password, TRUE);
|
||||||
|
for ($i = 1; $i < $iterations; $i++)
|
||||||
|
{
|
||||||
|
$derived_key ^= $key = hash_hmac($algo, $key, $password, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
$hash .= $derived_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is not RFC-compatible, but we're aiming for natural PHP compatibility
|
||||||
|
if ( ! $raw_output)
|
||||||
|
{
|
||||||
|
$hash = bin2hex($hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
return defined('MB_OVERLOAD_STRING')
|
||||||
|
? mb_substr($hash, 0, $length, '8bit')
|
||||||
|
: substr($hash, 0, $length);
|
||||||
|
}
|
||||||
|
}
|
1
system/libraries/javascript/index.html → system/core/compat/index.html
Executable file → Normal file
1
system/libraries/javascript/index.html → system/core/compat/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
149
system/core/compat/mbstring.php
Normal file
149
system/core/compat/mbstring.php
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author EllisLab Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 3.0.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHP ext/mbstring compatibility package
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage CodeIgniter
|
||||||
|
* @category Compatibility
|
||||||
|
* @author Andrey Andreev
|
||||||
|
* @link https://codeigniter.com/user_guide/
|
||||||
|
* @link http://php.net/mbstring
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (MB_ENABLED === TRUE)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('mb_strlen'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* mb_strlen()
|
||||||
|
*
|
||||||
|
* WARNING: This function WILL fall-back to strlen()
|
||||||
|
* if iconv is not available!
|
||||||
|
*
|
||||||
|
* @link http://php.net/mb_strlen
|
||||||
|
* @param string $str
|
||||||
|
* @param string $encoding
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
function mb_strlen($str, $encoding = NULL)
|
||||||
|
{
|
||||||
|
if (ICONV_ENABLED === TRUE)
|
||||||
|
{
|
||||||
|
return iconv_strlen($str, isset($encoding) ? $encoding : config_item('charset'));
|
||||||
|
}
|
||||||
|
|
||||||
|
log_message('debug', 'Compatibility (mbstring): iconv_strlen() is not available, falling back to strlen().');
|
||||||
|
return strlen($str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('mb_strpos'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* mb_strpos()
|
||||||
|
*
|
||||||
|
* WARNING: This function WILL fall-back to strpos()
|
||||||
|
* if iconv is not available!
|
||||||
|
*
|
||||||
|
* @link http://php.net/mb_strpos
|
||||||
|
* @param string $haystack
|
||||||
|
* @param string $needle
|
||||||
|
* @param int $offset
|
||||||
|
* @param string $encoding
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function mb_strpos($haystack, $needle, $offset = 0, $encoding = NULL)
|
||||||
|
{
|
||||||
|
if (ICONV_ENABLED === TRUE)
|
||||||
|
{
|
||||||
|
return iconv_strpos($haystack, $needle, $offset, isset($encoding) ? $encoding : config_item('charset'));
|
||||||
|
}
|
||||||
|
|
||||||
|
log_message('debug', 'Compatibility (mbstring): iconv_strpos() is not available, falling back to strpos().');
|
||||||
|
return strpos($haystack, $needle, $offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('mb_substr'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* mb_substr()
|
||||||
|
*
|
||||||
|
* WARNING: This function WILL fall-back to substr()
|
||||||
|
* if iconv is not available.
|
||||||
|
*
|
||||||
|
* @link http://php.net/mb_substr
|
||||||
|
* @param string $str
|
||||||
|
* @param int $start
|
||||||
|
* @param int $length
|
||||||
|
* @param string $encoding
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function mb_substr($str, $start, $length = NULL, $encoding = NULL)
|
||||||
|
{
|
||||||
|
if (ICONV_ENABLED === TRUE)
|
||||||
|
{
|
||||||
|
isset($encoding) OR $encoding = config_item('charset');
|
||||||
|
return iconv_substr(
|
||||||
|
$str,
|
||||||
|
$start,
|
||||||
|
isset($length) ? $length : iconv_strlen($str, $encoding), // NULL doesn't work
|
||||||
|
$encoding
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_message('debug', 'Compatibility (mbstring): iconv_substr() is not available, falling back to substr().');
|
||||||
|
return isset($length)
|
||||||
|
? substr($str, $start, $length)
|
||||||
|
: substr($str, $start);
|
||||||
|
}
|
||||||
|
}
|
251
system/core/compat/password.php
Normal file
251
system/core/compat/password.php
Normal file
@ -0,0 +1,251 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author EllisLab Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 3.0.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHP ext/standard/password compatibility package
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage CodeIgniter
|
||||||
|
* @category Compatibility
|
||||||
|
* @author Andrey Andreev
|
||||||
|
* @link https://codeigniter.com/user_guide/
|
||||||
|
* @link http://php.net/password
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (is_php('5.5') OR ! defined('CRYPT_BLOWFISH') OR CRYPT_BLOWFISH !== 1 OR defined('HHVM_VERSION'))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
defined('PASSWORD_BCRYPT') OR define('PASSWORD_BCRYPT', 1);
|
||||||
|
defined('PASSWORD_DEFAULT') OR define('PASSWORD_DEFAULT', PASSWORD_BCRYPT);
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('password_get_info'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* password_get_info()
|
||||||
|
*
|
||||||
|
* @link http://php.net/password_get_info
|
||||||
|
* @param string $hash
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function password_get_info($hash)
|
||||||
|
{
|
||||||
|
return (strlen($hash) < 60 OR sscanf($hash, '$2y$%d', $hash) !== 1)
|
||||||
|
? array('algo' => 0, 'algoName' => 'unknown', 'options' => array())
|
||||||
|
: array('algo' => 1, 'algoName' => 'bcrypt', 'options' => array('cost' => $hash));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('password_hash'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* password_hash()
|
||||||
|
*
|
||||||
|
* @link http://php.net/password_hash
|
||||||
|
* @param string $password
|
||||||
|
* @param int $algo
|
||||||
|
* @param array $options
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function password_hash($password, $algo, array $options = array())
|
||||||
|
{
|
||||||
|
static $func_overload;
|
||||||
|
isset($func_overload) OR $func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload'));
|
||||||
|
|
||||||
|
if ($algo !== 1)
|
||||||
|
{
|
||||||
|
trigger_error('password_hash(): Unknown hashing algorithm: '.(int) $algo, E_USER_WARNING);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($options['cost']) && ($options['cost'] < 4 OR $options['cost'] > 31))
|
||||||
|
{
|
||||||
|
trigger_error('password_hash(): Invalid bcrypt cost parameter specified: '.(int) $options['cost'], E_USER_WARNING);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($options['salt']) && ($saltlen = ($func_overload ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))) < 22)
|
||||||
|
{
|
||||||
|
trigger_error('password_hash(): Provided salt is too short: '.$saltlen.' expecting 22', E_USER_WARNING);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
elseif ( ! isset($options['salt']))
|
||||||
|
{
|
||||||
|
if (function_exists('random_bytes'))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$options['salt'] = random_bytes(16);
|
||||||
|
}
|
||||||
|
catch (Exception $e)
|
||||||
|
{
|
||||||
|
log_message('error', 'compat/password: Error while trying to use random_bytes(): '.$e->getMessage());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif (defined('MCRYPT_DEV_URANDOM'))
|
||||||
|
{
|
||||||
|
$options['salt'] = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
|
||||||
|
}
|
||||||
|
elseif (DIRECTORY_SEPARATOR === '/' && (is_readable($dev = '/dev/arandom') OR is_readable($dev = '/dev/urandom')))
|
||||||
|
{
|
||||||
|
if (($fp = fopen($dev, 'rb')) === FALSE)
|
||||||
|
{
|
||||||
|
log_message('error', 'compat/password: Unable to open '.$dev.' for reading.');
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try not to waste entropy ...
|
||||||
|
is_php('5.4') && stream_set_chunk_size($fp, 16);
|
||||||
|
|
||||||
|
$options['salt'] = '';
|
||||||
|
for ($read = 0; $read < 16; $read = ($func_overload) ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))
|
||||||
|
{
|
||||||
|
if (($read = fread($fp, 16 - $read)) === FALSE)
|
||||||
|
{
|
||||||
|
log_message('error', 'compat/password: Error while reading from '.$dev.'.');
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
$options['salt'] .= $read;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose($fp);
|
||||||
|
}
|
||||||
|
elseif (function_exists('openssl_random_pseudo_bytes'))
|
||||||
|
{
|
||||||
|
$is_secure = NULL;
|
||||||
|
$options['salt'] = openssl_random_pseudo_bytes(16, $is_secure);
|
||||||
|
if ($is_secure !== TRUE)
|
||||||
|
{
|
||||||
|
log_message('error', 'compat/password: openssl_random_pseudo_bytes() set the $cryto_strong flag to FALSE');
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log_message('error', 'compat/password: No CSPRNG available.');
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '='));
|
||||||
|
}
|
||||||
|
elseif ( ! preg_match('#^[a-zA-Z0-9./]+$#D', $options['salt']))
|
||||||
|
{
|
||||||
|
$options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '='));
|
||||||
|
}
|
||||||
|
|
||||||
|
isset($options['cost']) OR $options['cost'] = 10;
|
||||||
|
|
||||||
|
return (strlen($password = crypt($password, sprintf('$2y$%02d$%s', $options['cost'], $options['salt']))) === 60)
|
||||||
|
? $password
|
||||||
|
: FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('password_needs_rehash'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* password_needs_rehash()
|
||||||
|
*
|
||||||
|
* @link http://php.net/password_needs_rehash
|
||||||
|
* @param string $hash
|
||||||
|
* @param int $algo
|
||||||
|
* @param array $options
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function password_needs_rehash($hash, $algo, array $options = array())
|
||||||
|
{
|
||||||
|
$info = password_get_info($hash);
|
||||||
|
|
||||||
|
if ($algo !== $info['algo'])
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
elseif ($algo === 1)
|
||||||
|
{
|
||||||
|
$options['cost'] = isset($options['cost']) ? (int) $options['cost'] : 10;
|
||||||
|
return ($info['options']['cost'] !== $options['cost']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Odd at first glance, but according to a comment in PHP's own unit tests,
|
||||||
|
// because it is an unknown algorithm - it's valid and therefore doesn't
|
||||||
|
// need rehashing.
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('password_verify'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* password_verify()
|
||||||
|
*
|
||||||
|
* @link http://php.net/password_verify
|
||||||
|
* @param string $password
|
||||||
|
* @param string $hash
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function password_verify($password, $hash)
|
||||||
|
{
|
||||||
|
if (strlen($hash) !== 60 OR strlen($password = crypt($password, $hash)) !== 60)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$compare = 0;
|
||||||
|
for ($i = 0; $i < 60; $i++)
|
||||||
|
{
|
||||||
|
$compare |= (ord($password[$i]) ^ ord($hash[$i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($compare === 0);
|
||||||
|
}
|
||||||
|
}
|
182
system/core/compat/standard.php
Normal file
182
system/core/compat/standard.php
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CodeIgniter
|
||||||
|
*
|
||||||
|
* An open source application development framework for PHP
|
||||||
|
*
|
||||||
|
* This content is released under the MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @author EllisLab Dev Team
|
||||||
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 3.0.0
|
||||||
|
* @filesource
|
||||||
|
*/
|
||||||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHP ext/standard compatibility package
|
||||||
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage CodeIgniter
|
||||||
|
* @category Compatibility
|
||||||
|
* @author Andrey Andreev
|
||||||
|
* @link https://codeigniter.com/user_guide/
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (is_php('5.5'))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('array_column'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* array_column()
|
||||||
|
*
|
||||||
|
* @link http://php.net/array_column
|
||||||
|
* @param array $array
|
||||||
|
* @param mixed $column_key
|
||||||
|
* @param mixed $index_key
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function array_column(array $array, $column_key, $index_key = NULL)
|
||||||
|
{
|
||||||
|
if ( ! in_array($type = gettype($column_key), array('integer', 'string', 'NULL'), TRUE))
|
||||||
|
{
|
||||||
|
if ($type === 'double')
|
||||||
|
{
|
||||||
|
$column_key = (int) $column_key;
|
||||||
|
}
|
||||||
|
elseif ($type === 'object' && method_exists($column_key, '__toString'))
|
||||||
|
{
|
||||||
|
$column_key = (string) $column_key;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
trigger_error('array_column(): The column key should be either a string or an integer', E_USER_WARNING);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! in_array($type = gettype($index_key), array('integer', 'string', 'NULL'), TRUE))
|
||||||
|
{
|
||||||
|
if ($type === 'double')
|
||||||
|
{
|
||||||
|
$index_key = (int) $index_key;
|
||||||
|
}
|
||||||
|
elseif ($type === 'object' && method_exists($index_key, '__toString'))
|
||||||
|
{
|
||||||
|
$index_key = (string) $index_key;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
trigger_error('array_column(): The index key should be either a string or an integer', E_USER_WARNING);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = array();
|
||||||
|
foreach ($array as &$a)
|
||||||
|
{
|
||||||
|
if ($column_key === NULL)
|
||||||
|
{
|
||||||
|
$value = $a;
|
||||||
|
}
|
||||||
|
elseif (is_array($a) && array_key_exists($column_key, $a))
|
||||||
|
{
|
||||||
|
$value = $a[$column_key];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($index_key === NULL OR ! array_key_exists($index_key, $a))
|
||||||
|
{
|
||||||
|
$result[] = $value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$result[$a[$index_key]] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (is_php('5.4'))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if ( ! function_exists('hex2bin'))
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* hex2bin()
|
||||||
|
*
|
||||||
|
* @link http://php.net/hex2bin
|
||||||
|
* @param string $data
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function hex2bin($data)
|
||||||
|
{
|
||||||
|
if (in_array($type = gettype($data), array('array', 'double', 'object', 'resource'), TRUE))
|
||||||
|
{
|
||||||
|
if ($type === 'object' && method_exists($data, '__toString'))
|
||||||
|
{
|
||||||
|
$data = (string) $data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
trigger_error('hex2bin() expects parameter 1 to be string, '.$type.' given', E_USER_WARNING);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen($data) % 2 !== 0)
|
||||||
|
{
|
||||||
|
trigger_error('Hexadecimal input string must have an even length', E_USER_WARNING);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
elseif ( ! preg_match('/^[0-9a-f]*$/i', $data))
|
||||||
|
{
|
||||||
|
trigger_error('Input string must be hexadecimal string', E_USER_WARNING);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pack('H*', $data);
|
||||||
|
}
|
||||||
|
}
|
1
system/core/index.html
Executable file → Normal file
1
system/core/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
||||||
|
57
system/database/DB.php
Executable file → Normal file
57
system/database/DB.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*
|
*
|
||||||
* @param string|string[] $params
|
* @param string|string[] $params
|
||||||
* @param bool $query_builder_override
|
* @param bool $query_builder_override
|
||||||
@ -50,7 +61,11 @@ function &DB($params = '', $query_builder_override = NULL)
|
|||||||
}
|
}
|
||||||
|
|
||||||
include($file_path);
|
include($file_path);
|
||||||
// Make packages contain database config files
|
|
||||||
|
// Make packages contain database config files,
|
||||||
|
// given that the controller instance already exists
|
||||||
|
if (class_exists('CI_Controller', FALSE))
|
||||||
|
{
|
||||||
foreach (get_instance()->load->get_package_paths() as $path)
|
foreach (get_instance()->load->get_package_paths() as $path)
|
||||||
{
|
{
|
||||||
if ($path !== APPPATH)
|
if ($path !== APPPATH)
|
||||||
@ -65,6 +80,7 @@ function &DB($params = '', $query_builder_override = NULL)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ( ! isset($db) OR count($db) === 0)
|
if ( ! isset($db) OR count($db) === 0)
|
||||||
{
|
{
|
||||||
@ -119,7 +135,7 @@ function &DB($params = '', $query_builder_override = NULL)
|
|||||||
{
|
{
|
||||||
if (is_string($val) && in_array(strtoupper($val), array('TRUE', 'FALSE', 'NULL')))
|
if (is_string($val) && in_array(strtoupper($val), array('TRUE', 'FALSE', 'NULL')))
|
||||||
{
|
{
|
||||||
$val = var_export($val);
|
$val = var_export($val, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
$params[$key] = $val;
|
$params[$key] = $val;
|
||||||
@ -197,13 +213,6 @@ function &DB($params = '', $query_builder_override = NULL)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($DB->autoinit === TRUE)
|
|
||||||
{
|
|
||||||
$DB->initialize();
|
$DB->initialize();
|
||||||
}
|
|
||||||
|
|
||||||
return $DB;
|
return $DB;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file DB.php */
|
|
||||||
/* Location: ./system/database/DB.php */
|
|
55
system/database/DB_cache.php
Executable file → Normal file
55
system/database/DB_cache.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_Cache {
|
class CI_DB_Cache {
|
||||||
|
|
||||||
@ -132,7 +143,7 @@ class CI_DB_Cache {
|
|||||||
$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
|
$segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
|
||||||
$filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql);
|
$filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql);
|
||||||
|
|
||||||
if (FALSE === ($cachedata = @file_get_contents($filepath)))
|
if ( ! is_file($filepath) OR FALSE === ($cachedata = file_get_contents($filepath)))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -156,22 +167,17 @@ class CI_DB_Cache {
|
|||||||
$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';
|
$dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';
|
||||||
$filename = md5($sql);
|
$filename = md5($sql);
|
||||||
|
|
||||||
if ( ! is_dir($dir_path))
|
if ( ! is_dir($dir_path) && ! @mkdir($dir_path, 0750))
|
||||||
{
|
|
||||||
if ( ! @mkdir($dir_path, 0777))
|
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@chmod($dir_path, 0777);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (write_file($dir_path.$filename, serialize($object)) === FALSE)
|
if (write_file($dir_path.$filename, serialize($object)) === FALSE)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@chmod($dir_path.$filename, 0666);
|
chmod($dir_path.$filename, 0640);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,6 +219,3 @@ class CI_DB_Cache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file DB_cache.php */
|
|
||||||
/* Location: ./system/database/DB_cache.php */
|
|
331
system/database/DB_driver.php
Executable file → Normal file
331
system/database/DB_driver.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -37,7 +48,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
abstract class CI_DB_driver {
|
abstract class CI_DB_driver {
|
||||||
|
|
||||||
@ -112,15 +123,6 @@ abstract class CI_DB_driver {
|
|||||||
*/
|
*/
|
||||||
public $dbcollat = 'utf8_general_ci';
|
public $dbcollat = 'utf8_general_ci';
|
||||||
|
|
||||||
/**
|
|
||||||
* Auto-init flag
|
|
||||||
*
|
|
||||||
* Whether to automatically initialize the DB connection.
|
|
||||||
*
|
|
||||||
* @var bool
|
|
||||||
*/
|
|
||||||
public $autoinit = TRUE;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encryption flag/data
|
* Encryption flag/data
|
||||||
*
|
*
|
||||||
@ -140,7 +142,7 @@ abstract class CI_DB_driver {
|
|||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
public $port = '';
|
public $port = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Persistent connection flag
|
* Persistent connection flag
|
||||||
@ -370,7 +372,7 @@ abstract class CI_DB_driver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log_message('debug', 'Database Driver Class Initialized');
|
log_message('info', 'Database Driver Class Initialized');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -444,10 +446,24 @@ abstract class CI_DB_driver {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DB connect
|
||||||
|
*
|
||||||
|
* This is just a dummy method that all drivers will override.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function db_connect()
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Persistent database connection
|
* Persistent database connection
|
||||||
*
|
*
|
||||||
* @return resource
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function db_pconnect()
|
public function db_pconnect()
|
||||||
{
|
{
|
||||||
@ -488,6 +504,18 @@ abstract class CI_DB_driver {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last error
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function error()
|
||||||
|
{
|
||||||
|
return array('code' => NULL, 'message' => NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set client character set
|
* Set client character set
|
||||||
*
|
*
|
||||||
@ -631,7 +659,10 @@ abstract class CI_DB_driver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// This will trigger a rollback if transactions are being used
|
// This will trigger a rollback if transactions are being used
|
||||||
|
if ($this->_trans_depth !== 0)
|
||||||
|
{
|
||||||
$this->_trans_status = FALSE;
|
$this->_trans_status = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
// Grab the error now, as we might run some additional queries before displaying the error
|
// Grab the error now, as we might run some additional queries before displaying the error
|
||||||
$error = $this->error();
|
$error = $this->error();
|
||||||
@ -645,13 +676,15 @@ abstract class CI_DB_driver {
|
|||||||
// if transactions are enabled. If we don't call this here
|
// if transactions are enabled. If we don't call this here
|
||||||
// the error message will trigger an exit, causing the
|
// the error message will trigger an exit, causing the
|
||||||
// transactions to remain in limbo.
|
// transactions to remain in limbo.
|
||||||
if ($this->_trans_depth !== 0)
|
while ($this->_trans_depth !== 0)
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
{
|
||||||
|
$trans_depth = $this->_trans_depth;
|
||||||
$this->trans_complete();
|
$this->trans_complete();
|
||||||
|
if ($trans_depth === $this->_trans_depth)
|
||||||
|
{
|
||||||
|
log_message('error', 'Database: Failure during an automated transaction commit/rollback!');
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
while ($this->_trans_depth !== 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display errors
|
// Display errors
|
||||||
@ -749,7 +782,10 @@ abstract class CI_DB_driver {
|
|||||||
{
|
{
|
||||||
if ( ! $this->conn_id)
|
if ( ! $this->conn_id)
|
||||||
{
|
{
|
||||||
$this->initialize();
|
if ( ! $this->initialize())
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->_execute($sql);
|
return $this->_execute($sql);
|
||||||
@ -772,10 +808,13 @@ abstract class CI_DB_driver {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable/disable Transaction Strict Mode
|
* Enable/disable Transaction Strict Mode
|
||||||
|
*
|
||||||
* When strict mode is enabled, if you are running multiple groups of
|
* When strict mode is enabled, if you are running multiple groups of
|
||||||
* transactions, if one group fails all groups will be rolled back.
|
* transactions, if one group fails all subsequent groups will be
|
||||||
* If strict mode is disabled, each group is treated autonomously, meaning
|
* rolled back.
|
||||||
* a failure of one group will not affect any others
|
*
|
||||||
|
* If strict mode is disabled, each group is treated autonomously,
|
||||||
|
* meaning a failure of one group will not affect any others
|
||||||
*
|
*
|
||||||
* @param bool $mode = TRUE
|
* @param bool $mode = TRUE
|
||||||
* @return void
|
* @return void
|
||||||
@ -791,7 +830,7 @@ abstract class CI_DB_driver {
|
|||||||
* Start Transaction
|
* Start Transaction
|
||||||
*
|
*
|
||||||
* @param bool $test_mode = FALSE
|
* @param bool $test_mode = FALSE
|
||||||
* @return void
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_start($test_mode = FALSE)
|
public function trans_start($test_mode = FALSE)
|
||||||
{
|
{
|
||||||
@ -800,15 +839,7 @@ abstract class CI_DB_driver {
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
return $this->trans_begin($test_mode);
|
||||||
if ($this->_trans_depth > 0)
|
|
||||||
{
|
|
||||||
$this->_trans_depth += 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->trans_begin($test_mode);
|
|
||||||
$this->_trans_depth += 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -825,25 +856,14 @@ abstract class CI_DB_driver {
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ($this->_trans_depth > 1)
|
|
||||||
{
|
|
||||||
$this->_trans_depth -= 1;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$this->_trans_depth = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The query() function will set this flag to FALSE in the event that a query failed
|
// The query() function will set this flag to FALSE in the event that a query failed
|
||||||
if ($this->_trans_status === FALSE OR $this->_trans_failure === TRUE)
|
if ($this->_trans_status === FALSE OR $this->_trans_failure === TRUE)
|
||||||
{
|
{
|
||||||
$this->trans_rollback();
|
$this->trans_rollback();
|
||||||
|
|
||||||
// If we are NOT running in strict mode, we will reset
|
// If we are NOT running in strict mode, we will reset
|
||||||
// the _trans_status flag so that subsequent groups of transactions
|
// the _trans_status flag so that subsequent groups of
|
||||||
// will be permitted.
|
// transactions will be permitted.
|
||||||
if ($this->trans_strict === FALSE)
|
if ($this->trans_strict === FALSE)
|
||||||
{
|
{
|
||||||
$this->_trans_status = TRUE;
|
$this->_trans_status = TRUE;
|
||||||
@ -853,8 +873,7 @@ abstract class CI_DB_driver {
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->trans_commit();
|
return $this->trans_commit();
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -871,6 +890,88 @@ abstract class CI_DB_driver {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin Transaction
|
||||||
|
*
|
||||||
|
* @param bool $test_mode
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function trans_begin($test_mode = FALSE)
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
elseif ($this->_trans_depth > 0)
|
||||||
|
{
|
||||||
|
$this->_trans_depth++;
|
||||||
|
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);
|
||||||
|
|
||||||
|
if ($this->_trans_begin())
|
||||||
|
{
|
||||||
|
$this->_trans_status = TRUE;
|
||||||
|
$this->_trans_depth++;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Commit Transaction
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function trans_commit()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled OR $this->_trans_depth === 0)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
elseif ($this->_trans_depth > 1 OR $this->_trans_commit())
|
||||||
|
{
|
||||||
|
$this->_trans_depth--;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rollback Transaction
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function trans_rollback()
|
||||||
|
{
|
||||||
|
if ( ! $this->trans_enabled OR $this->_trans_depth === 0)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
// When transactions are nested we only begin/commit/rollback the outermost ones
|
||||||
|
elseif ($this->_trans_depth > 1 OR $this->_trans_rollback())
|
||||||
|
{
|
||||||
|
$this->_trans_depth--;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compile Bindings
|
* Compile Bindings
|
||||||
*
|
*
|
||||||
@ -880,7 +981,7 @@ abstract class CI_DB_driver {
|
|||||||
*/
|
*/
|
||||||
public function compile_binds($sql, $binds)
|
public function compile_binds($sql, $binds)
|
||||||
{
|
{
|
||||||
if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE)
|
if (empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE)
|
||||||
{
|
{
|
||||||
return $sql;
|
return $sql;
|
||||||
}
|
}
|
||||||
@ -900,7 +1001,7 @@ abstract class CI_DB_driver {
|
|||||||
$ml = strlen($this->bind_marker);
|
$ml = strlen($this->bind_marker);
|
||||||
|
|
||||||
// Make sure not to replace a chunk inside a string that happens to match the bind marker
|
// Make sure not to replace a chunk inside a string that happens to match the bind marker
|
||||||
if ($c = preg_match_all("/'[^']*'/i", $sql, $matches))
|
if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches))
|
||||||
{
|
{
|
||||||
$c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i',
|
$c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i',
|
||||||
str_replace($matches[0],
|
str_replace($matches[0],
|
||||||
@ -922,7 +1023,12 @@ abstract class CI_DB_driver {
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
$c--;
|
$c--;
|
||||||
$sql = substr_replace($sql, $this->escape($binds[$c]), $matches[0][$c][1], $ml);
|
$escaped_value = $this->escape($binds[$c]);
|
||||||
|
if (is_array($escaped_value))
|
||||||
|
{
|
||||||
|
$escaped_value = '('.implode(',', $escaped_value).')';
|
||||||
|
}
|
||||||
|
$sql = substr_replace($sql, $escaped_value, $matches[0][$c][1], $ml);
|
||||||
}
|
}
|
||||||
while ($c !== 0);
|
while ($c !== 0);
|
||||||
|
|
||||||
@ -939,7 +1045,7 @@ abstract class CI_DB_driver {
|
|||||||
*/
|
*/
|
||||||
public function is_write_type($sql)
|
public function is_write_type($sql)
|
||||||
{
|
{
|
||||||
return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', $sql);
|
return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX|MERGE)\s/i', $sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -948,7 +1054,7 @@ abstract class CI_DB_driver {
|
|||||||
* Calculate the aggregate query elapsed time
|
* Calculate the aggregate query elapsed time
|
||||||
*
|
*
|
||||||
* @param int The number of decimal places
|
* @param int The number of decimal places
|
||||||
* @return int
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function elapsed_time($decimals = 6)
|
public function elapsed_time($decimals = 6)
|
||||||
{
|
{
|
||||||
@ -992,7 +1098,12 @@ abstract class CI_DB_driver {
|
|||||||
*/
|
*/
|
||||||
public function escape($str)
|
public function escape($str)
|
||||||
{
|
{
|
||||||
if (is_string($str) OR (is_object($str) && method_exists($str, '__toString')))
|
if (is_array($str))
|
||||||
|
{
|
||||||
|
$str = array_map(array(&$this, 'escape'), $str);
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
elseif (is_string($str) OR (is_object($str) && method_exists($str, '__toString')))
|
||||||
{
|
{
|
||||||
return "'".$this->escape_str($str)."'";
|
return "'".$this->escape_str($str)."'";
|
||||||
}
|
}
|
||||||
@ -1013,7 +1124,7 @@ abstract class CI_DB_driver {
|
|||||||
/**
|
/**
|
||||||
* Escape String
|
* Escape String
|
||||||
*
|
*
|
||||||
* @param string $str
|
* @param string|string[] $str Input string
|
||||||
* @param bool $like Whether or not the string will be used in a LIKE condition
|
* @param bool $like Whether or not the string will be used in a LIKE condition
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@ -1063,14 +1174,14 @@ abstract class CI_DB_driver {
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Platform-dependant string escape
|
* Platform-dependent string escape
|
||||||
*
|
*
|
||||||
* @param string
|
* @param string
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected function _escape_str($str)
|
protected function _escape_str($str)
|
||||||
{
|
{
|
||||||
return str_replace("'", "''", remove_invisible_characters($str));
|
return str_replace("'", "''", remove_invisible_characters($str, FALSE));
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -1081,10 +1192,10 @@ abstract class CI_DB_driver {
|
|||||||
* Retrieves the primary key. It assumes that the row in the first
|
* Retrieves the primary key. It assumes that the row in the first
|
||||||
* position is the primary key
|
* position is the primary key
|
||||||
*
|
*
|
||||||
* @param string the table name
|
* @param string $table Table name
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function primary($table = '')
|
public function primary($table)
|
||||||
{
|
{
|
||||||
$fields = $this->list_fields($table);
|
$fields = $this->list_fields($table);
|
||||||
return is_array($fields) ? current($fields) : FALSE;
|
return is_array($fields) ? current($fields) : FALSE;
|
||||||
@ -1192,29 +1303,18 @@ abstract class CI_DB_driver {
|
|||||||
/**
|
/**
|
||||||
* Fetch Field Names
|
* Fetch Field Names
|
||||||
*
|
*
|
||||||
* @param string the table name
|
* @param string $table Table name
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function list_fields($table = '')
|
public function list_fields($table)
|
||||||
{
|
{
|
||||||
// Is there a cached result?
|
|
||||||
if (isset($this->data_cache['field_names'][$table]))
|
|
||||||
{
|
|
||||||
return $this->data_cache['field_names'][$table];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($table === '')
|
|
||||||
{
|
|
||||||
return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FALSE === ($sql = $this->_list_columns($table)))
|
if (FALSE === ($sql = $this->_list_columns($table)))
|
||||||
{
|
{
|
||||||
return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE;
|
return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
$query = $this->query($sql);
|
$query = $this->query($sql);
|
||||||
$this->data_cache['field_names'][$table] = array();
|
$fields = array();
|
||||||
|
|
||||||
foreach ($query->result_array() as $row)
|
foreach ($query->result_array() as $row)
|
||||||
{
|
{
|
||||||
@ -1236,10 +1336,10 @@ abstract class CI_DB_driver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->data_cache['field_names'][$table][] = $row[$key];
|
$fields[] = $row[$key];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->data_cache['field_names'][$table];
|
return $fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -1261,18 +1361,13 @@ abstract class CI_DB_driver {
|
|||||||
/**
|
/**
|
||||||
* Returns an object with field data
|
* Returns an object with field data
|
||||||
*
|
*
|
||||||
* @param string the table name
|
* @param string $table the table name
|
||||||
* @return object
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function field_data($table = '')
|
public function field_data($table)
|
||||||
{
|
{
|
||||||
if ($table === '')
|
|
||||||
{
|
|
||||||
return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$query = $this->query($this->_field_data($this->protect_identifiers($table, TRUE, NULL, FALSE)));
|
$query = $this->query($this->_field_data($this->protect_identifiers($table, TRUE, NULL, FALSE)));
|
||||||
return $query->field_data();
|
return ($query) ? $query->field_data() : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -1427,7 +1522,7 @@ abstract class CI_DB_driver {
|
|||||||
return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
|
return 'UPDATE '.$table.' SET '.implode(', ', $valstr)
|
||||||
.$this->_compile_wh('qb_where')
|
.$this->_compile_wh('qb_where')
|
||||||
.$this->_compile_order_by()
|
.$this->_compile_order_by()
|
||||||
.($this->qb_limit ? ' LIMIT '.$this->qb_limit : '');
|
.($this->qb_limit !== FALSE ? ' LIMIT '.$this->qb_limit : '');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -1466,13 +1561,13 @@ abstract class CI_DB_driver {
|
|||||||
'\s*>\s*', // >
|
'\s*>\s*', // >
|
||||||
'\s+IS NULL', // IS NULL
|
'\s+IS NULL', // IS NULL
|
||||||
'\s+IS NOT NULL', // IS NOT NULL
|
'\s+IS NOT NULL', // IS NOT NULL
|
||||||
'\s+EXISTS\s*\([^\)]+\)', // EXISTS(sql)
|
'\s+EXISTS\s*\(.*\)', // EXISTS(sql)
|
||||||
'\s+NOT EXISTS\s*\([^\)]+\)', // NOT EXISTS(sql)
|
'\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql)
|
||||||
'\s+BETWEEN\s+\S+\s+AND\s+\S+', // BETWEEN value AND value
|
'\s+BETWEEN\s+', // BETWEEN value AND value
|
||||||
'\s+IN\s*\([^\)]+\)', // IN(list)
|
'\s+IN\s*\(.*\)', // IN(list)
|
||||||
'\s+NOT IN\s*\([^\)]+\)', // NOT IN (list)
|
'\s+NOT IN\s*\(.*\)', // NOT IN (list)
|
||||||
'\s+LIKE\s+\S+'.$_les, // LIKE 'expr'[ ESCAPE '%s']
|
'\s+LIKE\s+\S.*('.$_les.')?', // LIKE 'expr'[ ESCAPE '%s']
|
||||||
'\s+NOT LIKE\s+\S+'.$_les // NOT LIKE 'expr'[ ESCAPE '%s']
|
'\s+NOT LIKE\s+\S.*('.$_les.')?' // NOT LIKE 'expr'[ ESCAPE '%s']
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1618,7 +1713,7 @@ abstract class CI_DB_driver {
|
|||||||
/**
|
/**
|
||||||
* Close DB Connection
|
* Close DB Connection
|
||||||
*
|
*
|
||||||
* This method would be overriden by most of the drivers.
|
* This method would be overridden by most of the drivers.
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@ -1693,7 +1788,7 @@ abstract class CI_DB_driver {
|
|||||||
* the table prefix onto it. Some logic is necessary in order to deal with
|
* the table prefix onto it. Some logic is necessary in order to deal with
|
||||||
* column names that include the path. Consider a query like this:
|
* column names that include the path. Consider a query like this:
|
||||||
*
|
*
|
||||||
* SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table
|
* SELECT hostname.database.table.column AS c FROM hostname.database.table
|
||||||
*
|
*
|
||||||
* Or a query with aliasing:
|
* Or a query with aliasing:
|
||||||
*
|
*
|
||||||
@ -1735,13 +1830,13 @@ abstract class CI_DB_driver {
|
|||||||
//
|
//
|
||||||
// Added exception for single quotes as well, we don't want to alter
|
// Added exception for single quotes as well, we don't want to alter
|
||||||
// literal strings. -- Narf
|
// literal strings. -- Narf
|
||||||
if (strpos($item, '(') !== FALSE OR strpos($item, "'") !== FALSE)
|
if (strcspn($item, "()'") !== strlen($item))
|
||||||
{
|
{
|
||||||
return $item;
|
return $item;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert tabs or multiple spaces into single spaces
|
// Convert tabs or multiple spaces into single spaces
|
||||||
$item = preg_replace('/\s+/', ' ', $item);
|
$item = preg_replace('/\s+/', ' ', trim($item));
|
||||||
|
|
||||||
// If the item has an alias declaration we remove it and set it aside.
|
// If the item has an alias declaration we remove it and set it aside.
|
||||||
// Note: strripos() is used in order to support spaces in table names
|
// Note: strripos() is used in order to support spaces in table names
|
||||||
@ -1774,7 +1869,10 @@ abstract class CI_DB_driver {
|
|||||||
// Does the first segment of the exploded item match
|
// Does the first segment of the exploded item match
|
||||||
// one of the aliases previously identified? If so,
|
// one of the aliases previously identified? If so,
|
||||||
// we have nothing more to do other than escape the item
|
// we have nothing more to do other than escape the item
|
||||||
if (in_array($parts[0], $this->qb_aliased_tables))
|
//
|
||||||
|
// NOTE: The ! empty() condition prevents this method
|
||||||
|
// from breaking when QB isn't enabled.
|
||||||
|
if ( ! empty($this->qb_aliased_tables) && in_array($parts[0], $this->qb_aliased_tables))
|
||||||
{
|
{
|
||||||
if ($protect_identifiers === TRUE)
|
if ($protect_identifiers === TRUE)
|
||||||
{
|
{
|
||||||
@ -1822,15 +1920,19 @@ abstract class CI_DB_driver {
|
|||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// dbprefix may've already been applied, with or without the identifier escaped
|
||||||
|
$ec = '(?<ec>'.preg_quote(is_array($this->_escape_char) ? $this->_escape_char[0] : $this->_escape_char).')?';
|
||||||
|
isset($ec[0]) && $ec .= '?'; // Just in case someone has disabled escaping by forcing an empty escape character
|
||||||
|
|
||||||
// Verify table prefix and replace if necessary
|
// Verify table prefix and replace if necessary
|
||||||
if ($this->swap_pre !== '' && strpos($parts[$i], $this->swap_pre) === 0)
|
if ($this->swap_pre !== '' && preg_match('#^'.$ec.preg_quote($this->swap_pre).'#', $parts[$i]))
|
||||||
{
|
{
|
||||||
$parts[$i] = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $parts[$i]);
|
$parts[$i] = preg_replace('#^'.$ec.preg_quote($this->swap_pre).'(\S+?)#', '\\1'.$this->dbprefix.'\\2', $parts[$i]);
|
||||||
}
|
}
|
||||||
// We only add the table prefix if it does not already exist
|
// We only add the table prefix if it does not already exist
|
||||||
elseif (strpos($parts[$i], $this->dbprefix) !== 0)
|
else
|
||||||
{
|
{
|
||||||
$parts[$i] = $this->dbprefix.$parts[$i];
|
preg_match('#^'.$ec.preg_quote($this->dbprefix).'#', $parts[$i]) OR $parts[$i] = $this->dbprefix.$parts[$i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Put the parts back together
|
// Put the parts back together
|
||||||
@ -1881,6 +1983,3 @@ abstract class CI_DB_driver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file DB_driver.php */
|
|
||||||
/* Location: ./system/database/DB_driver.php */
|
|
154
system/database/DB_forge.php
Executable file → Normal file
154
system/database/DB_forge.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
abstract class CI_DB_forge {
|
abstract class CI_DB_forge {
|
||||||
|
|
||||||
@ -132,7 +143,7 @@ abstract class CI_DB_forge {
|
|||||||
protected $_unsigned = TRUE;
|
protected $_unsigned = TRUE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NULL value representatin in CREATE/ALTER TABLE statements
|
* NULL value representation in CREATE/ALTER TABLE statements
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
@ -156,7 +167,7 @@ abstract class CI_DB_forge {
|
|||||||
public function __construct(&$db)
|
public function __construct(&$db)
|
||||||
{
|
{
|
||||||
$this->db =& $db;
|
$this->db =& $db;
|
||||||
log_message('debug', 'Database Forge Class Initialized');
|
log_message('info', 'Database Forge Class Initialized');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -173,7 +184,7 @@ abstract class CI_DB_forge {
|
|||||||
{
|
{
|
||||||
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;
|
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;
|
||||||
}
|
}
|
||||||
elseif ( ! $this->db->query(sprintf($this->_create_database, $db_name, $this->db->char_set, $this->db->dbcollat)))
|
elseif ( ! $this->db->query(sprintf($this->_create_database, $this->db->escape_identifiers($db_name), $this->db->char_set, $this->db->dbcollat)))
|
||||||
{
|
{
|
||||||
return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;
|
return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;
|
||||||
}
|
}
|
||||||
@ -196,16 +207,11 @@ abstract class CI_DB_forge {
|
|||||||
*/
|
*/
|
||||||
public function drop_database($db_name)
|
public function drop_database($db_name)
|
||||||
{
|
{
|
||||||
if ($db_name === '')
|
if ($this->_drop_database === FALSE)
|
||||||
{
|
|
||||||
show_error('A table name is required for that operation.');
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
elseif ($this->_drop_database === FALSE)
|
|
||||||
{
|
{
|
||||||
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;
|
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;
|
||||||
}
|
}
|
||||||
elseif ( ! $this->db->query(sprintf($this->_drop_database, $db_name)))
|
elseif ( ! $this->db->query(sprintf($this->_drop_database, $this->db->escape_identifiers($db_name))))
|
||||||
{
|
{
|
||||||
return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;
|
return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE;
|
||||||
}
|
}
|
||||||
@ -231,13 +237,14 @@ abstract class CI_DB_forge {
|
|||||||
* @param bool $primary
|
* @param bool $primary
|
||||||
* @return CI_DB_forge
|
* @return CI_DB_forge
|
||||||
*/
|
*/
|
||||||
public function add_key($key = '', $primary = FALSE)
|
public function add_key($key, $primary = FALSE)
|
||||||
{
|
{
|
||||||
if (empty($key))
|
// DO NOT change this! This condition is only applicable
|
||||||
{
|
// for PRIMARY keys because you can only have one such,
|
||||||
show_error('Key information is required for that operation.');
|
// and therefore all fields you add to it will be included
|
||||||
}
|
// in the same, composite PRIMARY KEY.
|
||||||
|
//
|
||||||
|
// It's not the same for regular indexes.
|
||||||
if ($primary === TRUE && is_array($key))
|
if ($primary === TRUE && is_array($key))
|
||||||
{
|
{
|
||||||
foreach ($key as $one)
|
foreach ($key as $one)
|
||||||
@ -268,13 +275,8 @@ abstract class CI_DB_forge {
|
|||||||
* @param array $field
|
* @param array $field
|
||||||
* @return CI_DB_forge
|
* @return CI_DB_forge
|
||||||
*/
|
*/
|
||||||
public function add_field($field = '')
|
public function add_field($field)
|
||||||
{
|
{
|
||||||
if (empty($field))
|
|
||||||
{
|
|
||||||
show_error('Field information is required.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_string($field))
|
if (is_string($field))
|
||||||
{
|
{
|
||||||
if ($field === 'id')
|
if ($field === 'id')
|
||||||
@ -317,7 +319,7 @@ abstract class CI_DB_forge {
|
|||||||
* @param array $attributes Associative array of table attributes
|
* @param array $attributes Associative array of table attributes
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function create_table($table = '', $if_not_exists = FALSE, array $attributes = array())
|
public function create_table($table, $if_not_exists = FALSE, array $attributes = array())
|
||||||
{
|
{
|
||||||
if ($table === '')
|
if ($table === '')
|
||||||
{
|
{
|
||||||
@ -346,7 +348,10 @@ abstract class CI_DB_forge {
|
|||||||
|
|
||||||
if (($result = $this->db->query($sql)) !== FALSE)
|
if (($result = $this->db->query($sql)) !== FALSE)
|
||||||
{
|
{
|
||||||
empty($this->db->data_cache['table_names']) OR $this->db->data_cache['table_names'][] = $table;
|
if (isset($this->db->data_cache['table_names']))
|
||||||
|
{
|
||||||
|
$this->db->data_cache['table_names'][] = $table;
|
||||||
|
}
|
||||||
|
|
||||||
// Most databases don't support creating indexes from within the CREATE TABLE statement
|
// Most databases don't support creating indexes from within the CREATE TABLE statement
|
||||||
if ( ! empty($this->keys))
|
if ( ! empty($this->keys))
|
||||||
@ -380,11 +385,9 @@ abstract class CI_DB_forge {
|
|||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
$if_not_exists = FALSE;
|
$if_not_exists = FALSE;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
$sql = ($if_not_exists)
|
$sql = ($if_not_exists)
|
||||||
? sprintf($this->_create_table_if, $this->db->escape_identifiers($table))
|
? sprintf($this->_create_table_if, $this->db->escape_identifiers($table))
|
||||||
@ -457,12 +460,7 @@ abstract class CI_DB_forge {
|
|||||||
return ($this->db->db_debug) ? $this->db->display_error('db_table_name_required') : FALSE;
|
return ($this->db->db_debug) ? $this->db->display_error('db_table_name_required') : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
$query = $this->_drop_table($this->db->dbprefix.$table_name, $if_exists);
|
if (($query = $this->_drop_table($this->db->dbprefix.$table_name, $if_exists)) === TRUE)
|
||||||
if ($query === FALSE)
|
|
||||||
{
|
|
||||||
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;
|
|
||||||
}
|
|
||||||
elseif ($query === TRUE)
|
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -491,7 +489,7 @@ abstract class CI_DB_forge {
|
|||||||
*
|
*
|
||||||
* @param string $table Table name
|
* @param string $table Table name
|
||||||
* @param bool $if_exists Whether to add an IF EXISTS condition
|
* @param bool $if_exists Whether to add an IF EXISTS condition
|
||||||
* @return string
|
* @return mixed (Returns a platform-specific DROP table string, or TRUE to indicate there's nothing to do)
|
||||||
*/
|
*/
|
||||||
protected function _drop_table($table, $if_exists)
|
protected function _drop_table($table, $if_exists)
|
||||||
{
|
{
|
||||||
@ -564,18 +562,10 @@ abstract class CI_DB_forge {
|
|||||||
* @param string $_after Column for AFTER clause (deprecated)
|
* @param string $_after Column for AFTER clause (deprecated)
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function add_column($table = '', $field = array(), $_after = NULL)
|
public function add_column($table, $field, $_after = NULL)
|
||||||
{
|
{
|
||||||
if ($table === '')
|
|
||||||
{
|
|
||||||
show_error('A table name is required for that operation.');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Work-around for literal column definitions
|
// Work-around for literal column definitions
|
||||||
if ( ! is_array($field))
|
is_array($field) OR $field = array($field);
|
||||||
{
|
|
||||||
$field = array($field);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (array_keys($field) as $k)
|
foreach (array_keys($field) as $k)
|
||||||
{
|
{
|
||||||
@ -615,18 +605,8 @@ abstract class CI_DB_forge {
|
|||||||
* @param string $column_name Column name
|
* @param string $column_name Column name
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function drop_column($table = '', $column_name = '')
|
public 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);
|
$sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);
|
||||||
if ($sql === FALSE)
|
if ($sql === FALSE)
|
||||||
{
|
{
|
||||||
@ -645,18 +625,10 @@ abstract class CI_DB_forge {
|
|||||||
* @param string $field Column definition
|
* @param string $field Column definition
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function modify_column($table = '', $field = array())
|
public function modify_column($table, $field)
|
||||||
{
|
{
|
||||||
if ($table === '')
|
|
||||||
{
|
|
||||||
show_error('A table name is required for that operation.');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Work-around for literal column definitions
|
// Work-around for literal column definitions
|
||||||
if ( ! is_array($field))
|
is_array($field) OR $field = array($field);
|
||||||
{
|
|
||||||
$field = array($field);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (array_keys($field) as $k)
|
foreach (array_keys($field) as $k)
|
||||||
{
|
{
|
||||||
@ -755,7 +727,7 @@ abstract class CI_DB_forge {
|
|||||||
'type' => isset($attributes['TYPE']) ? $attributes['TYPE'] : NULL,
|
'type' => isset($attributes['TYPE']) ? $attributes['TYPE'] : NULL,
|
||||||
'length' => '',
|
'length' => '',
|
||||||
'unsigned' => '',
|
'unsigned' => '',
|
||||||
'null' => '',
|
'null' => NULL,
|
||||||
'unique' => '',
|
'unique' => '',
|
||||||
'default' => '',
|
'default' => '',
|
||||||
'auto_increment' => '',
|
'auto_increment' => '',
|
||||||
@ -797,6 +769,11 @@ abstract class CI_DB_forge {
|
|||||||
$this->_attr_auto_increment($attributes, $field);
|
$this->_attr_auto_increment($attributes, $field);
|
||||||
$this->_attr_unique($attributes, $field);
|
$this->_attr_unique($attributes, $field);
|
||||||
|
|
||||||
|
if (isset($attributes['COMMENT']))
|
||||||
|
{
|
||||||
|
$field['comment'] = $this->db->escape($attributes['COMMENT']);
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($attributes['TYPE']) && ! empty($attributes['CONSTRAINT']))
|
if (isset($attributes['TYPE']) && ! empty($attributes['CONSTRAINT']))
|
||||||
{
|
{
|
||||||
switch (strtoupper($attributes['TYPE']))
|
switch (strtoupper($attributes['TYPE']))
|
||||||
@ -804,10 +781,6 @@ abstract class CI_DB_forge {
|
|||||||
case 'ENUM':
|
case 'ENUM':
|
||||||
case 'SET':
|
case 'SET':
|
||||||
$attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']);
|
$attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']);
|
||||||
$field['length'] = is_array($attributes['CONSTRAINT'])
|
|
||||||
? "('".implode("','", $attributes['CONSTRAINT'])."')"
|
|
||||||
: '('.$attributes['CONSTRAINT'].')';
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
$field['length'] = is_array($attributes['CONSTRAINT'])
|
$field['length'] = is_array($attributes['CONSTRAINT'])
|
||||||
? '('.implode(',', $attributes['CONSTRAINT']).')'
|
? '('.implode(',', $attributes['CONSTRAINT']).')'
|
||||||
@ -853,7 +826,7 @@ abstract class CI_DB_forge {
|
|||||||
*/
|
*/
|
||||||
protected function _attr_type(&$attributes)
|
protected function _attr_type(&$attributes)
|
||||||
{
|
{
|
||||||
// Usually overriden by drivers
|
// Usually overridden by drivers
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -929,7 +902,7 @@ abstract class CI_DB_forge {
|
|||||||
$field['default'] = empty($this->_null) ? '' : $this->_default.$this->_null;
|
$field['default'] = empty($this->_null) ? '' : $this->_default.$this->_null;
|
||||||
|
|
||||||
// Override the NULL attribute if that's our default
|
// Override the NULL attribute if that's our default
|
||||||
$attributes['NULL'] = NULL;
|
$attributes['NULL'] = TRUE;
|
||||||
$field['null'] = empty($this->_null) ? '' : ' '.$this->_null;
|
$field['null'] = empty($this->_null) ? '' : ' '.$this->_null;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1007,8 +980,8 @@ abstract class CI_DB_forge {
|
|||||||
/**
|
/**
|
||||||
* Process indexes
|
* Process indexes
|
||||||
*
|
*
|
||||||
* @param string $table
|
* @param string $table Table name
|
||||||
* @return string
|
* @return string[] list of SQL statements
|
||||||
*/
|
*/
|
||||||
protected function _process_indexes($table)
|
protected function _process_indexes($table)
|
||||||
{
|
{
|
||||||
@ -1058,6 +1031,3 @@ abstract class CI_DB_forge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file DB_forge.php */
|
|
||||||
/* Location: ./system/database/DB_forge.php */
|
|
398
system/database/DB_query_builder.php
Executable file → Normal file
398
system/database/DB_query_builder.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -35,7 +46,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
abstract class CI_DB_query_builder extends CI_DB_driver {
|
abstract class CI_DB_query_builder extends CI_DB_driver {
|
||||||
@ -138,6 +149,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*/
|
*/
|
||||||
protected $qb_set = array();
|
protected $qb_set = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* QB data set for update_batch()
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $qb_set_ub = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QB aliased tables list
|
* QB aliased tables list
|
||||||
*
|
*
|
||||||
@ -196,6 +214,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*/
|
*/
|
||||||
protected $qb_cache_join = array();
|
protected $qb_cache_join = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* QB Cache aliased tables list
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $qb_cache_aliased_tables = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QB Cache WHERE data
|
* QB Cache WHERE data
|
||||||
*
|
*
|
||||||
@ -520,40 +545,47 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
|
|
||||||
is_bool($escape) OR $escape = $this->_protect_identifiers;
|
is_bool($escape) OR $escape = $this->_protect_identifiers;
|
||||||
|
|
||||||
// Split multiple conditions
|
if ( ! $this->_has_operator($cond))
|
||||||
if ($escape === TRUE && preg_match_all('/\sAND\s|\sOR\s/i', $cond, $m, PREG_OFFSET_CAPTURE))
|
|
||||||
{
|
|
||||||
$newcond = '';
|
|
||||||
$m[0][] = array('', strlen($cond));
|
|
||||||
|
|
||||||
for ($i = 0, $c = count($m[0]), $s = 0;
|
|
||||||
$i < $c;
|
|
||||||
$s = $m[0][$i][1] + strlen($m[0][$i][0]), $i++)
|
|
||||||
{
|
|
||||||
$temp = substr($cond, $s, ($m[0][$i][1] - $s));
|
|
||||||
|
|
||||||
$newcond .= preg_match("/([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $temp, $match)
|
|
||||||
? $this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3])
|
|
||||||
: $temp;
|
|
||||||
|
|
||||||
$newcond .= $m[0][$i][0];
|
|
||||||
}
|
|
||||||
|
|
||||||
$cond = ' ON '.$newcond;
|
|
||||||
}
|
|
||||||
// Split apart the condition and protect the identifiers
|
|
||||||
elseif ($escape === TRUE && preg_match("/([\[\]\w\.'-]+)(\s*[^\"\[`'\w]+\s*)(.+)/i", $cond, $match))
|
|
||||||
{
|
|
||||||
$cond = ' ON '.$this->protect_identifiers($match[1]).$match[2].$this->protect_identifiers($match[3]);
|
|
||||||
}
|
|
||||||
elseif ( ! $this->_has_operator($cond))
|
|
||||||
{
|
{
|
||||||
$cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')';
|
$cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')';
|
||||||
}
|
}
|
||||||
else
|
elseif ($escape === FALSE)
|
||||||
{
|
{
|
||||||
$cond = ' ON '.$cond;
|
$cond = ' ON '.$cond;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Split multiple conditions
|
||||||
|
if (preg_match_all('/\sAND\s|\sOR\s/i', $cond, $joints, PREG_OFFSET_CAPTURE))
|
||||||
|
{
|
||||||
|
$conditions = array();
|
||||||
|
$joints = $joints[0];
|
||||||
|
array_unshift($joints, array('', 0));
|
||||||
|
|
||||||
|
for ($i = count($joints) - 1, $pos = strlen($cond); $i >= 0; $i--)
|
||||||
|
{
|
||||||
|
$joints[$i][1] += strlen($joints[$i][0]); // offset
|
||||||
|
$conditions[$i] = substr($cond, $joints[$i][1], $pos - $joints[$i][1]);
|
||||||
|
$pos = $joints[$i][1] - strlen($joints[$i][0]);
|
||||||
|
$joints[$i] = $joints[$i][0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$conditions = array($cond);
|
||||||
|
$joints = array('');
|
||||||
|
}
|
||||||
|
|
||||||
|
$cond = ' ON ';
|
||||||
|
for ($i = 0, $c = count($conditions); $i < $c; $i++)
|
||||||
|
{
|
||||||
|
$operator = $this->_get_operator($conditions[$i]);
|
||||||
|
$cond .= $joints[$i];
|
||||||
|
$cond .= preg_match("/(\(*)?([\[\]\w\.'-]+)".preg_quote($operator)."(.*)/i", $conditions[$i], $match)
|
||||||
|
? $match[1].$this->protect_identifiers($match[2]).$operator.$this->protect_identifiers($match[3])
|
||||||
|
: $conditions[$i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Do we want to escape the table name?
|
// Do we want to escape the table name?
|
||||||
if ($escape === TRUE)
|
if ($escape === TRUE)
|
||||||
@ -635,7 +667,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
$key = array($key => $value);
|
$key = array($key => $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the escape value was not set will will base it on the global setting
|
// If the escape value was not set will base it on the global setting
|
||||||
is_bool($escape) OR $escape = $this->_protect_identifiers;
|
is_bool($escape) OR $escape = $this->_protect_identifiers;
|
||||||
|
|
||||||
foreach ($key as $k => $v)
|
foreach ($key as $k => $v)
|
||||||
@ -648,7 +680,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
{
|
{
|
||||||
if ($escape === TRUE)
|
if ($escape === TRUE)
|
||||||
{
|
{
|
||||||
$v = ' '.$this->escape($v);
|
$v = $this->escape($v);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! $this->_has_operator($k))
|
if ( ! $this->_has_operator($k))
|
||||||
@ -661,11 +693,16 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
// value appears not to have been set, assign the test to IS NULL
|
// value appears not to have been set, assign the test to IS NULL
|
||||||
$k .= ' IS NULL';
|
$k .= ' IS NULL';
|
||||||
}
|
}
|
||||||
|
elseif (preg_match('/\s*(!?=|<>|\sIS(?:\s+NOT)?\s)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE))
|
||||||
|
{
|
||||||
|
$k = substr($k, 0, $match[0][1]).($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL');
|
||||||
|
}
|
||||||
|
|
||||||
$this->{$qb_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape);
|
${$qb_key} = array('condition' => $prefix.$k, 'value' => $v, 'escape' => $escape);
|
||||||
|
$this->{$qb_key}[] = ${$qb_key};
|
||||||
if ($this->qb_caching === TRUE)
|
if ($this->qb_caching === TRUE)
|
||||||
{
|
{
|
||||||
$this->{$qb_cache_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape);
|
$this->{$qb_cache_key}[] = ${$qb_key};
|
||||||
$this->qb_cache_exists[] = substr($qb_key, 3);
|
$this->qb_cache_exists[] = substr($qb_key, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -779,15 +816,26 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
|
|
||||||
$not = ($not) ? ' NOT' : '';
|
$not = ($not) ? ' NOT' : '';
|
||||||
|
|
||||||
|
if ($escape === TRUE)
|
||||||
|
{
|
||||||
$where_in = array();
|
$where_in = array();
|
||||||
foreach ($values as $value)
|
foreach ($values as $value)
|
||||||
{
|
{
|
||||||
$where_in[] = $this->escape($value);
|
$where_in[] = $this->escape($value);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$where_in = array_values($values);
|
||||||
|
}
|
||||||
|
|
||||||
|
$prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0)
|
||||||
|
? $this->_group_get_type('')
|
||||||
|
: $this->_group_get_type($type);
|
||||||
|
|
||||||
$prefix = (count($this->qb_where) === 0) ? $this->_group_get_type('') : $this->_group_get_type($type);
|
|
||||||
$where_in = array(
|
$where_in = array(
|
||||||
'condition' => $prefix.$key.$not.' IN('.implode(', ', $where_in).')',
|
'condition' => $prefix.$key.$not.' IN('.implode(', ', $where_in).')',
|
||||||
|
'value' => NULL,
|
||||||
'escape' => $escape
|
'escape' => $escape
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -903,41 +951,47 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
is_bool($escape) OR $escape = $this->_protect_identifiers;
|
is_bool($escape) OR $escape = $this->_protect_identifiers;
|
||||||
|
// lowercase $side in case somebody writes e.g. 'BEFORE' instead of 'before' (doh)
|
||||||
|
$side = strtolower($side);
|
||||||
|
|
||||||
foreach ($field as $k => $v)
|
foreach ($field as $k => $v)
|
||||||
{
|
{
|
||||||
$prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0)
|
$prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0)
|
||||||
? $this->_group_get_type('') : $this->_group_get_type($type);
|
? $this->_group_get_type('') : $this->_group_get_type($type);
|
||||||
|
|
||||||
|
if ($escape === TRUE)
|
||||||
|
{
|
||||||
$v = $this->escape_like_str($v);
|
$v = $this->escape_like_str($v);
|
||||||
|
}
|
||||||
|
|
||||||
if ($side === 'none')
|
switch ($side)
|
||||||
{
|
{
|
||||||
$like_statement = "{$prefix} {$k} {$not} LIKE '{$v}'";
|
case 'none':
|
||||||
}
|
$v = "'{$v}'";
|
||||||
elseif ($side === 'before')
|
break;
|
||||||
{
|
case 'before':
|
||||||
$like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}'";
|
$v = "'%{$v}'";
|
||||||
}
|
break;
|
||||||
elseif ($side === 'after')
|
case 'after':
|
||||||
{
|
$v = "'{$v}%'";
|
||||||
$like_statement = "{$prefix} {$k} {$not} LIKE '{$v}%'";
|
break;
|
||||||
}
|
case 'both':
|
||||||
else
|
default:
|
||||||
{
|
$v = "'%{$v}%'";
|
||||||
$like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}%'";
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// some platforms require an escape sequence definition for LIKE wildcards
|
// some platforms require an escape sequence definition for LIKE wildcards
|
||||||
if ($this->_like_escape_str !== '')
|
if ($escape === TRUE && $this->_like_escape_str !== '')
|
||||||
{
|
{
|
||||||
$like_statement .= sprintf($this->_like_escape_str, $this->_like_escape_chr);
|
$v .= sprintf($this->_like_escape_str, $this->_like_escape_chr);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->qb_where[] = array('condition' => $like_statement, 'escape' => $escape);
|
$qb_where = array('condition' => "{$prefix} {$k} {$not} LIKE {$v}", 'value' => NULL, 'escape' => $escape);
|
||||||
|
$this->qb_where[] = $qb_where;
|
||||||
if ($this->qb_caching === TRUE)
|
if ($this->qb_caching === TRUE)
|
||||||
{
|
{
|
||||||
$this->qb_cache_where[] = array('condition' => $like_statement, 'escape' => $escape);
|
$this->qb_cache_where[] = $qb_where;
|
||||||
$this->qb_cache_exists[] = 'where';
|
$this->qb_cache_exists[] = 'where';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -962,6 +1016,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
$prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type;
|
$prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type;
|
||||||
$where = array(
|
$where = array(
|
||||||
'condition' => $prefix.$not.str_repeat(' ', ++$this->qb_where_group_count).' (',
|
'condition' => $prefix.$not.str_repeat(' ', ++$this->qb_where_group_count).' (',
|
||||||
|
'value' => NULL,
|
||||||
'escape' => FALSE
|
'escape' => FALSE
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1022,6 +1077,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
$this->qb_where_group_started = FALSE;
|
$this->qb_where_group_started = FALSE;
|
||||||
$where = array(
|
$where = array(
|
||||||
'condition' => str_repeat(' ', $this->qb_where_group_count--).')',
|
'condition' => str_repeat(' ', $this->qb_where_group_count--).')',
|
||||||
|
'value' => NULL,
|
||||||
'escape' => FALSE
|
'escape' => FALSE
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1108,7 +1164,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* @param string $key
|
* @param string $key
|
||||||
* @param string $value
|
* @param string $value
|
||||||
* @param bool $escape
|
* @param bool $escape
|
||||||
* @return object
|
* @return CI_DB_query_builder
|
||||||
*/
|
*/
|
||||||
public function having($key, $value = NULL, $escape = NULL)
|
public function having($key, $value = NULL, $escape = NULL)
|
||||||
{
|
{
|
||||||
@ -1125,7 +1181,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* @param string $key
|
* @param string $key
|
||||||
* @param string $value
|
* @param string $value
|
||||||
* @param bool $escape
|
* @param bool $escape
|
||||||
* @return object
|
* @return CI_DB_query_builder
|
||||||
*/
|
*/
|
||||||
public function or_having($key, $value = NULL, $escape = NULL)
|
public function or_having($key, $value = NULL, $escape = NULL)
|
||||||
{
|
{
|
||||||
@ -1200,7 +1256,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* @param int $offset OFFSET value
|
* @param int $offset OFFSET value
|
||||||
* @return CI_DB_query_builder
|
* @return CI_DB_query_builder
|
||||||
*/
|
*/
|
||||||
public function limit($value, $offset = FALSE)
|
public function limit($value, $offset = 0)
|
||||||
{
|
{
|
||||||
is_null($value) OR $this->qb_limit = (int) $value;
|
is_null($value) OR $this->qb_limit = (int) $value;
|
||||||
empty($offset) OR $this->qb_offset = (int) $offset;
|
empty($offset) OR $this->qb_offset = (int) $offset;
|
||||||
@ -1234,7 +1290,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*/
|
*/
|
||||||
protected function _limit($sql)
|
protected function _limit($sql)
|
||||||
{
|
{
|
||||||
return $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').$this->qb_limit;
|
return $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').(int) $this->qb_limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -1277,7 +1333,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* Compiles a SELECT query string and returns the sql.
|
* Compiles a SELECT query string and returns the sql.
|
||||||
*
|
*
|
||||||
* @param string the table name to select from (optional)
|
* @param string the table name to select from (optional)
|
||||||
* @param bool TRUE: resets QB values; FALSE: leave QB vaules alone
|
* @param bool TRUE: resets QB values; FALSE: leave QB values alone
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function get_compiled_select($table = '', $reset = TRUE)
|
public function get_compiled_select($table = '', $reset = TRUE)
|
||||||
@ -1309,7 +1365,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* @param string the table
|
* @param string the table
|
||||||
* @param string the limit clause
|
* @param string the limit clause
|
||||||
* @param string the offset clause
|
* @param string the offset clause
|
||||||
* @return object
|
* @return CI_DB_result
|
||||||
*/
|
*/
|
||||||
public function get($table = '', $limit = NULL, $offset = NULL)
|
public function get($table = '', $limit = NULL, $offset = NULL)
|
||||||
{
|
{
|
||||||
@ -1338,9 +1394,10 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* returned by an Query Builder query.
|
* returned by an Query Builder query.
|
||||||
*
|
*
|
||||||
* @param string
|
* @param string
|
||||||
|
* @param bool the reset clause
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
public function count_all_results($table = '')
|
public function count_all_results($table = '', $reset = TRUE)
|
||||||
{
|
{
|
||||||
if ($table !== '')
|
if ($table !== '')
|
||||||
{
|
{
|
||||||
@ -1348,10 +1405,26 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
$this->from($table);
|
$this->from($table);
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = ($this->qb_distinct === TRUE)
|
// ORDER BY usage is often problematic here (most notably
|
||||||
|
// on Microsoft SQL Server) and ultimately unnecessary
|
||||||
|
// for selecting COUNT(*) ...
|
||||||
|
$qb_orderby = $this->qb_orderby;
|
||||||
|
$qb_cache_orderby = $this->qb_cache_orderby;
|
||||||
|
$this->qb_orderby = $this->qb_cache_orderby = array();
|
||||||
|
|
||||||
|
$result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR ! empty($this->qb_cache_groupby) OR $this->qb_limit OR $this->qb_offset)
|
||||||
? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results")
|
? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results")
|
||||||
: $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows')));
|
: $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows')));
|
||||||
|
|
||||||
|
if ($reset === TRUE)
|
||||||
|
{
|
||||||
$this->_reset_select();
|
$this->_reset_select();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->qb_orderby = $qb_orderby;
|
||||||
|
$this->qb_cache_orderby = $qb_cache_orderby;
|
||||||
|
}
|
||||||
|
|
||||||
if ($result->num_rows() === 0)
|
if ($result->num_rows() === 0)
|
||||||
{
|
{
|
||||||
@ -1365,7 +1438,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get_Where
|
* get_where()
|
||||||
*
|
*
|
||||||
* Allows the where clause, limit and offset to be added directly
|
* Allows the where clause, limit and offset to be added directly
|
||||||
*
|
*
|
||||||
@ -1373,7 +1446,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* @param string $where
|
* @param string $where
|
||||||
* @param int $limit
|
* @param int $limit
|
||||||
* @param int $offset
|
* @param int $offset
|
||||||
* @return object
|
* @return CI_DB_result
|
||||||
*/
|
*/
|
||||||
public function get_where($table = '', $where = NULL, $limit = NULL, $offset = NULL)
|
public function get_where($table = '', $where = NULL, $limit = NULL, $offset = NULL)
|
||||||
{
|
{
|
||||||
@ -1409,20 +1482,26 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* @param bool $escape Whether to escape values and identifiers
|
* @param bool $escape Whether to escape values and identifiers
|
||||||
* @return int Number of rows inserted or FALSE on failure
|
* @return int Number of rows inserted or FALSE on failure
|
||||||
*/
|
*/
|
||||||
public function insert_batch($table = '', $set = NULL, $escape = NULL)
|
public function insert_batch($table, $set = NULL, $escape = NULL, $batch_size = 100)
|
||||||
{
|
{
|
||||||
if ($set !== NULL)
|
if ($set === NULL)
|
||||||
{
|
{
|
||||||
|
if (empty($this->qb_set))
|
||||||
|
{
|
||||||
|
return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (empty($set))
|
||||||
|
{
|
||||||
|
return ($this->db_debug) ? $this->display_error('insert_batch() called with no data') : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
$this->set_insert_batch($set, '', $escape);
|
$this->set_insert_batch($set, '', $escape);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count($this->qb_set) === 0)
|
if (strlen($table) === 0)
|
||||||
{
|
|
||||||
// No valid data array. Folds in cases where keys and values did not match up
|
|
||||||
return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($table === '')
|
|
||||||
{
|
{
|
||||||
if ( ! isset($this->qb_from[0]))
|
if ( ! isset($this->qb_from[0]))
|
||||||
{
|
{
|
||||||
@ -1434,11 +1513,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
|
|
||||||
// Batch this baby
|
// Batch this baby
|
||||||
$affected_rows = 0;
|
$affected_rows = 0;
|
||||||
for ($i = 0, $total = count($this->qb_set); $i < $total; $i += 100)
|
for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size)
|
||||||
|
{
|
||||||
|
if ($this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size))))
|
||||||
{
|
{
|
||||||
$this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, 100)));
|
|
||||||
$affected_rows += $this->affected_rows();
|
$affected_rows += $this->affected_rows();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$this->_reset_write();
|
$this->_reset_write();
|
||||||
return $affected_rows;
|
return $affected_rows;
|
||||||
@ -1482,7 +1563,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
|
|
||||||
is_bool($escape) OR $escape = $this->_protect_identifiers;
|
is_bool($escape) OR $escape = $this->_protect_identifiers;
|
||||||
|
|
||||||
$keys = array_keys($this->_object_to_array(current($key)));
|
$keys = array_keys($this->_object_to_array(reset($key)));
|
||||||
sort($keys);
|
sort($keys);
|
||||||
|
|
||||||
foreach ($key as $row)
|
foreach ($key as $row)
|
||||||
@ -1563,7 +1644,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* @param string the table to insert data into
|
* @param string the table to insert data into
|
||||||
* @param array an associative array of insert values
|
* @param array an associative array of insert values
|
||||||
* @param bool $escape Whether to escape values and identifiers
|
* @param bool $escape Whether to escape values and identifiers
|
||||||
* @return object
|
* @return bool TRUE on success, FALSE on failure
|
||||||
*/
|
*/
|
||||||
public function insert($table = '', $set = NULL, $escape = NULL)
|
public function insert($table = '', $set = NULL, $escape = NULL)
|
||||||
{
|
{
|
||||||
@ -1629,7 +1710,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*
|
*
|
||||||
* @param string the table to replace data into
|
* @param string the table to replace data into
|
||||||
* @param array an associative array of insert values
|
* @param array an associative array of insert values
|
||||||
* @return object
|
* @return bool TRUE on success, FALSE on failure
|
||||||
*/
|
*/
|
||||||
public function replace($table = '', $set = NULL)
|
public function replace($table = '', $set = NULL)
|
||||||
{
|
{
|
||||||
@ -1684,7 +1765,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* Groups tables in FROM clauses if needed, so there is no confusion
|
* Groups tables in FROM clauses if needed, so there is no confusion
|
||||||
* about operator precedence.
|
* about operator precedence.
|
||||||
*
|
*
|
||||||
* Note: This is only used (and overriden) by MySQL and CUBRID.
|
* Note: This is only used (and overridden) by MySQL and CUBRID.
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
@ -1714,7 +1795,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql = $this->_update($this->protect_identifiers($this->qb_from[0], TRUE, NULL, FALSE), $this->qb_set);
|
$sql = $this->_update($this->qb_from[0], $this->qb_set);
|
||||||
|
|
||||||
if ($reset === TRUE)
|
if ($reset === TRUE)
|
||||||
{
|
{
|
||||||
@ -1735,7 +1816,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* @param array $set An associative array of update values
|
* @param array $set An associative array of update values
|
||||||
* @param mixed $where
|
* @param mixed $where
|
||||||
* @param int $limit
|
* @param int $limit
|
||||||
* @return object
|
* @return bool TRUE on success, FALSE on failure
|
||||||
*/
|
*/
|
||||||
public function update($table = '', $set = NULL, $where = NULL, $limit = NULL)
|
public function update($table = '', $set = NULL, $where = NULL, $limit = NULL)
|
||||||
{
|
{
|
||||||
@ -1762,7 +1843,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
$this->limit($limit);
|
$this->limit($limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql = $this->_update($this->protect_identifiers($this->qb_from[0], TRUE, NULL, FALSE), $this->qb_set);
|
$sql = $this->_update($this->qb_from[0], $this->qb_set);
|
||||||
$this->_reset_write();
|
$this->_reset_write();
|
||||||
return $this->query($sql);
|
return $this->query($sql);
|
||||||
}
|
}
|
||||||
@ -1779,7 +1860,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* @param string the table to update data on
|
* @param string the table to update data on
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
protected function _validate_update($table = '')
|
protected function _validate_update($table)
|
||||||
{
|
{
|
||||||
if (count($this->qb_set) === 0)
|
if (count($this->qb_set) === 0)
|
||||||
{
|
{
|
||||||
@ -1788,7 +1869,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
|
|
||||||
if ($table !== '')
|
if ($table !== '')
|
||||||
{
|
{
|
||||||
$this->qb_from[0] = $table;
|
$this->qb_from = array($this->protect_identifiers($table, TRUE, NULL, FALSE));
|
||||||
}
|
}
|
||||||
elseif ( ! isset($this->qb_from[0]))
|
elseif ( ! isset($this->qb_from[0]))
|
||||||
{
|
{
|
||||||
@ -1810,7 +1891,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* @param string the where key
|
* @param string the where key
|
||||||
* @return int number of rows affected or FALSE on failure
|
* @return int number of rows affected or FALSE on failure
|
||||||
*/
|
*/
|
||||||
public function update_batch($table = '', $set = NULL, $index = NULL)
|
public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 100)
|
||||||
{
|
{
|
||||||
// Combine any cached components with the current statements
|
// Combine any cached components with the current statements
|
||||||
$this->_merge_cache();
|
$this->_merge_cache();
|
||||||
@ -1820,17 +1901,24 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
return ($this->db_debug) ? $this->display_error('db_must_use_index') : FALSE;
|
return ($this->db_debug) ? $this->display_error('db_must_use_index') : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($set !== NULL)
|
if ($set === NULL)
|
||||||
{
|
{
|
||||||
$this->set_update_batch($set, $index);
|
if (empty($this->qb_set_ub))
|
||||||
}
|
|
||||||
|
|
||||||
if (count($this->qb_set) === 0)
|
|
||||||
{
|
{
|
||||||
return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE;
|
return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (empty($set))
|
||||||
|
{
|
||||||
|
return ($this->db_debug) ? $this->display_error('update_batch() called with no data') : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if ($table === '')
|
$this->set_update_batch($set, $index);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen($table) === 0)
|
||||||
{
|
{
|
||||||
if ( ! isset($this->qb_from[0]))
|
if ( ! isset($this->qb_from[0]))
|
||||||
{
|
{
|
||||||
@ -1842,10 +1930,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
|
|
||||||
// Batch this baby
|
// Batch this baby
|
||||||
$affected_rows = 0;
|
$affected_rows = 0;
|
||||||
for ($i = 0, $total = count($this->qb_set); $i < $total; $i += 100)
|
for ($i = 0, $total = count($this->qb_set_ub); $i < $total; $i += $batch_size)
|
||||||
|
{
|
||||||
|
if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set_ub, $i, $batch_size), $index)))
|
||||||
{
|
{
|
||||||
$this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set, $i, 100), $this->protect_identifiers($index)));
|
|
||||||
$affected_rows += $this->affected_rows();
|
$affected_rows += $this->affected_rows();
|
||||||
|
}
|
||||||
|
|
||||||
$this->qb_where = array();
|
$this->qb_where = array();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1870,13 +1961,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
$ids = array();
|
$ids = array();
|
||||||
foreach ($values as $key => $val)
|
foreach ($values as $key => $val)
|
||||||
{
|
{
|
||||||
$ids[] = $val[$index];
|
$ids[] = $val[$index]['value'];
|
||||||
|
|
||||||
foreach (array_keys($val) as $field)
|
foreach (array_keys($val) as $field)
|
||||||
{
|
{
|
||||||
if ($field !== $index)
|
if ($field !== $index)
|
||||||
{
|
{
|
||||||
$final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
|
$final[$val[$field]['field']][] = 'WHEN '.$val[$index]['field'].' = '.$val[$index]['value'].' THEN '.$val[$field]['value'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1889,7 +1980,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
.'ELSE '.$k.' END, ';
|
.'ELSE '.$k.' END, ';
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE);
|
$this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE);
|
||||||
|
|
||||||
return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');
|
return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');
|
||||||
}
|
}
|
||||||
@ -1926,7 +2017,10 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
$index_set = TRUE;
|
$index_set = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
$clean[$this->protect_identifiers($k2, FALSE, $escape)] = ($escape === FALSE) ? $v2 : $this->escape($v2);
|
$clean[$k2] = array(
|
||||||
|
'field' => $this->protect_identifiers($k2, FALSE, $escape),
|
||||||
|
'value' => ($escape === FALSE ? $v2 : $this->escape($v2))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($index_set === FALSE)
|
if ($index_set === FALSE)
|
||||||
@ -1934,7 +2028,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
return $this->display_error('db_batch_missing_index');
|
return $this->display_error('db_batch_missing_index');
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->qb_set[] = $clean;
|
$this->qb_set_ub[] = $clean;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
@ -1948,7 +2042,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* Compiles a delete string and runs "DELETE FROM table"
|
* Compiles a delete string and runs "DELETE FROM table"
|
||||||
*
|
*
|
||||||
* @param string the table to empty
|
* @param string the table to empty
|
||||||
* @return object
|
* @return bool TRUE on success, FALSE on failure
|
||||||
*/
|
*/
|
||||||
public function empty_table($table = '')
|
public function empty_table($table = '')
|
||||||
{
|
{
|
||||||
@ -1981,7 +2075,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
* This function maps to "DELETE FROM table"
|
* This function maps to "DELETE FROM table"
|
||||||
*
|
*
|
||||||
* @param string the table to truncate
|
* @param string the table to truncate
|
||||||
* @return object
|
* @return bool TRUE on success, FALSE on failure
|
||||||
*/
|
*/
|
||||||
public function truncate($table = '')
|
public function truncate($table = '')
|
||||||
{
|
{
|
||||||
@ -2070,10 +2164,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
}
|
}
|
||||||
elseif (is_array($table))
|
elseif (is_array($table))
|
||||||
{
|
{
|
||||||
|
empty($where) && $reset_data = FALSE;
|
||||||
|
|
||||||
foreach ($table as $single_table)
|
foreach ($table as $single_table)
|
||||||
{
|
{
|
||||||
$this->delete($single_table, $where, $limit, $reset_data);
|
$this->delete($single_table, $where, $limit, $reset_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2118,7 +2215,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
protected function _delete($table)
|
protected function _delete($table)
|
||||||
{
|
{
|
||||||
return 'DELETE FROM '.$table.$this->_compile_wh('qb_where')
|
return 'DELETE FROM '.$table.$this->_compile_wh('qb_where')
|
||||||
.($this->qb_limit ? ' LIMIT '.$this->qb_limit : '');
|
.($this->qb_limit !== FALSE ? ' LIMIT '.$this->qb_limit : '');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -2194,9 +2291,14 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
$table = trim(strrchr($table, ' '));
|
$table = trim(strrchr($table, ' '));
|
||||||
|
|
||||||
// Store the alias, if it doesn't already exist
|
// Store the alias, if it doesn't already exist
|
||||||
if ( ! in_array($table, $this->qb_aliased_tables))
|
if ( ! in_array($table, $this->qb_aliased_tables, TRUE))
|
||||||
{
|
{
|
||||||
$this->qb_aliased_tables[] = $table;
|
$this->qb_aliased_tables[] = $table;
|
||||||
|
if ($this->qb_caching === TRUE && ! in_array($table, $this->qb_cache_aliased_tables, TRUE))
|
||||||
|
{
|
||||||
|
$this->qb_cache_aliased_tables[] = $table;
|
||||||
|
$this->qb_cache_exists[] = 'aliased_tables';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2233,7 +2335,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Cycle through the "select" portion of the query and prep each column name.
|
// Cycle through the "select" portion of the query and prep each column name.
|
||||||
// The reason we protect identifiers here rather then in the select() function
|
// The reason we protect identifiers here rather than in the select() function
|
||||||
// is because until the user calls the from() function we don't know if there are aliases
|
// is because until the user calls the from() function we don't know if there are aliases
|
||||||
foreach ($this->qb_select as $key => $val)
|
foreach ($this->qb_select as $key => $val)
|
||||||
{
|
{
|
||||||
@ -2263,7 +2365,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
.$this->_compile_order_by(); // ORDER BY
|
.$this->_compile_order_by(); // ORDER BY
|
||||||
|
|
||||||
// LIMIT
|
// LIMIT
|
||||||
if ($this->qb_limit)
|
if ($this->qb_limit !== FALSE OR $this->qb_offset)
|
||||||
{
|
{
|
||||||
return $this->_limit($sql."\n");
|
return $this->_limit($sql."\n");
|
||||||
}
|
}
|
||||||
@ -2278,7 +2380,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*
|
*
|
||||||
* Escapes identifiers in WHERE and HAVING statements at execution time.
|
* Escapes identifiers in WHERE and HAVING statements at execution time.
|
||||||
*
|
*
|
||||||
* Required so that aliases are tracked properly, regardless of wether
|
* Required so that aliases are tracked properly, regardless of whether
|
||||||
* where(), or_where(), having(), or_having are called prior to from(),
|
* where(), or_where(), having(), or_having are called prior to from(),
|
||||||
* join() and dbprefix is added only if needed.
|
* join() and dbprefix is added only if needed.
|
||||||
*
|
*
|
||||||
@ -2298,13 +2400,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
}
|
}
|
||||||
elseif ($this->{$qb_key}[$i]['escape'] === FALSE)
|
elseif ($this->{$qb_key}[$i]['escape'] === FALSE)
|
||||||
{
|
{
|
||||||
$this->{$qb_key}[$i] = $this->{$qb_key}[$i]['condition'];
|
$this->{$qb_key}[$i] = $this->{$qb_key}[$i]['condition'].(isset($this->{$qb_key}[$i]['value']) ? ' '.$this->{$qb_key}[$i]['value'] : '');
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Split multiple conditions
|
// Split multiple conditions
|
||||||
$conditions = preg_split(
|
$conditions = preg_split(
|
||||||
'/(\s*AND\s+|\s*OR\s+)/i',
|
'/((?:^|\s+)AND\s+|(?:^|\s+)OR\s+)/i',
|
||||||
$this->{$qb_key}[$i]['condition'],
|
$this->{$qb_key}[$i]['condition'],
|
||||||
-1,
|
-1,
|
||||||
PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
|
PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
|
||||||
@ -2337,7 +2439,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
.' '.trim($matches[3]).$matches[4].$matches[5];
|
.' '.trim($matches[3]).$matches[4].$matches[5];
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->{$qb_key}[$i] = implode('', $conditions);
|
$this->{$qb_key}[$i] = implode('', $conditions).(isset($this->{$qb_key}[$i]['value']) ? ' '.$this->{$qb_key}[$i]['value'] : '');
|
||||||
}
|
}
|
||||||
|
|
||||||
return ($qb_key === 'qb_having' ? "\nHAVING " : "\nWHERE ")
|
return ($qb_key === 'qb_having' ? "\nHAVING " : "\nWHERE ")
|
||||||
@ -2354,7 +2456,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*
|
*
|
||||||
* Escapes identifiers in GROUP BY statements at execution time.
|
* Escapes identifiers in GROUP BY statements at execution time.
|
||||||
*
|
*
|
||||||
* Required so that aliases are tracked properly, regardless of wether
|
* Required so that aliases are tracked properly, regardless of whether
|
||||||
* group_by() is called prior to from(), join() and dbprefix is added
|
* group_by() is called prior to from(), join() and dbprefix is added
|
||||||
* only if needed.
|
* only if needed.
|
||||||
*
|
*
|
||||||
@ -2390,7 +2492,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*
|
*
|
||||||
* Escapes identifiers in ORDER BY statements at execution time.
|
* Escapes identifiers in ORDER BY statements at execution time.
|
||||||
*
|
*
|
||||||
* Required so that aliases are tracked properly, regardless of wether
|
* Required so that aliases are tracked properly, regardless of whether
|
||||||
* order_by() is called prior to from(), join() and dbprefix is added
|
* order_by() is called prior to from(), join() and dbprefix is added
|
||||||
* only if needed.
|
* only if needed.
|
||||||
*
|
*
|
||||||
@ -2398,10 +2500,18 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*/
|
*/
|
||||||
protected function _compile_order_by()
|
protected function _compile_order_by()
|
||||||
{
|
{
|
||||||
if (is_array($this->qb_orderby) && count($this->qb_orderby) > 0)
|
if (empty($this->qb_orderby))
|
||||||
{
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
for ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++)
|
for ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++)
|
||||||
{
|
{
|
||||||
|
if (is_string($this->qb_orderby[$i]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->qb_orderby[$i]['escape'] !== FALSE && ! $this->_is_literal($this->qb_orderby[$i]['field']))
|
if ($this->qb_orderby[$i]['escape'] !== FALSE && ! $this->_is_literal($this->qb_orderby[$i]['field']))
|
||||||
{
|
{
|
||||||
$this->qb_orderby[$i]['field'] = $this->protect_identifiers($this->qb_orderby[$i]['field']);
|
$this->qb_orderby[$i]['field'] = $this->protect_identifiers($this->qb_orderby[$i]['field']);
|
||||||
@ -2410,14 +2520,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
$this->qb_orderby[$i] = $this->qb_orderby[$i]['field'].$this->qb_orderby[$i]['direction'];
|
$this->qb_orderby[$i] = $this->qb_orderby[$i]['field'].$this->qb_orderby[$i]['direction'];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->qb_orderby = "\nORDER BY ".implode(', ', $this->qb_orderby);
|
return "\nORDER BY ".implode(', ', $this->qb_orderby);
|
||||||
}
|
|
||||||
elseif (is_string($this->qb_orderby))
|
|
||||||
{
|
|
||||||
return $this->qb_orderby;
|
|
||||||
}
|
|
||||||
|
|
||||||
return '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -2494,11 +2597,12 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*
|
*
|
||||||
* Starts QB caching
|
* Starts QB caching
|
||||||
*
|
*
|
||||||
* @return void
|
* @return CI_DB_query_builder
|
||||||
*/
|
*/
|
||||||
public function start_cache()
|
public function start_cache()
|
||||||
{
|
{
|
||||||
$this->qb_caching = TRUE;
|
$this->qb_caching = TRUE;
|
||||||
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -2508,11 +2612,12 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*
|
*
|
||||||
* Stops QB caching
|
* Stops QB caching
|
||||||
*
|
*
|
||||||
* @return void
|
* @return CI_DB_query_builder
|
||||||
*/
|
*/
|
||||||
public function stop_cache()
|
public function stop_cache()
|
||||||
{
|
{
|
||||||
$this->qb_caching = FALSE;
|
$this->qb_caching = FALSE;
|
||||||
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -2522,7 +2627,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*
|
*
|
||||||
* Empties the QB cache
|
* Empties the QB cache
|
||||||
*
|
*
|
||||||
* @return void
|
* @return CI_DB_query_builder
|
||||||
*/
|
*/
|
||||||
public function flush_cache()
|
public function flush_cache()
|
||||||
{
|
{
|
||||||
@ -2536,8 +2641,11 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
'qb_cache_orderby' => array(),
|
'qb_cache_orderby' => array(),
|
||||||
'qb_cache_set' => array(),
|
'qb_cache_set' => array(),
|
||||||
'qb_cache_exists' => array(),
|
'qb_cache_exists' => array(),
|
||||||
'qb_cache_no_escape' => array()
|
'qb_cache_no_escape' => array(),
|
||||||
|
'qb_cache_aliased_tables' => array()
|
||||||
));
|
));
|
||||||
|
|
||||||
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -2585,13 +2693,6 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
$this->qb_no_escape = $qb_no_escape;
|
$this->qb_no_escape = $qb_no_escape;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we are "protecting identifiers" we need to examine the "from"
|
|
||||||
// portion of the query to determine if there are any aliases
|
|
||||||
if ($this->_protect_identifiers === TRUE && count($this->qb_cache_from) > 0)
|
|
||||||
{
|
|
||||||
$this->_track_aliases($this->qb_from);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -2631,12 +2732,13 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
*
|
*
|
||||||
* Publicly-visible method to reset the QB values.
|
* Publicly-visible method to reset the QB values.
|
||||||
*
|
*
|
||||||
* @return void
|
* @return CI_DB_query_builder
|
||||||
*/
|
*/
|
||||||
public function reset_query()
|
public function reset_query()
|
||||||
{
|
{
|
||||||
$this->_reset_select();
|
$this->_reset_select();
|
||||||
$this->_reset_write();
|
$this->_reset_write();
|
||||||
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -2677,8 +2779,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
'qb_distinct' => FALSE,
|
'qb_distinct' => FALSE,
|
||||||
'qb_limit' => FALSE,
|
'qb_limit' => FALSE,
|
||||||
'qb_offset' => FALSE
|
'qb_offset' => FALSE
|
||||||
)
|
));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -2694,17 +2795,14 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
|
|||||||
{
|
{
|
||||||
$this->_reset_run(array(
|
$this->_reset_run(array(
|
||||||
'qb_set' => array(),
|
'qb_set' => array(),
|
||||||
|
'qb_set_ub' => array(),
|
||||||
'qb_from' => array(),
|
'qb_from' => array(),
|
||||||
'qb_join' => array(),
|
'qb_join' => array(),
|
||||||
'qb_where' => array(),
|
'qb_where' => array(),
|
||||||
'qb_orderby' => array(),
|
'qb_orderby' => array(),
|
||||||
'qb_keys' => array(),
|
'qb_keys' => array(),
|
||||||
'qb_limit' => FALSE
|
'qb_limit' => FALSE
|
||||||
)
|
));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file DB_query_builder.php */
|
|
||||||
/* Location: ./system/database/DB_query_builder.php */
|
|
67
system/database/DB_result.php
Executable file → Normal file
67
system/database/DB_result.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -35,7 +46,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_result {
|
class CI_DB_result {
|
||||||
|
|
||||||
@ -152,11 +163,9 @@ class CI_DB_result {
|
|||||||
{
|
{
|
||||||
return $this->result_object();
|
return $this->result_object();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
return $this->custom_result_object($type);
|
return $this->custom_result_object($type);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
@ -325,7 +334,8 @@ class CI_DB_result {
|
|||||||
|
|
||||||
if ($type === 'object') return $this->row_object($n);
|
if ($type === 'object') return $this->row_object($n);
|
||||||
elseif ($type === 'array') return $this->row_array($n);
|
elseif ($type === 'array') return $this->row_array($n);
|
||||||
else return $this->custom_row_object($n, $type);
|
|
||||||
|
return $this->custom_row_object($n, $type);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -545,7 +555,7 @@ class CI_DB_result {
|
|||||||
/**
|
/**
|
||||||
* Number of fields in the result set
|
* Number of fields in the result set
|
||||||
*
|
*
|
||||||
* Overriden by driver result classes.
|
* Overridden by driver result classes.
|
||||||
*
|
*
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
@ -561,7 +571,7 @@ class CI_DB_result {
|
|||||||
*
|
*
|
||||||
* Generates an array of column names.
|
* Generates an array of column names.
|
||||||
*
|
*
|
||||||
* Overriden by driver result classes.
|
* Overridden by driver result classes.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@ -577,7 +587,7 @@ class CI_DB_result {
|
|||||||
*
|
*
|
||||||
* Generates an array of objects containing field meta-data.
|
* Generates an array of objects containing field meta-data.
|
||||||
*
|
*
|
||||||
* Overriden by driver result classes.
|
* Overridden by driver result classes.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@ -591,7 +601,7 @@ class CI_DB_result {
|
|||||||
/**
|
/**
|
||||||
* Free the result
|
* Free the result
|
||||||
*
|
*
|
||||||
* Overriden by driver result classes.
|
* Overridden by driver result classes.
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@ -609,7 +619,7 @@ class CI_DB_result {
|
|||||||
* this internally before fetching results to make sure the
|
* this internally before fetching results to make sure the
|
||||||
* result set starts at zero.
|
* result set starts at zero.
|
||||||
*
|
*
|
||||||
* Overriden by driver result classes.
|
* Overridden by driver result classes.
|
||||||
*
|
*
|
||||||
* @param int $n
|
* @param int $n
|
||||||
* @return bool
|
* @return bool
|
||||||
@ -626,7 +636,7 @@ class CI_DB_result {
|
|||||||
*
|
*
|
||||||
* Returns the result set as an array.
|
* Returns the result set as an array.
|
||||||
*
|
*
|
||||||
* Overriden by driver result classes.
|
* Overridden by driver result classes.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@ -642,17 +652,14 @@ class CI_DB_result {
|
|||||||
*
|
*
|
||||||
* Returns the result set as an object.
|
* Returns the result set as an object.
|
||||||
*
|
*
|
||||||
* Overriden by driver result classes.
|
* Overridden by driver result classes.
|
||||||
*
|
*
|
||||||
* @param string $class_name
|
* @param string $class_name
|
||||||
* @return object
|
* @return object
|
||||||
*/
|
*/
|
||||||
protected function _fetch_object($class_name = 'stdClass')
|
protected function _fetch_object($class_name = 'stdClass')
|
||||||
{
|
{
|
||||||
return array();
|
return new $class_name();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file DB_result.php */
|
|
||||||
/* Location: ./system/database/DB_result.php */
|
|
55
system/database/DB_utility.php
Executable file → Normal file
55
system/database/DB_utility.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
abstract class CI_DB_utility {
|
abstract class CI_DB_utility {
|
||||||
|
|
||||||
@ -76,7 +87,7 @@ abstract class CI_DB_utility {
|
|||||||
public function __construct(&$db)
|
public function __construct(&$db)
|
||||||
{
|
{
|
||||||
$this->db =& $db;
|
$this->db =& $db;
|
||||||
log_message('debug', 'Database Utility Class Initialized');
|
log_message('info', 'Database Utility Class Initialized');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -238,16 +249,17 @@ abstract class CI_DB_utility {
|
|||||||
$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
|
$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
|
||||||
}
|
}
|
||||||
|
|
||||||
$out = substr(rtrim($out), 0, -strlen($delim)).$newline;
|
$out = substr($out, 0, -strlen($delim)).$newline;
|
||||||
|
|
||||||
// Next blast through the result array and build out the rows
|
// Next blast through the result array and build out the rows
|
||||||
while ($row = $query->unbuffered_row('array'))
|
while ($row = $query->unbuffered_row('array'))
|
||||||
{
|
{
|
||||||
|
$line = array();
|
||||||
foreach ($row as $item)
|
foreach ($row as $item)
|
||||||
{
|
{
|
||||||
$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;
|
$line[] = $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure;
|
||||||
}
|
}
|
||||||
$out = substr(rtrim($out), 0, -strlen($delim)).$newline;
|
$out .= implode($delim, $line).$newline;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $out;
|
return $out;
|
||||||
@ -305,7 +317,7 @@ abstract class CI_DB_utility {
|
|||||||
* Database Backup
|
* Database Backup
|
||||||
*
|
*
|
||||||
* @param array $params
|
* @param array $params
|
||||||
* @return void
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function backup($params = array())
|
public function backup($params = array())
|
||||||
{
|
{
|
||||||
@ -410,6 +422,3 @@ abstract class CI_DB_utility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file DB_utility.php */
|
|
||||||
/* Location: ./system/database/DB_utility.php */
|
|
104
system/database/drivers/cubrid/cubrid_driver.php
Executable file → Normal file
104
system/database/drivers/cubrid/cubrid_driver.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 2.1
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 2.1.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -37,7 +48,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author Esen Sagynov
|
* @author Esen Sagynov
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_cubrid_driver extends CI_DB {
|
class CI_DB_cubrid_driver extends CI_DB {
|
||||||
|
|
||||||
@ -152,10 +163,6 @@ class CI_DB_cubrid_driver extends CI_DB {
|
|||||||
{
|
{
|
||||||
return $this->data_cache['version'];
|
return $this->data_cache['version'];
|
||||||
}
|
}
|
||||||
elseif ( ! $this->conn_id)
|
|
||||||
{
|
|
||||||
$this->initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
return ( ! $this->conn_id OR ($version = cubrid_get_server_info($this->conn_id)) === FALSE)
|
return ( ! $this->conn_id OR ($version = cubrid_get_server_info($this->conn_id)) === FALSE)
|
||||||
? FALSE
|
? FALSE
|
||||||
@ -180,25 +187,17 @@ class CI_DB_cubrid_driver extends CI_DB {
|
|||||||
/**
|
/**
|
||||||
* Begin Transaction
|
* Begin Transaction
|
||||||
*
|
*
|
||||||
* @param bool $test_mode
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_begin($test_mode = FALSE)
|
protected function _trans_begin()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
if (($autocommit = cubrid_get_autocommit($this->conn_id)) === NULL)
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
{
|
||||||
return TRUE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
elseif ($autocommit === 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);
|
|
||||||
|
|
||||||
if (cubrid_get_autocommit($this->conn_id))
|
|
||||||
{
|
{
|
||||||
cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE);
|
return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -211,19 +210,16 @@ class CI_DB_cubrid_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_commit()
|
protected function _trans_commit()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
if ( ! cubrid_commit($this->conn_id))
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
{
|
||||||
return TRUE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
cubrid_commit($this->conn_id);
|
|
||||||
|
|
||||||
if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
|
if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
|
||||||
{
|
{
|
||||||
cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
|
return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -236,16 +232,13 @@ class CI_DB_cubrid_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_rollback()
|
protected function _trans_rollback()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
if ( ! cubrid_rollback($this->conn_id))
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
{
|
||||||
return TRUE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
cubrid_rollback($this->conn_id);
|
|
||||||
|
|
||||||
if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
|
if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id))
|
||||||
{
|
{
|
||||||
cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
|
cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE);
|
||||||
@ -257,23 +250,16 @@ class CI_DB_cubrid_driver extends CI_DB {
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Platform-dependant string escape
|
* Platform-dependent string escape
|
||||||
*
|
*
|
||||||
* @param string
|
* @param string
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected function _escape_str($str)
|
protected function _escape_str($str)
|
||||||
{
|
|
||||||
if (function_exists('cubrid_real_escape_string') &&
|
|
||||||
(is_resource($this->conn_id)
|
|
||||||
OR (get_resource_type($this->conn_id) === 'Unknown' && preg_match('/Resource id #/', strval($this->conn_id)))))
|
|
||||||
{
|
{
|
||||||
return cubrid_real_escape_string($str, $this->conn_id);
|
return cubrid_real_escape_string($str, $this->conn_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return addslashes($str);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -343,13 +329,8 @@ class CI_DB_cubrid_driver extends CI_DB {
|
|||||||
* @param string $table
|
* @param string $table
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function field_data($table = '')
|
public function field_data($table)
|
||||||
{
|
{
|
||||||
if ($table === '')
|
|
||||||
{
|
|
||||||
return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)
|
if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -380,7 +361,7 @@ class CI_DB_cubrid_driver extends CI_DB {
|
|||||||
* Error
|
* Error
|
||||||
*
|
*
|
||||||
* Returns an array containing code and message of the last
|
* Returns an array containing code and message of the last
|
||||||
* database error that has occured.
|
* database error that has occurred.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@ -422,6 +403,3 @@ class CI_DB_cubrid_driver extends CI_DB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file cubrid_driver.php */
|
|
||||||
/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */
|
|
47
system/database/drivers/cubrid/cubrid_forge.php
Executable file → Normal file
47
system/database/drivers/cubrid/cubrid_forge.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 2.1
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 2.1.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author Esen Sagynov
|
* @author Esen Sagynov
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_cubrid_forge extends CI_DB_forge {
|
class CI_DB_cubrid_forge extends CI_DB_forge {
|
||||||
|
|
||||||
@ -167,6 +178,9 @@ class CI_DB_cubrid_forge extends CI_DB_forge {
|
|||||||
$attributes['TYPE'] = 'INTEGER';
|
$attributes['TYPE'] = 'INTEGER';
|
||||||
$attributes['UNSIGNED'] = FALSE;
|
$attributes['UNSIGNED'] = FALSE;
|
||||||
return;
|
return;
|
||||||
|
case 'LONGTEXT':
|
||||||
|
$attributes['TYPE'] = 'STRING';
|
||||||
|
return;
|
||||||
default: return;
|
default: return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -214,6 +228,3 @@ class CI_DB_cubrid_forge extends CI_DB_forge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file cubrid_forge.php */
|
|
||||||
/* Location: ./system/database/drivers/cubrid/cubrid_forge.php */
|
|
45
system/database/drivers/cubrid/cubrid_result.php
Executable file → Normal file
45
system/database/drivers/cubrid/cubrid_result.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 2.1
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 2.1.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -33,8 +44,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author Esen Sagynov
|
* @author Esen Sagynov
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
* @since 2.1
|
|
||||||
*/
|
*/
|
||||||
class CI_DB_cubrid_result extends CI_DB_result {
|
class CI_DB_cubrid_result extends CI_DB_result {
|
||||||
|
|
||||||
@ -165,6 +175,3 @@ class CI_DB_cubrid_result extends CI_DB_result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file cubrid_result.php */
|
|
||||||
/* Location: ./system/database/drivers/cubrid/cubrid_result.php */
|
|
44
system/database/drivers/cubrid/cubrid_utility.php
Executable file → Normal file
44
system/database/drivers/cubrid/cubrid_utility.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 2.1
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 2.1.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author Esen Sagynov
|
* @author Esen Sagynov
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_cubrid_utility extends CI_DB_utility {
|
class CI_DB_cubrid_utility extends CI_DB_utility {
|
||||||
|
|
||||||
@ -66,6 +77,3 @@ class CI_DB_cubrid_utility extends CI_DB_utility {
|
|||||||
return $this->db->display_error('db_unsupported_feature');
|
return $this->db->display_error('db_unsupported_feature');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file cubrid_utility.php */
|
|
||||||
/* Location: ./system/database/drivers/cubrid/cubrid_utility.php */
|
|
1
system/database/drivers/cubrid/index.html
Executable file → Normal file
1
system/database/drivers/cubrid/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
||||||
|
110
system/database/drivers/ibase/ibase_driver.php
Executable file → Normal file
110
system/database/drivers/ibase/ibase_driver.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 3.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 3.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -37,7 +48,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_ibase_driver extends CI_DB {
|
class CI_DB_ibase_driver extends CI_DB {
|
||||||
|
|
||||||
@ -115,7 +126,7 @@ class CI_DB_ibase_driver extends CI_DB {
|
|||||||
*/
|
*/
|
||||||
protected function _execute($sql)
|
protected function _execute($sql)
|
||||||
{
|
{
|
||||||
return ibase_query($this->conn_id, $sql);
|
return ibase_query(isset($this->_ibase_trans) ? $this->_ibase_trans : $this->conn_id, $sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -123,24 +134,16 @@ class CI_DB_ibase_driver extends CI_DB {
|
|||||||
/**
|
/**
|
||||||
* Begin Transaction
|
* Begin Transaction
|
||||||
*
|
*
|
||||||
* @param bool $test_mode
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_begin($test_mode = FALSE)
|
protected function _trans_begin()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
if (($trans_handle = ibase_trans($this->conn_id)) === FALSE)
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
{
|
||||||
return TRUE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset the transaction failure flag.
|
$this->_ibase_trans = $trans_handle;
|
||||||
// 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);
|
|
||||||
|
|
||||||
$this->_ibase_trans = ibase_trans($this->conn_id);
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,15 +154,15 @@ class CI_DB_ibase_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_commit()
|
protected function _trans_commit()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
if (ibase_commit($this->_ibase_trans))
|
||||||
if ( ! $this->trans_enabled OR $this->_trans->depth > 0)
|
|
||||||
{
|
{
|
||||||
|
$this->_ibase_trans = NULL;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ibase_commit($this->_ibase_trans);
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -169,15 +172,15 @@ class CI_DB_ibase_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_rollback()
|
protected function _trans_rollback()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
if (ibase_rollback($this->_ibase_trans))
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
{
|
||||||
|
$this->_ibase_trans = NULL;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ibase_rollback($this->_ibase_trans);
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -219,11 +222,11 @@ class CI_DB_ibase_driver extends CI_DB {
|
|||||||
*/
|
*/
|
||||||
protected function _list_tables($prefix_limit = FALSE)
|
protected function _list_tables($prefix_limit = FALSE)
|
||||||
{
|
{
|
||||||
$sql = 'SELECT "RDB$RELATION_NAME" FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\'';
|
$sql = 'SELECT TRIM("RDB$RELATION_NAME") AS TABLE_NAME FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\'';
|
||||||
|
|
||||||
if ($prefix_limit !== FALSE && $this->dbprefix !== '')
|
if ($prefix_limit !== FALSE && $this->dbprefix !== '')
|
||||||
{
|
{
|
||||||
return $sql.' AND "RDB$RELATION_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' "
|
return $sql.' AND TRIM("RDB$RELATION_NAME") AS TABLE_NAME LIKE \''.$this->escape_like_str($this->dbprefix)."%' "
|
||||||
.sprintf($this->_like_escape_str, $this->_like_escape_chr);
|
.sprintf($this->_like_escape_str, $this->_like_escape_chr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,7 +245,7 @@ class CI_DB_ibase_driver extends CI_DB {
|
|||||||
*/
|
*/
|
||||||
protected function _list_columns($table = '')
|
protected function _list_columns($table = '')
|
||||||
{
|
{
|
||||||
return 'SELECT "RDB$FIELD_NAME" FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table);
|
return 'SELECT TRIM("RDB$FIELD_NAME") AS COLUMN_NAME FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -253,13 +256,8 @@ class CI_DB_ibase_driver extends CI_DB {
|
|||||||
* @param string $table
|
* @param string $table
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function field_data($table = '')
|
public function field_data($table)
|
||||||
{
|
{
|
||||||
if ($table === '')
|
|
||||||
{
|
|
||||||
return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name",
|
$sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name",
|
||||||
CASE "fields"."RDB$FIELD_TYPE"
|
CASE "fields"."RDB$FIELD_TYPE"
|
||||||
WHEN 7 THEN \'SMALLINT\'
|
WHEN 7 THEN \'SMALLINT\'
|
||||||
@ -296,7 +294,7 @@ class CI_DB_ibase_driver extends CI_DB {
|
|||||||
* Error
|
* Error
|
||||||
*
|
*
|
||||||
* Returns an array containing code and message of the last
|
* Returns an array containing code and message of the last
|
||||||
* database error that has occured.
|
* database error that has occurred.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@ -385,6 +383,23 @@ class CI_DB_ibase_driver extends CI_DB {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert batch statement
|
||||||
|
*
|
||||||
|
* Generates a platform-specific insert string from the supplied data.
|
||||||
|
*
|
||||||
|
* @param string $table Table name
|
||||||
|
* @param array $keys INSERT keys
|
||||||
|
* @param array $values INSERT values
|
||||||
|
* @return string|bool
|
||||||
|
*/
|
||||||
|
protected function _insert_batch($table, $keys, $values)
|
||||||
|
{
|
||||||
|
return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close DB Connection
|
* Close DB Connection
|
||||||
*
|
*
|
||||||
@ -396,6 +411,3 @@ class CI_DB_ibase_driver extends CI_DB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file ibase_driver.php */
|
|
||||||
/* Location: ./system/database/drivers/ibase/ibase_driver.php */
|
|
48
system/database/drivers/ibase/ibase_forge.php
Executable file → Normal file
48
system/database/drivers/ibase/ibase_forge.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 3.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 3.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_ibase_forge extends CI_DB_forge {
|
class CI_DB_ibase_forge extends CI_DB_forge {
|
||||||
|
|
||||||
@ -80,7 +91,7 @@ class CI_DB_ibase_forge extends CI_DB_forge {
|
|||||||
* Create database
|
* Create database
|
||||||
*
|
*
|
||||||
* @param string $db_name
|
* @param string $db_name
|
||||||
* @return string
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function create_database($db_name)
|
public function create_database($db_name)
|
||||||
{
|
{
|
||||||
@ -100,7 +111,7 @@ class CI_DB_ibase_forge extends CI_DB_forge {
|
|||||||
* @param string $db_name (ignored)
|
* @param string $db_name (ignored)
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function drop_database($db_name = '')
|
public function drop_database($db_name)
|
||||||
{
|
{
|
||||||
if ( ! ibase_drop_db($this->conn_id))
|
if ( ! ibase_drop_db($this->conn_id))
|
||||||
{
|
{
|
||||||
@ -238,6 +249,3 @@ class CI_DB_ibase_forge extends CI_DB_forge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file ibase_forge.php */
|
|
||||||
/* Location: ./system/database/drivers/ibase/ibase_forge.php */
|
|
45
system/database/drivers/ibase/ibase_result.php
Executable file → Normal file
45
system/database/drivers/ibase/ibase_result.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 3.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -33,8 +44,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
* @since 3.0
|
|
||||||
*/
|
*/
|
||||||
class CI_DB_ibase_result extends CI_DB_result {
|
class CI_DB_ibase_result extends CI_DB_result {
|
||||||
|
|
||||||
@ -149,6 +159,3 @@ class CI_DB_ibase_result extends CI_DB_result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file ibase_result.php */
|
|
||||||
/* Location: ./system/database/drivers/ibase/ibase_result.php */
|
|
44
system/database/drivers/ibase/ibase_utility.php
Executable file → Normal file
44
system/database/drivers/ibase/ibase_utility.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 3.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 3.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_ibase_utility extends CI_DB_utility {
|
class CI_DB_ibase_utility extends CI_DB_utility {
|
||||||
|
|
||||||
@ -56,6 +67,3 @@ class CI_DB_ibase_utility extends CI_DB_utility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file ibase_utility.php */
|
|
||||||
/* Location: ./system/database/drivers/ibase/ibase_utility.php */
|
|
1
system/database/drivers/ibase/index.html
Executable file → Normal file
1
system/database/drivers/ibase/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
||||||
|
1
system/database/drivers/index.html
Executable file → Normal file
1
system/database/drivers/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
||||||
|
1
system/database/drivers/mssql/index.html
Executable file → Normal file
1
system/database/drivers/mssql/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
||||||
|
110
system/database/drivers/mssql/mssql_driver.php
Executable file → Normal file
110
system/database/drivers/mssql/mssql_driver.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -37,7 +48,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_mssql_driver extends CI_DB {
|
class CI_DB_mssql_driver extends CI_DB {
|
||||||
|
|
||||||
@ -143,10 +154,11 @@ class CI_DB_mssql_driver extends CI_DB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Note: Escaping is required in the event that the DB name
|
// Note: Escaping is required in the event that the DB name
|
||||||
// contains reserved characters
|
// contains reserved characters.
|
||||||
if (mssql_select_db($this->escape_identifiers($database), $this->conn_id))
|
if (mssql_select_db('['.$database.']', $this->conn_id))
|
||||||
{
|
{
|
||||||
$this->database = $database;
|
$this->database = $database;
|
||||||
|
$this->data_cache = array();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,22 +183,10 @@ class CI_DB_mssql_driver extends CI_DB {
|
|||||||
/**
|
/**
|
||||||
* Begin Transaction
|
* Begin Transaction
|
||||||
*
|
*
|
||||||
* @param bool $test_mode
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_begin($test_mode = FALSE)
|
protected function _trans_begin()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $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);
|
|
||||||
|
|
||||||
return $this->simple_query('BEGIN TRAN');
|
return $this->simple_query('BEGIN TRAN');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,14 +197,8 @@ class CI_DB_mssql_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_commit()
|
protected function _trans_commit()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->simple_query('COMMIT TRAN');
|
return $this->simple_query('COMMIT TRAN');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,14 +209,8 @@ class CI_DB_mssql_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_rollback()
|
protected function _trans_rollback()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->simple_query('ROLLBACK TRAN');
|
return $this->simple_query('ROLLBACK TRAN');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,7 +268,7 @@ class CI_DB_mssql_driver extends CI_DB {
|
|||||||
*/
|
*/
|
||||||
protected function _version()
|
protected function _version()
|
||||||
{
|
{
|
||||||
return 'SELECT @@VERSION AS ver';
|
return "SELECT SERVERPROPERTY('ProductVersion') AS ver";
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -333,13 +321,8 @@ class CI_DB_mssql_driver extends CI_DB {
|
|||||||
* @param string $table
|
* @param string $table
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function field_data($table = '')
|
public function field_data($table)
|
||||||
{
|
{
|
||||||
if ($table === '')
|
|
||||||
{
|
|
||||||
return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT
|
$sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT
|
||||||
FROM INFORMATION_SCHEMA.Columns
|
FROM INFORMATION_SCHEMA.Columns
|
||||||
WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));
|
WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table));
|
||||||
@ -369,15 +352,25 @@ class CI_DB_mssql_driver extends CI_DB {
|
|||||||
* Error
|
* Error
|
||||||
*
|
*
|
||||||
* Returns an array containing code and message of the last
|
* Returns an array containing code and message of the last
|
||||||
* database error that has occured.
|
* database error that has occurred.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function error()
|
public function error()
|
||||||
{
|
{
|
||||||
$query = $this->query('SELECT @@ERROR AS code');
|
// We need this because the error info is discarded by the
|
||||||
$query = $query->row();
|
// server the first time you request it, and query() already
|
||||||
return array('code' => $query->code, 'message' => mssql_get_last_message());
|
// calls error() once for logging purposes when a query fails.
|
||||||
|
static $error = array('code' => 0, 'message' => NULL);
|
||||||
|
|
||||||
|
$message = mssql_get_last_message();
|
||||||
|
if ( ! empty($message))
|
||||||
|
{
|
||||||
|
$error['code'] = $this->query('SELECT @@ERROR AS code')->row()->code;
|
||||||
|
$error['message'] = $message;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -460,7 +453,7 @@ class CI_DB_mssql_driver extends CI_DB {
|
|||||||
$sql = trim(substr($sql, 0, strrpos($sql, $orderby)));
|
$sql = trim(substr($sql, 0, strrpos($sql, $orderby)));
|
||||||
|
|
||||||
// Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results
|
// Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results
|
||||||
if (count($this->qb_select) === 0)
|
if (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE)
|
||||||
{
|
{
|
||||||
$select = '*'; // Inevitable
|
$select = '*'; // Inevitable
|
||||||
}
|
}
|
||||||
@ -507,7 +500,7 @@ class CI_DB_mssql_driver extends CI_DB {
|
|||||||
return parent::_insert_batch($table, $keys, $values);
|
return parent::_insert_batch($table, $keys, $values);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;
|
return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -523,6 +516,3 @@ class CI_DB_mssql_driver extends CI_DB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mssql_driver.php */
|
|
||||||
/* Location: ./system/database/drivers/mssql/mssql_driver.php */
|
|
51
system/database/drivers/mssql/mssql_forge.php
Executable file → Normal file
51
system/database/drivers/mssql/mssql_forge.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -29,9 +40,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
/**
|
/**
|
||||||
* MS SQL Forge Class
|
* MS SQL Forge Class
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_mssql_forge extends CI_DB_forge {
|
class CI_DB_mssql_forge extends CI_DB_forge {
|
||||||
|
|
||||||
@ -100,6 +113,11 @@ class CI_DB_mssql_forge extends CI_DB_forge {
|
|||||||
*/
|
*/
|
||||||
protected function _attr_type(&$attributes)
|
protected function _attr_type(&$attributes)
|
||||||
{
|
{
|
||||||
|
if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE)
|
||||||
|
{
|
||||||
|
unset($attributes['CONSTRAINT']);
|
||||||
|
}
|
||||||
|
|
||||||
switch (strtoupper($attributes['TYPE']))
|
switch (strtoupper($attributes['TYPE']))
|
||||||
{
|
{
|
||||||
case 'MEDIUMINT':
|
case 'MEDIUMINT':
|
||||||
@ -131,6 +149,3 @@ class CI_DB_mssql_forge extends CI_DB_forge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mssql_forge.php */
|
|
||||||
/* Location: ./system/database/drivers/mssql/mssql_forge.php */
|
|
49
system/database/drivers/mssql/mssql_result.php
Executable file → Normal file
49
system/database/drivers/mssql/mssql_result.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,10 +42,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* This class extends the parent result class: CI_DB_result
|
* This class extends the parent result class: CI_DB_result
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
* @since 1.3
|
|
||||||
*/
|
*/
|
||||||
class CI_DB_mssql_result extends CI_DB_result {
|
class CI_DB_mssql_result extends CI_DB_result {
|
||||||
|
|
||||||
@ -95,7 +107,7 @@ class CI_DB_mssql_result extends CI_DB_result {
|
|||||||
public function field_data()
|
public function field_data()
|
||||||
{
|
{
|
||||||
$retval = array();
|
$retval = array();
|
||||||
for ($i = 0, $c = $this->num_field(); $i < $c; $i++)
|
for ($i = 0, $c = $this->num_fields(); $i < $c; $i++)
|
||||||
{
|
{
|
||||||
$field = mssql_fetch_field($this->result_id, $i);
|
$field = mssql_fetch_field($this->result_id, $i);
|
||||||
|
|
||||||
@ -184,6 +196,3 @@ class CI_DB_mssql_result extends CI_DB_result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mssql_result.php */
|
|
||||||
/* Location: ./system/database/drivers/mssql/mssql_result.php */
|
|
46
system/database/drivers/mssql/mssql_utility.php
Executable file → Normal file
46
system/database/drivers/mssql/mssql_utility.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -29,9 +40,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
/**
|
/**
|
||||||
* MS SQL Utility Class
|
* MS SQL Utility Class
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_mssql_utility extends CI_DB_utility {
|
class CI_DB_mssql_utility extends CI_DB_utility {
|
||||||
|
|
||||||
@ -62,6 +75,3 @@ class CI_DB_mssql_utility extends CI_DB_utility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mssql_utility.php */
|
|
||||||
/* Location: ./system/database/drivers/mssql/mssql_utility.php */
|
|
1
system/database/drivers/mysql/index.html
Executable file → Normal file
1
system/database/drivers/mysql/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
||||||
|
128
system/database/drivers/mysql/mysql_driver.php
Executable file → Normal file
128
system/database/drivers/mysql/mysql_driver.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -37,7 +48,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_mysql_driver extends CI_DB {
|
class CI_DB_mysql_driver extends CI_DB {
|
||||||
|
|
||||||
@ -73,7 +84,7 @@ class CI_DB_mysql_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @var bool
|
* @var bool
|
||||||
*/
|
*/
|
||||||
public $stricton = FALSE;
|
public $stricton;
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
@ -121,8 +132,8 @@ class CI_DB_mysql_driver extends CI_DB {
|
|||||||
|
|
||||||
// Error suppression is necessary mostly due to PHP 5.5+ issuing E_DEPRECATED messages
|
// Error suppression is necessary mostly due to PHP 5.5+ issuing E_DEPRECATED messages
|
||||||
$this->conn_id = ($persistent === TRUE)
|
$this->conn_id = ($persistent === TRUE)
|
||||||
? @mysql_pconnect($this->hostname, $this->username, $this->password, $client_flags)
|
? mysql_pconnect($this->hostname, $this->username, $this->password, $client_flags)
|
||||||
: @mysql_connect($this->hostname, $this->username, $this->password, TRUE, $client_flags);
|
: mysql_connect($this->hostname, $this->username, $this->password, TRUE, $client_flags);
|
||||||
|
|
||||||
// ----------------------------------------------------------------
|
// ----------------------------------------------------------------
|
||||||
|
|
||||||
@ -136,9 +147,26 @@ class CI_DB_mysql_driver extends CI_DB {
|
|||||||
: FALSE;
|
: FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->stricton && is_resource($this->conn_id))
|
if (isset($this->stricton) && is_resource($this->conn_id))
|
||||||
{
|
{
|
||||||
$this->simple_query('SET SESSION sql_mode="STRICT_ALL_TABLES"');
|
if ($this->stricton)
|
||||||
|
{
|
||||||
|
$this->simple_query('SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->simple_query(
|
||||||
|
'SET SESSION sql_mode =
|
||||||
|
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
|
||||||
|
@@sql_mode,
|
||||||
|
"STRICT_ALL_TABLES,", ""),
|
||||||
|
",STRICT_ALL_TABLES", ""),
|
||||||
|
"STRICT_ALL_TABLES", ""),
|
||||||
|
"STRICT_TRANS_TABLES,", ""),
|
||||||
|
",STRICT_TRANS_TABLES", ""),
|
||||||
|
"STRICT_TRANS_TABLES", "")'
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->conn_id;
|
return $this->conn_id;
|
||||||
@ -180,6 +208,7 @@ class CI_DB_mysql_driver extends CI_DB {
|
|||||||
if (mysql_select_db($database, $this->conn_id))
|
if (mysql_select_db($database, $this->conn_id))
|
||||||
{
|
{
|
||||||
$this->database = $database;
|
$this->database = $database;
|
||||||
|
$this->data_cache = array();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,10 +241,6 @@ class CI_DB_mysql_driver extends CI_DB {
|
|||||||
{
|
{
|
||||||
return $this->data_cache['version'];
|
return $this->data_cache['version'];
|
||||||
}
|
}
|
||||||
elseif ( ! $this->conn_id)
|
|
||||||
{
|
|
||||||
$this->initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! $this->conn_id OR ($version = mysql_get_server_info($this->conn_id)) === FALSE)
|
if ( ! $this->conn_id OR ($version = mysql_get_server_info($this->conn_id)) === FALSE)
|
||||||
{
|
{
|
||||||
@ -265,25 +290,12 @@ class CI_DB_mysql_driver extends CI_DB {
|
|||||||
/**
|
/**
|
||||||
* Begin Transaction
|
* Begin Transaction
|
||||||
*
|
*
|
||||||
* @param bool $test_mode
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_begin($test_mode = FALSE)
|
protected function _trans_begin()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $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);
|
|
||||||
|
|
||||||
$this->simple_query('SET AUTOCOMMIT=0');
|
$this->simple_query('SET AUTOCOMMIT=0');
|
||||||
$this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
|
return $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -293,17 +305,15 @@ class CI_DB_mysql_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_commit()
|
protected function _trans_commit()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
if ($this->simple_query('COMMIT'))
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
{
|
||||||
|
$this->simple_query('SET AUTOCOMMIT=1');
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->simple_query('COMMIT');
|
return FALSE;
|
||||||
$this->simple_query('SET AUTOCOMMIT=1');
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -313,32 +323,28 @@ class CI_DB_mysql_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_rollback()
|
protected function _trans_rollback()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
if ($this->simple_query('ROLLBACK'))
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
{
|
||||||
|
$this->simple_query('SET AUTOCOMMIT=1');
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->simple_query('ROLLBACK');
|
return FALSE;
|
||||||
$this->simple_query('SET AUTOCOMMIT=1');
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Platform-dependant string escape
|
* Platform-dependent string escape
|
||||||
*
|
*
|
||||||
* @param string
|
* @param string
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected function _escape_str($str)
|
protected function _escape_str($str)
|
||||||
{
|
{
|
||||||
return is_resource($this->conn_id)
|
return mysql_real_escape_string($str, $this->conn_id);
|
||||||
? mysql_real_escape_string($str, $this->conn_id)
|
|
||||||
: addslashes($str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -410,13 +416,8 @@ class CI_DB_mysql_driver extends CI_DB {
|
|||||||
* @param string $table
|
* @param string $table
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function field_data($table = '')
|
public function field_data($table)
|
||||||
{
|
{
|
||||||
if ($table === '')
|
|
||||||
{
|
|
||||||
return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)
|
if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -447,7 +448,7 @@ class CI_DB_mysql_driver extends CI_DB {
|
|||||||
* Error
|
* Error
|
||||||
*
|
*
|
||||||
* Returns an array containing code and message of the last
|
* Returns an array containing code and message of the last
|
||||||
* database error that has occured.
|
* database error that has occurred.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@ -491,6 +492,3 @@ class CI_DB_mysql_driver extends CI_DB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mysql_driver.php */
|
|
||||||
/* Location: ./system/database/drivers/mysql/mysql_driver.php */
|
|
46
system/database/drivers/mysql/mysql_forge.php
Executable file → Normal file
46
system/database/drivers/mysql/mysql_forge.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_mysql_forge extends CI_DB_forge {
|
class CI_DB_mysql_forge extends CI_DB_forge {
|
||||||
|
|
||||||
@ -174,6 +185,7 @@ class CI_DB_mysql_forge extends CI_DB_forge {
|
|||||||
$extra_clause = ' FIRST';
|
$extra_clause = ' FIRST';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return $this->db->escape_identifiers($field['name'])
|
return $this->db->escape_identifiers($field['name'])
|
||||||
.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))
|
.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))
|
||||||
.' '.$field['type'].$field['length']
|
.' '.$field['type'].$field['length']
|
||||||
@ -182,6 +194,7 @@ class CI_DB_mysql_forge extends CI_DB_forge {
|
|||||||
.$field['default']
|
.$field['default']
|
||||||
.$field['auto_increment']
|
.$field['auto_increment']
|
||||||
.$field['unique']
|
.$field['unique']
|
||||||
|
.(empty($field['comment']) ? '' : ' COMMENT '.$field['comment'])
|
||||||
.$extra_clause;
|
.$extra_clause;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,6 +241,3 @@ class CI_DB_mysql_forge extends CI_DB_forge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mysql_forge.php */
|
|
||||||
/* Location: ./system/database/drivers/mysql/mysql_forge.php */
|
|
45
system/database/drivers/mysql/mysql_result.php
Executable file → Normal file
45
system/database/drivers/mysql/mysql_result.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -33,8 +44,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
* @since 1.0
|
|
||||||
*/
|
*/
|
||||||
class CI_DB_mysql_result extends CI_DB_result {
|
class CI_DB_mysql_result extends CI_DB_result {
|
||||||
|
|
||||||
@ -187,6 +197,3 @@ class CI_DB_mysql_result extends CI_DB_result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mysql_result.php */
|
|
||||||
/* Location: ./system/database/drivers/mysql/mysql_result.php */
|
|
44
system/database/drivers/mysql/mysql_utility.php
Executable file → Normal file
44
system/database/drivers/mysql/mysql_utility.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_mysql_utility extends CI_DB_utility {
|
class CI_DB_mysql_utility extends CI_DB_utility {
|
||||||
|
|
||||||
@ -198,6 +209,3 @@ class CI_DB_mysql_utility extends CI_DB_utility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mysql_utility.php */
|
|
||||||
/* Location: ./system/database/drivers/mysql/mysql_utility.php */
|
|
1
system/database/drivers/mysqli/index.html
Executable file → Normal file
1
system/database/drivers/mysqli/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
||||||
|
223
system/database/drivers/mysqli/mysqli_driver.php
Executable file → Normal file
223
system/database/drivers/mysqli/mysqli_driver.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -37,7 +48,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_mysqli_driver extends CI_DB {
|
class CI_DB_mysqli_driver extends CI_DB {
|
||||||
|
|
||||||
@ -73,7 +84,7 @@ class CI_DB_mysqli_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @var bool
|
* @var bool
|
||||||
*/
|
*/
|
||||||
public $stricton = FALSE;
|
public $stricton;
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
@ -86,29 +97,128 @@ class CI_DB_mysqli_driver extends CI_DB {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MySQLi object
|
||||||
|
*
|
||||||
|
* Has to be preserved without being assigned to $conn_id.
|
||||||
|
*
|
||||||
|
* @var MySQLi
|
||||||
|
*/
|
||||||
|
protected $_mysqli;
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Database connection
|
* Database connection
|
||||||
*
|
*
|
||||||
* @param bool $persistent
|
* @param bool $persistent
|
||||||
* @return object
|
* @return object
|
||||||
* @todo SSL support
|
|
||||||
*/
|
*/
|
||||||
public function db_connect($persistent = FALSE)
|
public function db_connect($persistent = FALSE)
|
||||||
{
|
{
|
||||||
// Persistent connection support was added in PHP 5.3.0
|
// Do we have a socket path?
|
||||||
$hostname = ($persistent === TRUE && is_php('5.3'))
|
if ($this->hostname[0] === '/')
|
||||||
|
{
|
||||||
|
$hostname = NULL;
|
||||||
|
$port = NULL;
|
||||||
|
$socket = $this->hostname;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$hostname = ($persistent === TRUE)
|
||||||
? 'p:'.$this->hostname : $this->hostname;
|
? 'p:'.$this->hostname : $this->hostname;
|
||||||
$port = empty($this->port) ? NULL : $this->port;
|
$port = empty($this->port) ? NULL : $this->port;
|
||||||
$client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0;
|
$socket = NULL;
|
||||||
$mysqli = mysqli_init();
|
|
||||||
|
|
||||||
if ($this->stricton)
|
|
||||||
{
|
|
||||||
$mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode="STRICT_ALL_TABLES"');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, NULL, $client_flags)
|
$client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0;
|
||||||
? $mysqli : FALSE;
|
$this->_mysqli = mysqli_init();
|
||||||
|
|
||||||
|
$this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10);
|
||||||
|
|
||||||
|
if (isset($this->stricton))
|
||||||
|
{
|
||||||
|
if ($this->stricton)
|
||||||
|
{
|
||||||
|
$this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->_mysqli->options(MYSQLI_INIT_COMMAND,
|
||||||
|
'SET SESSION sql_mode =
|
||||||
|
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
|
||||||
|
@@sql_mode,
|
||||||
|
"STRICT_ALL_TABLES,", ""),
|
||||||
|
",STRICT_ALL_TABLES", ""),
|
||||||
|
"STRICT_ALL_TABLES", ""),
|
||||||
|
"STRICT_TRANS_TABLES,", ""),
|
||||||
|
",STRICT_TRANS_TABLES", ""),
|
||||||
|
"STRICT_TRANS_TABLES", "")'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($this->encrypt))
|
||||||
|
{
|
||||||
|
$ssl = array();
|
||||||
|
empty($this->encrypt['ssl_key']) OR $ssl['key'] = $this->encrypt['ssl_key'];
|
||||||
|
empty($this->encrypt['ssl_cert']) OR $ssl['cert'] = $this->encrypt['ssl_cert'];
|
||||||
|
empty($this->encrypt['ssl_ca']) OR $ssl['ca'] = $this->encrypt['ssl_ca'];
|
||||||
|
empty($this->encrypt['ssl_capath']) OR $ssl['capath'] = $this->encrypt['ssl_capath'];
|
||||||
|
empty($this->encrypt['ssl_cipher']) OR $ssl['cipher'] = $this->encrypt['ssl_cipher'];
|
||||||
|
|
||||||
|
if (isset($this->encrypt['ssl_verify']))
|
||||||
|
{
|
||||||
|
$client_flags |= MYSQLI_CLIENT_SSL;
|
||||||
|
|
||||||
|
if ($this->encrypt['ssl_verify'])
|
||||||
|
{
|
||||||
|
defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT') && $this->_mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE);
|
||||||
|
}
|
||||||
|
// Apparently (when it exists), setting MYSQLI_OPT_SSL_VERIFY_SERVER_CERT
|
||||||
|
// to FALSE didn't do anything, so PHP 5.6.16 introduced yet another
|
||||||
|
// constant ...
|
||||||
|
//
|
||||||
|
// https://secure.php.net/ChangeLog-5.php#5.6.16
|
||||||
|
// https://bugs.php.net/bug.php?id=68344
|
||||||
|
elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT'))
|
||||||
|
{
|
||||||
|
$client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! empty($ssl))
|
||||||
|
{
|
||||||
|
$client_flags |= MYSQLI_CLIENT_SSL;
|
||||||
|
$this->_mysqli->ssl_set(
|
||||||
|
isset($ssl['key']) ? $ssl['key'] : NULL,
|
||||||
|
isset($ssl['cert']) ? $ssl['cert'] : NULL,
|
||||||
|
isset($ssl['ca']) ? $ssl['ca'] : NULL,
|
||||||
|
isset($ssl['capath']) ? $ssl['capath'] : NULL,
|
||||||
|
isset($ssl['cipher']) ? $ssl['cipher'] : NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->_mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, $socket, $client_flags))
|
||||||
|
{
|
||||||
|
// Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails
|
||||||
|
if (
|
||||||
|
($client_flags & MYSQLI_CLIENT_SSL)
|
||||||
|
&& version_compare($this->_mysqli->client_info, '5.7.3', '<=')
|
||||||
|
&& empty($this->_mysqli->query("SHOW STATUS LIKE 'ssl_cipher'")->fetch_object()->Value)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
$this->_mysqli->close();
|
||||||
|
$message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!';
|
||||||
|
log_message('error', $message);
|
||||||
|
return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_mysqli;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -147,6 +257,7 @@ class CI_DB_mysqli_driver extends CI_DB {
|
|||||||
if ($this->conn_id->select_db($database))
|
if ($this->conn_id->select_db($database))
|
||||||
{
|
{
|
||||||
$this->database = $database;
|
$this->database = $database;
|
||||||
|
$this->data_cache = array();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,10 +290,6 @@ class CI_DB_mysqli_driver extends CI_DB {
|
|||||||
{
|
{
|
||||||
return $this->data_cache['version'];
|
return $this->data_cache['version'];
|
||||||
}
|
}
|
||||||
elseif ( ! $this->conn_id)
|
|
||||||
{
|
|
||||||
$this->initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->data_cache['version'] = $this->conn_id->server_info;
|
return $this->data_cache['version'] = $this->conn_id->server_info;
|
||||||
}
|
}
|
||||||
@ -227,22 +334,10 @@ class CI_DB_mysqli_driver extends CI_DB {
|
|||||||
/**
|
/**
|
||||||
* Begin Transaction
|
* Begin Transaction
|
||||||
*
|
*
|
||||||
* @param bool $test_mode
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_begin($test_mode = FALSE)
|
protected function _trans_begin()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $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);
|
|
||||||
|
|
||||||
$this->conn_id->autocommit(FALSE);
|
$this->conn_id->autocommit(FALSE);
|
||||||
return is_php('5.5')
|
return is_php('5.5')
|
||||||
? $this->conn_id->begin_transaction()
|
? $this->conn_id->begin_transaction()
|
||||||
@ -256,14 +351,8 @@ class CI_DB_mysqli_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_commit()
|
protected function _trans_commit()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->conn_id->commit())
|
if ($this->conn_id->commit())
|
||||||
{
|
{
|
||||||
$this->conn_id->autocommit(TRUE);
|
$this->conn_id->autocommit(TRUE);
|
||||||
@ -280,14 +369,8 @@ class CI_DB_mysqli_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_rollback()
|
protected function _trans_rollback()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->conn_id->rollback())
|
if ($this->conn_id->rollback())
|
||||||
{
|
{
|
||||||
$this->conn_id->autocommit(TRUE);
|
$this->conn_id->autocommit(TRUE);
|
||||||
@ -300,16 +383,14 @@ class CI_DB_mysqli_driver extends CI_DB {
|
|||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Platform-dependant string escape
|
* Platform-dependent string escape
|
||||||
*
|
*
|
||||||
* @param string
|
* @param string
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected function _escape_str($str)
|
protected function _escape_str($str)
|
||||||
{
|
{
|
||||||
return is_object($this->conn_id)
|
return $this->conn_id->real_escape_string($str);
|
||||||
? $this->conn_id->real_escape_string($str)
|
|
||||||
: addslashes($str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -381,13 +462,8 @@ class CI_DB_mysqli_driver extends CI_DB {
|
|||||||
* @param string $table
|
* @param string $table
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function field_data($table = '')
|
public function field_data($table)
|
||||||
{
|
{
|
||||||
if ($table === '')
|
|
||||||
{
|
|
||||||
return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)
|
if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -418,17 +494,17 @@ class CI_DB_mysqli_driver extends CI_DB {
|
|||||||
* Error
|
* Error
|
||||||
*
|
*
|
||||||
* Returns an array containing code and message of the last
|
* Returns an array containing code and message of the last
|
||||||
* database error that has occured.
|
* database error that has occurred.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function error()
|
public function error()
|
||||||
{
|
{
|
||||||
if ( ! empty($this->conn_id->connect_errno))
|
if ( ! empty($this->_mysqli->connect_errno))
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
'code' => $this->conn_id->connect_errno,
|
'code' => $this->_mysqli->connect_errno,
|
||||||
'message' => is_php('5.2.9') ? $this->conn_id->connect_error : mysqli_connect_error()
|
'message' => $this->_mysqli->connect_error
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -468,6 +544,3 @@ class CI_DB_mysqli_driver extends CI_DB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mysqli_driver.php */
|
|
||||||
/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */
|
|
47
system/database/drivers/mysqli/mysqli_forge.php
Executable file → Normal file
47
system/database/drivers/mysqli/mysqli_forge.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -29,9 +40,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
/**
|
/**
|
||||||
* MySQLi Forge Class
|
* MySQLi Forge Class
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_mysqli_forge extends CI_DB_forge {
|
class CI_DB_mysqli_forge extends CI_DB_forge {
|
||||||
|
|
||||||
@ -182,6 +195,7 @@ class CI_DB_mysqli_forge extends CI_DB_forge {
|
|||||||
.$field['default']
|
.$field['default']
|
||||||
.$field['auto_increment']
|
.$field['auto_increment']
|
||||||
.$field['unique']
|
.$field['unique']
|
||||||
|
.(empty($field['comment']) ? '' : ' COMMENT '.$field['comment'])
|
||||||
.$extra_clause;
|
.$extra_clause;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,6 +242,3 @@ class CI_DB_mysqli_forge extends CI_DB_forge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mysqli_forge.php */
|
|
||||||
/* Location: ./system/database/drivers/mysqli/mysqli_forge.php */
|
|
97
system/database/drivers/mysqli/mysqli_result.php
Executable file → Normal file
97
system/database/drivers/mysqli/mysqli_result.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,10 +42,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* This class extends the parent result class: CI_DB_result
|
* This class extends the parent result class: CI_DB_result
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
* @since 1.3
|
|
||||||
*/
|
*/
|
||||||
class CI_DB_mysqli_result extends CI_DB_result {
|
class CI_DB_mysqli_result extends CI_DB_result {
|
||||||
|
|
||||||
@ -100,9 +112,9 @@ class CI_DB_mysqli_result extends CI_DB_result {
|
|||||||
{
|
{
|
||||||
$retval[$i] = new stdClass();
|
$retval[$i] = new stdClass();
|
||||||
$retval[$i]->name = $field_data[$i]->name;
|
$retval[$i]->name = $field_data[$i]->name;
|
||||||
$retval[$i]->type = $field_data[$i]->type;
|
$retval[$i]->type = static::_get_field_type($field_data[$i]->type);
|
||||||
$retval[$i]->max_length = $field_data[$i]->max_length;
|
$retval[$i]->max_length = $field_data[$i]->max_length;
|
||||||
$retval[$i]->primary_key = (int) ($field_data[$i]->flags & 2);
|
$retval[$i]->primary_key = (int) ($field_data[$i]->flags & MYSQLI_PRI_KEY_FLAG);
|
||||||
$retval[$i]->default = $field_data[$i]->def;
|
$retval[$i]->default = $field_data[$i]->def;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,6 +123,52 @@ class CI_DB_mysqli_result extends CI_DB_result {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get field type
|
||||||
|
*
|
||||||
|
* Extracts field type info from the bitflags returned by
|
||||||
|
* mysqli_result::fetch_fields()
|
||||||
|
*
|
||||||
|
* @used-by CI_DB_mysqli_result::field_data()
|
||||||
|
* @param int $type
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private static function _get_field_type($type)
|
||||||
|
{
|
||||||
|
static $map;
|
||||||
|
isset($map) OR $map = array(
|
||||||
|
MYSQLI_TYPE_DECIMAL => 'decimal',
|
||||||
|
MYSQLI_TYPE_BIT => 'bit',
|
||||||
|
MYSQLI_TYPE_TINY => 'tinyint',
|
||||||
|
MYSQLI_TYPE_SHORT => 'smallint',
|
||||||
|
MYSQLI_TYPE_INT24 => 'mediumint',
|
||||||
|
MYSQLI_TYPE_LONG => 'int',
|
||||||
|
MYSQLI_TYPE_LONGLONG => 'bigint',
|
||||||
|
MYSQLI_TYPE_FLOAT => 'float',
|
||||||
|
MYSQLI_TYPE_DOUBLE => 'double',
|
||||||
|
MYSQLI_TYPE_TIMESTAMP => 'timestamp',
|
||||||
|
MYSQLI_TYPE_DATE => 'date',
|
||||||
|
MYSQLI_TYPE_TIME => 'time',
|
||||||
|
MYSQLI_TYPE_DATETIME => 'datetime',
|
||||||
|
MYSQLI_TYPE_YEAR => 'year',
|
||||||
|
MYSQLI_TYPE_NEWDATE => 'date',
|
||||||
|
MYSQLI_TYPE_INTERVAL => 'interval',
|
||||||
|
MYSQLI_TYPE_ENUM => 'enum',
|
||||||
|
MYSQLI_TYPE_SET => 'set',
|
||||||
|
MYSQLI_TYPE_TINY_BLOB => 'tinyblob',
|
||||||
|
MYSQLI_TYPE_MEDIUM_BLOB => 'mediumblob',
|
||||||
|
MYSQLI_TYPE_BLOB => 'blob',
|
||||||
|
MYSQLI_TYPE_LONG_BLOB => 'longblob',
|
||||||
|
MYSQLI_TYPE_STRING => 'char',
|
||||||
|
MYSQLI_TYPE_VAR_STRING => 'varchar',
|
||||||
|
MYSQLI_TYPE_GEOMETRY => 'geometry'
|
||||||
|
);
|
||||||
|
|
||||||
|
return isset($map[$type]) ? $map[$type] : $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free the result
|
* Free the result
|
||||||
*
|
*
|
||||||
@ -172,6 +230,3 @@ class CI_DB_mysqli_result extends CI_DB_result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mysqli_result.php */
|
|
||||||
/* Location: ./system/database/drivers/mysqli/mysqli_result.php */
|
|
50
system/database/drivers/mysqli/mysqli_utility.php
Executable file → Normal file
50
system/database/drivers/mysqli/mysqli_utility.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -29,9 +40,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
/**
|
/**
|
||||||
* MySQLi Utility Class
|
* MySQLi Utility Class
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_mysqli_utility extends CI_DB_utility {
|
class CI_DB_mysqli_utility extends CI_DB_utility {
|
||||||
|
|
||||||
@ -142,9 +155,7 @@ class CI_DB_mysqli_utility extends CI_DB_utility {
|
|||||||
while ($field = $query->result_id->fetch_field())
|
while ($field = $query->result_id->fetch_field())
|
||||||
{
|
{
|
||||||
// Most versions of MySQL store timestamp as a string
|
// Most versions of MySQL store timestamp as a string
|
||||||
$is_int[$i] = in_array(strtolower($field->type),
|
$is_int[$i] = in_array($field->type, array(MYSQLI_TYPE_TINY, MYSQLI_TYPE_SHORT, MYSQLI_TYPE_INT24, MYSQLI_TYPE_LONG), TRUE);
|
||||||
array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'),
|
|
||||||
TRUE);
|
|
||||||
|
|
||||||
// Create a string of field names
|
// Create a string of field names
|
||||||
$field_str .= $this->db->escape_identifiers($field->name).', ';
|
$field_str .= $this->db->escape_identifiers($field->name).', ';
|
||||||
@ -198,6 +209,3 @@ class CI_DB_mysqli_utility extends CI_DB_utility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file mysqli_utility.php */
|
|
||||||
/* Location: ./system/database/drivers/mysqli/mysqli_utility.php */
|
|
1
system/database/drivers/oci8/index.html
Executable file → Normal file
1
system/database/drivers/oci8/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
||||||
|
197
system/database/drivers/oci8/oci8_driver.php
Executable file → Normal file
197
system/database/drivers/oci8/oci8_driver.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.4.1
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -37,7 +48,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,10 +97,18 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @var bool
|
* @var bool
|
||||||
*/
|
*/
|
||||||
public $limit_used;
|
public $limit_used = FALSE;
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset $stmt_id flag
|
||||||
|
*
|
||||||
|
* Used by stored_procedure() to prevent _execute() from
|
||||||
|
* re-setting the statement ID.
|
||||||
|
*/
|
||||||
|
protected $_reset_stmt_id = TRUE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of reserved identifiers
|
* List of reserved identifiers
|
||||||
*
|
*
|
||||||
@ -232,17 +251,17 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
{
|
{
|
||||||
return $this->data_cache['version'];
|
return $this->data_cache['version'];
|
||||||
}
|
}
|
||||||
elseif ( ! $this->conn_id)
|
|
||||||
{
|
|
||||||
$this->initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! $this->conn_id OR ($version = oci_server_version($this->conn_id)) === FALSE)
|
if ( ! $this->conn_id OR ($version_string = oci_server_version($this->conn_id)) === FALSE)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
elseif (preg_match('#Release\s(\d+(?:\.\d+)+)#', $version_string, $match))
|
||||||
|
{
|
||||||
|
return $this->data_cache['version'] = $match[1];
|
||||||
|
}
|
||||||
|
|
||||||
return $this->data_cache['version'] = $version;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -258,26 +277,13 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
/* Oracle must parse the query before it is run. All of the actions with
|
/* Oracle must parse the query before it is run. All of the actions with
|
||||||
* the query are based on the statement id returned by oci_parse().
|
* the query are based on the statement id returned by oci_parse().
|
||||||
*/
|
*/
|
||||||
$this->stmt_id = FALSE;
|
if ($this->_reset_stmt_id === TRUE)
|
||||||
$this->_set_stmt_id($sql);
|
|
||||||
oci_set_prefetch($this->stmt_id, 1000);
|
|
||||||
return oci_execute($this->stmt_id, $this->commit_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a statement ID
|
|
||||||
*
|
|
||||||
* @param string $sql an SQL query
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function _set_stmt_id($sql)
|
|
||||||
{
|
|
||||||
if ( ! is_resource($this->stmt_id))
|
|
||||||
{
|
{
|
||||||
$this->stmt_id = oci_parse($this->conn_id, $sql);
|
$this->stmt_id = oci_parse($this->conn_id, $sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oci_set_prefetch($this->stmt_id, 1000);
|
||||||
|
return oci_execute($this->stmt_id, $this->commit_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -311,15 +317,15 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
* type yes the type of the parameter
|
* type yes the type of the parameter
|
||||||
* length yes the max size of the parameter
|
* length yes the max size of the parameter
|
||||||
*/
|
*/
|
||||||
public function stored_procedure($package, $procedure, $params)
|
public function stored_procedure($package, $procedure, array $params)
|
||||||
{
|
{
|
||||||
if ($package === '' OR $procedure === '' OR ! is_array($params))
|
if ($package === '' OR $procedure === '')
|
||||||
{
|
{
|
||||||
log_message('error', 'Invalid query: '.$package.'.'.$procedure);
|
log_message('error', 'Invalid query: '.$package.'.'.$procedure);
|
||||||
return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE;
|
return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// build the query string
|
// Build the query string
|
||||||
$sql = 'BEGIN '.$package.'.'.$procedure.'(';
|
$sql = 'BEGIN '.$package.'.'.$procedure.'(';
|
||||||
|
|
||||||
$have_cursor = FALSE;
|
$have_cursor = FALSE;
|
||||||
@ -334,10 +340,12 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
}
|
}
|
||||||
$sql = trim($sql, ',').'); END;';
|
$sql = trim($sql, ',').'); END;';
|
||||||
|
|
||||||
$this->stmt_id = FALSE;
|
$this->_reset_stmt_id = FALSE;
|
||||||
$this->_set_stmt_id($sql);
|
$this->stmt_id = oci_parse($this->conn_id, $sql);
|
||||||
$this->_bind_params($params);
|
$this->_bind_params($params);
|
||||||
return $this->query($sql, FALSE, $have_cursor);
|
$result = $this->query($sql, FALSE, $have_cursor);
|
||||||
|
$this->_reset_stmt_id = TRUE;
|
||||||
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -374,28 +382,11 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
/**
|
/**
|
||||||
* Begin Transaction
|
* Begin Transaction
|
||||||
*
|
*
|
||||||
* @param bool $test_mode
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_begin($test_mode = FALSE)
|
protected function _trans_begin()
|
||||||
{
|
{
|
||||||
if ( ! $this->trans_enabled)
|
$this->commit_mode = OCI_NO_AUTO_COMMIT;
|
||||||
{
|
|
||||||
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);
|
|
||||||
|
|
||||||
$this->commit_mode = is_php('5.3.2') ? OCI_NO_AUTO_COMMIT : OCI_DEFAULT;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -406,20 +397,10 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_commit()
|
protected 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->commit_mode = OCI_COMMIT_ON_SUCCESS;
|
$this->commit_mode = OCI_COMMIT_ON_SUCCESS;
|
||||||
|
|
||||||
return oci_commit($this->conn_id);
|
return oci_commit($this->conn_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -430,14 +411,8 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_rollback()
|
protected function _trans_rollback()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->commit_mode = OCI_COMMIT_ON_SUCCESS;
|
$this->commit_mode = OCI_COMMIT_ON_SUCCESS;
|
||||||
return oci_rollback($this->conn_id);
|
return oci_rollback($this->conn_id);
|
||||||
}
|
}
|
||||||
@ -524,13 +499,9 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
* @param string $table
|
* @param string $table
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function field_data($table = '')
|
public function field_data($table)
|
||||||
{
|
{
|
||||||
if ($table === '')
|
if (strpos($table, '.') !== FALSE)
|
||||||
{
|
|
||||||
return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
|
|
||||||
}
|
|
||||||
elseif (strpos($table, '.') !== FALSE)
|
|
||||||
{
|
{
|
||||||
sscanf($table, '%[^.].%s', $owner, $table);
|
sscanf($table, '%[^.].%s', $owner, $table);
|
||||||
}
|
}
|
||||||
@ -570,7 +541,7 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
{
|
{
|
||||||
$default = '';
|
$default = '';
|
||||||
}
|
}
|
||||||
$retval[$i]->default = $query[$i]->COLUMN_DEFAULT;
|
$retval[$i]->default = $default;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $retval;
|
return $retval;
|
||||||
@ -582,29 +553,35 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
* Error
|
* Error
|
||||||
*
|
*
|
||||||
* Returns an array containing code and message of the last
|
* Returns an array containing code and message of the last
|
||||||
* database error that has occured.
|
* database error that has occurred.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function error()
|
public function error()
|
||||||
{
|
{
|
||||||
/* oci_error() returns an array that already contains the
|
// oci_error() returns an array that already contains
|
||||||
* 'code' and 'message' keys, so we can just return it.
|
// 'code' and 'message' keys, but it can return false
|
||||||
*/
|
// if there was no error ....
|
||||||
if (is_resource($this->curs_id))
|
if (is_resource($this->curs_id))
|
||||||
{
|
{
|
||||||
return oci_error($this->curs_id);
|
$error = oci_error($this->curs_id);
|
||||||
}
|
}
|
||||||
elseif (is_resource($this->stmt_id))
|
elseif (is_resource($this->stmt_id))
|
||||||
{
|
{
|
||||||
return oci_error($this->stmt_id);
|
$error = oci_error($this->stmt_id);
|
||||||
}
|
}
|
||||||
elseif (is_resource($this->conn_id))
|
elseif (is_resource($this->conn_id))
|
||||||
{
|
{
|
||||||
return oci_error($this->conn_id);
|
$error = oci_error($this->conn_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$error = oci_error();
|
||||||
}
|
}
|
||||||
|
|
||||||
return oci_error();
|
return is_array($error)
|
||||||
|
? $error
|
||||||
|
: array('code' => '', 'message' => '');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -683,6 +660,14 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
*/
|
*/
|
||||||
protected function _limit($sql)
|
protected function _limit($sql)
|
||||||
{
|
{
|
||||||
|
if (version_compare($this->version(), '12.1', '>='))
|
||||||
|
{
|
||||||
|
// OFFSET-FETCH can be used only with the ORDER BY clause
|
||||||
|
empty($this->qb_orderby) && $sql .= ' ORDER BY 1';
|
||||||
|
|
||||||
|
return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY';
|
||||||
|
}
|
||||||
|
|
||||||
$this->limit_used = TRUE;
|
$this->limit_used = TRUE;
|
||||||
return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')'
|
return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')'
|
||||||
.($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1) : '');
|
.($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1) : '');
|
||||||
@ -700,7 +685,17 @@ class CI_DB_oci8_driver extends CI_DB {
|
|||||||
oci_close($this->conn_id);
|
oci_close($this->conn_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/* End of file oci8_driver.php */
|
/**
|
||||||
/* Location: ./system/database/drivers/oci8/oci8_driver.php */
|
* We need to reset our $limit_used hack flag, so it doesn't propagate
|
||||||
|
* to subsequent queries.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _reset_select()
|
||||||
|
{
|
||||||
|
$this->limit_used = FALSE;
|
||||||
|
parent::_reset_select();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
94
system/database/drivers/oci8/oci8_forge.php
Executable file → Normal file
94
system/database/drivers/oci8/oci8_forge.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.4.1
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_oci8_forge extends CI_DB_forge {
|
class CI_DB_oci8_forge extends CI_DB_forge {
|
||||||
|
|
||||||
@ -42,6 +53,13 @@ class CI_DB_oci8_forge extends CI_DB_forge {
|
|||||||
*/
|
*/
|
||||||
protected $_create_database = FALSE;
|
protected $_create_database = FALSE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CREATE TABLE IF statement
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $_create_table_if = FALSE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DROP DATABASE statement
|
* DROP DATABASE statement
|
||||||
*
|
*
|
||||||
@ -95,11 +113,21 @@ class CI_DB_oci8_forge extends CI_DB_forge {
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
$field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]);
|
$field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]);
|
||||||
|
|
||||||
|
if ( ! empty($field[$i]['comment']))
|
||||||
|
{
|
||||||
|
$sqls[] = 'COMMENT ON COLUMN '
|
||||||
|
.$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name'])
|
||||||
|
.' IS '.$field[$i]['comment'];
|
||||||
|
}
|
||||||
|
|
||||||
if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name']))
|
if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name']))
|
||||||
{
|
{
|
||||||
$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
|
$sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name'])
|
||||||
.' '.$this->db->escape_identifiers($field[$i]['new_name']);
|
.' TO '.$this->db->escape_identifiers($field[$i]['new_name']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$field[$i] = "\n\t".$field[$i]['_literal'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,7 +138,7 @@ class CI_DB_oci8_forge extends CI_DB_forge {
|
|||||||
|
|
||||||
// RENAME COLUMN must be executed after MODIFY
|
// RENAME COLUMN must be executed after MODIFY
|
||||||
array_unshift($sqls, $sql);
|
array_unshift($sqls, $sql);
|
||||||
return $sql;
|
return $sqls;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -127,7 +155,33 @@ class CI_DB_oci8_forge extends CI_DB_forge {
|
|||||||
// Not supported - sequences and triggers must be used instead
|
// Not supported - sequences and triggers must be used instead
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/* End of file oci8_forge.php */
|
/**
|
||||||
/* Location: ./system/database/drivers/oci8/oci8_forge.php */
|
* Field attribute TYPE
|
||||||
|
*
|
||||||
|
* Performs a data type mapping between different databases.
|
||||||
|
*
|
||||||
|
* @param array &$attributes
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function _attr_type(&$attributes)
|
||||||
|
{
|
||||||
|
switch (strtoupper($attributes['TYPE']))
|
||||||
|
{
|
||||||
|
case 'TINYINT':
|
||||||
|
$attributes['TYPE'] = 'NUMBER';
|
||||||
|
return;
|
||||||
|
case 'MEDIUMINT':
|
||||||
|
$attributes['TYPE'] = 'NUMBER';
|
||||||
|
return;
|
||||||
|
case 'INT':
|
||||||
|
$attributes['TYPE'] = 'NUMBER';
|
||||||
|
return;
|
||||||
|
case 'BIGINT':
|
||||||
|
$attributes['TYPE'] = 'NUMBER';
|
||||||
|
return;
|
||||||
|
default: return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
45
system/database/drivers/oci8/oci8_result.php
Executable file → Normal file
45
system/database/drivers/oci8/oci8_result.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.4.1
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -33,8 +44,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
* @since 1.4.1
|
|
||||||
*/
|
*/
|
||||||
class CI_DB_oci8_result extends CI_DB_result {
|
class CI_DB_oci8_result extends CI_DB_result {
|
||||||
|
|
||||||
@ -217,6 +227,3 @@ class CI_DB_oci8_result extends CI_DB_result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file oci8_result.php */
|
|
||||||
/* Location: ./system/database/drivers/oci8/oci8_result.php */
|
|
44
system/database/drivers/oci8/oci8_utility.php
Executable file → Normal file
44
system/database/drivers/oci8/oci8_utility.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.4.1
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,7 +42,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_oci8_utility extends CI_DB_utility {
|
class CI_DB_oci8_utility extends CI_DB_utility {
|
||||||
|
|
||||||
@ -55,6 +66,3 @@ class CI_DB_oci8_utility extends CI_DB_utility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file oci8_utility.php */
|
|
||||||
/* Location: ./system/database/drivers/oci8/oci8_utility.php */
|
|
1
system/database/drivers/odbc/index.html
Executable file → Normal file
1
system/database/drivers/odbc/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
||||||
|
261
system/database/drivers/odbc/odbc_driver.php
Executable file → Normal file
261
system/database/drivers/odbc/odbc_driver.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -37,9 +48,9 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_odbc_driver extends CI_DB {
|
class CI_DB_odbc_driver extends CI_DB_driver {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Database driver
|
* Database driver
|
||||||
@ -82,6 +93,22 @@ class CI_DB_odbc_driver extends CI_DB {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ODBC result ID resource returned from odbc_prepare()
|
||||||
|
*
|
||||||
|
* @var resource
|
||||||
|
*/
|
||||||
|
private $odbc_result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Values to use with odbc_execute() for prepared statements
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $binds = array();
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class constructor
|
* Class constructor
|
||||||
*
|
*
|
||||||
@ -116,6 +143,74 @@ class CI_DB_odbc_driver extends CI_DB {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compile Bindings
|
||||||
|
*
|
||||||
|
* @param string $sql SQL statement
|
||||||
|
* @param array $binds An array of values to bind
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function compile_binds($sql, $binds)
|
||||||
|
{
|
||||||
|
if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE)
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
elseif ( ! is_array($binds))
|
||||||
|
{
|
||||||
|
$binds = array($binds);
|
||||||
|
$bind_count = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Make sure we're using numeric keys
|
||||||
|
$binds = array_values($binds);
|
||||||
|
$bind_count = count($binds);
|
||||||
|
}
|
||||||
|
|
||||||
|
// We'll need the marker length later
|
||||||
|
$ml = strlen($this->bind_marker);
|
||||||
|
|
||||||
|
// Make sure not to replace a chunk inside a string that happens to match the bind marker
|
||||||
|
if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches))
|
||||||
|
{
|
||||||
|
$c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i',
|
||||||
|
str_replace($matches[0],
|
||||||
|
str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]),
|
||||||
|
$sql, $c),
|
||||||
|
$matches, PREG_OFFSET_CAPTURE);
|
||||||
|
|
||||||
|
// Bind values' count must match the count of markers in the query
|
||||||
|
if ($bind_count !== $c)
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count)
|
||||||
|
{
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->bind_marker !== '?')
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
$c--;
|
||||||
|
$sql = substr_replace($sql, '?', $matches[0][$c][1], $ml);
|
||||||
|
}
|
||||||
|
while ($c !== 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FALSE !== ($this->odbc_result = odbc_prepare($this->conn_id, $sql)))
|
||||||
|
{
|
||||||
|
$this->binds = array_values($binds);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the query
|
* Execute the query
|
||||||
*
|
*
|
||||||
@ -123,31 +218,37 @@ class CI_DB_odbc_driver extends CI_DB {
|
|||||||
* @return resource
|
* @return resource
|
||||||
*/
|
*/
|
||||||
protected function _execute($sql)
|
protected function _execute($sql)
|
||||||
|
{
|
||||||
|
if ( ! isset($this->odbc_result))
|
||||||
{
|
{
|
||||||
return odbc_exec($this->conn_id, $sql);
|
return odbc_exec($this->conn_id, $sql);
|
||||||
}
|
}
|
||||||
|
elseif ($this->odbc_result === FALSE)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TRUE === ($success = odbc_execute($this->odbc_result, $this->binds)))
|
||||||
|
{
|
||||||
|
// For queries that return result sets, return the result_id resource on success
|
||||||
|
$this->is_write_type($sql) OR $success = $this->odbc_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->odbc_result = NULL;
|
||||||
|
$this->binds = array();
|
||||||
|
|
||||||
|
return $success;
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begin Transaction
|
* Begin Transaction
|
||||||
*
|
*
|
||||||
* @param bool $test_mode
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_begin($test_mode = FALSE)
|
protected function _trans_begin()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $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);
|
|
||||||
|
|
||||||
return odbc_autocommit($this->conn_id, FALSE);
|
return odbc_autocommit($this->conn_id, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,17 +259,15 @@ class CI_DB_odbc_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_commit()
|
protected function _trans_commit()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
if (odbc_commit($this->conn_id))
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
{
|
||||||
|
odbc_autocommit($this->conn_id, TRUE);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
$ret = odbc_commit($this->conn_id);
|
return FALSE;
|
||||||
odbc_autocommit($this->conn_id, TRUE);
|
|
||||||
return $ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -178,30 +277,46 @@ class CI_DB_odbc_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_rollback()
|
protected function _trans_rollback()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
if (odbc_rollback($this->conn_id))
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
{
|
||||||
|
odbc_autocommit($this->conn_id, TRUE);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
$ret = odbc_rollback($this->conn_id);
|
return FALSE;
|
||||||
odbc_autocommit($this->conn_id, TRUE);
|
|
||||||
return $ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Platform-dependant string escape
|
* Determines if a query is a "write" type.
|
||||||
|
*
|
||||||
|
* @param string An SQL query string
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function is_write_type($sql)
|
||||||
|
{
|
||||||
|
if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::is_write_type($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Platform-dependent string escape
|
||||||
*
|
*
|
||||||
* @param string
|
* @param string
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected function _escape_str($str)
|
protected function _escape_str($str)
|
||||||
{
|
{
|
||||||
return remove_invisible_characters($str);
|
$this->display_error('db_unsupported_feature');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -225,7 +340,7 @@ class CI_DB_odbc_driver extends CI_DB {
|
|||||||
*/
|
*/
|
||||||
public function insert_id()
|
public function insert_id()
|
||||||
{
|
{
|
||||||
return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE;
|
return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
@ -287,7 +402,7 @@ class CI_DB_odbc_driver extends CI_DB {
|
|||||||
* Error
|
* Error
|
||||||
*
|
*
|
||||||
* Returns an array containing code and message of the last
|
* Returns an array containing code and message of the last
|
||||||
* database error that has occured.
|
* database error that has occurred.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@ -298,58 +413,6 @@ class CI_DB_odbc_driver extends CI_DB {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
|
||||||
* Update statement
|
|
||||||
*
|
|
||||||
* Generates a platform-specific update string from the supplied data
|
|
||||||
*
|
|
||||||
* @param string $table
|
|
||||||
* @param array $values
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function _update($table, $values)
|
|
||||||
{
|
|
||||||
$this->qb_limit = FALSE;
|
|
||||||
$this->qb_orderby = array();
|
|
||||||
return parent::_update($table, $values);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Truncate statement
|
|
||||||
*
|
|
||||||
* Generates a platform-specific truncate string from the supplied data
|
|
||||||
*
|
|
||||||
* If the database does not support the TRUNCATE statement,
|
|
||||||
* then this method maps to 'DELETE FROM table'
|
|
||||||
*
|
|
||||||
* @param string $table
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function _truncate($table)
|
|
||||||
{
|
|
||||||
return 'DELETE FROM '.$table;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete statement
|
|
||||||
*
|
|
||||||
* Generates a platform-specific delete string from the supplied data
|
|
||||||
*
|
|
||||||
* @param string $table
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function _delete($table)
|
|
||||||
{
|
|
||||||
$this->qb_limit = FALSE;
|
|
||||||
return parent::_delete($table);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close DB Connection
|
* Close DB Connection
|
||||||
*
|
*
|
||||||
@ -359,8 +422,4 @@ class CI_DB_odbc_driver extends CI_DB {
|
|||||||
{
|
{
|
||||||
odbc_close($this->conn_id);
|
odbc_close($this->conn_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file odbc_driver.php */
|
|
||||||
/* Location: ./system/database/drivers/odbc/odbc_driver.php */
|
|
46
system/database/drivers/odbc/odbc_forge.php
Executable file → Normal file
46
system/database/drivers/odbc/odbc_forge.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -29,9 +40,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
/**
|
/**
|
||||||
* ODBC Forge Class
|
* ODBC Forge Class
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/database/
|
* @link https://codeigniter.com/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_odbc_forge extends CI_DB_forge {
|
class CI_DB_odbc_forge extends CI_DB_forge {
|
||||||
|
|
||||||
@ -71,6 +84,3 @@ class CI_DB_odbc_forge extends CI_DB_forge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file odbc_forge.php */
|
|
||||||
/* Location: ./system/database/drivers/odbc/odbc_forge.php */
|
|
47
system/database/drivers/odbc/odbc_result.php
Executable file → Normal file
47
system/database/drivers/odbc/odbc_result.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,10 +42,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* This class extends the parent result class: CI_DB_result
|
* This class extends the parent result class: CI_DB_result
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
* @since 1.3
|
|
||||||
*/
|
*/
|
||||||
class CI_DB_odbc_result extends CI_DB_result {
|
class CI_DB_odbc_result extends CI_DB_result {
|
||||||
|
|
||||||
@ -254,6 +266,3 @@ if ( ! function_exists('odbc_fetch_object'))
|
|||||||
return $rs_object;
|
return $rs_object;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file odbc_result.php */
|
|
||||||
/* Location: ./system/database/drivers/odbc/odbc_result.php */
|
|
46
system/database/drivers/odbc/odbc_utility.php
Executable file → Normal file
46
system/database/drivers/odbc/odbc_utility.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 1.3.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -29,9 +40,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
/**
|
/**
|
||||||
* ODBC Utility Class
|
* ODBC Utility Class
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/database/
|
* @link https://codeigniter.com/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_odbc_utility extends CI_DB_utility {
|
class CI_DB_odbc_utility extends CI_DB_utility {
|
||||||
|
|
||||||
@ -48,6 +61,3 @@ class CI_DB_odbc_utility extends CI_DB_utility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file odbc_utility.php */
|
|
||||||
/* Location: ./system/database/drivers/odbc/odbc_utility.php */
|
|
1
system/database/drivers/pdo/index.html
Executable file → Normal file
1
system/database/drivers/pdo/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
||||||
|
131
system/database/drivers/pdo/pdo_driver.php
Executable file → Normal file
131
system/database/drivers/pdo/pdo_driver.php
Executable file → Normal file
@ -2,25 +2,36 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
* @link https://codeigniter.com
|
||||||
* @since Version 2.1.0
|
* @since Version 2.1.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
@ -37,7 +48,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_pdo_driver extends CI_DB {
|
class CI_DB_pdo_driver extends CI_DB {
|
||||||
|
|
||||||
@ -115,7 +126,10 @@ class CI_DB_pdo_driver extends CI_DB {
|
|||||||
*/
|
*/
|
||||||
public function db_connect($persistent = FALSE)
|
public function db_connect($persistent = FALSE)
|
||||||
{
|
{
|
||||||
$this->options[PDO::ATTR_PERSISTENT] = $persistent;
|
if ($persistent === TRUE)
|
||||||
|
{
|
||||||
|
$this->options[PDO::ATTR_PERSISTENT] = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -145,10 +159,6 @@ class CI_DB_pdo_driver extends CI_DB {
|
|||||||
{
|
{
|
||||||
return $this->data_cache['version'];
|
return $this->data_cache['version'];
|
||||||
}
|
}
|
||||||
elseif ( ! $this->conn_id)
|
|
||||||
{
|
|
||||||
$this->initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not all subdrivers support the getAttribute() method
|
// Not all subdrivers support the getAttribute() method
|
||||||
try
|
try
|
||||||
@ -179,22 +189,10 @@ class CI_DB_pdo_driver extends CI_DB {
|
|||||||
/**
|
/**
|
||||||
* Begin Transaction
|
* Begin Transaction
|
||||||
*
|
*
|
||||||
* @param bool $test_mode
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_begin($test_mode = FALSE)
|
protected function _trans_begin()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $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);
|
|
||||||
|
|
||||||
return $this->conn_id->beginTransaction();
|
return $this->conn_id->beginTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,14 +203,8 @@ class CI_DB_pdo_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_commit()
|
protected function _trans_commit()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->conn_id->commit();
|
return $this->conn_id->commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,21 +215,15 @@ class CI_DB_pdo_driver extends CI_DB {
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function trans_rollback()
|
protected function _trans_rollback()
|
||||||
{
|
{
|
||||||
// When transactions are nested we only begin/commit/rollback the outermost ones
|
|
||||||
if ( ! $this->trans_enabled OR $this->_trans_depth > 0)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->conn_id->rollBack();
|
return $this->conn_id->rollBack();
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Platform-dependant string escape
|
* Platform-dependent string escape
|
||||||
*
|
*
|
||||||
* @param string
|
* @param string
|
||||||
* @return string
|
* @return string
|
||||||
@ -299,7 +285,7 @@ class CI_DB_pdo_driver extends CI_DB {
|
|||||||
* Error
|
* Error
|
||||||
*
|
*
|
||||||
* Returns an array containing code and message of the last
|
* Returns an array containing code and message of the last
|
||||||
* database error that has occured.
|
* database error that has occurred.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@ -324,52 +310,6 @@ class CI_DB_pdo_driver extends CI_DB {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
|
||||||
* Update_Batch statement
|
|
||||||
*
|
|
||||||
* Generates a platform-specific batch update string from the supplied data
|
|
||||||
*
|
|
||||||
* @param string $table Table name
|
|
||||||
* @param array $values Update data
|
|
||||||
* @param string $index WHERE key
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function _update_batch($table, $values, $index)
|
|
||||||
{
|
|
||||||
$ids = array();
|
|
||||||
foreach ($values as $key => $val)
|
|
||||||
{
|
|
||||||
$ids[] = $val[$index];
|
|
||||||
|
|
||||||
foreach (array_keys($val) as $field)
|
|
||||||
{
|
|
||||||
if ($field !== $index)
|
|
||||||
{
|
|
||||||
$final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$cases = '';
|
|
||||||
foreach ($final as $k => $v)
|
|
||||||
{
|
|
||||||
$cases .= $k.' = CASE '."\n";
|
|
||||||
|
|
||||||
foreach ($v as $row)
|
|
||||||
{
|
|
||||||
$cases .= $row."\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
$cases .= 'ELSE '.$k.' END, ';
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE);
|
|
||||||
|
|
||||||
return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Truncate statement
|
* Truncate statement
|
||||||
*
|
*
|
||||||
@ -387,6 +327,3 @@ class CI_DB_pdo_driver extends CI_DB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file pdo_driver.php */
|
|
||||||
/* Location: ./system/database/drivers/pdo/pdo_driver.php */
|
|
44
system/database/drivers/pdo/pdo_forge.php
Executable file → Normal file
44
system/database/drivers/pdo/pdo_forge.php
Executable file → Normal file
@ -2,25 +2,36 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
* @link https://codeigniter.com
|
||||||
* @since Version 2.1.0
|
* @since Version 2.1.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
@ -29,9 +40,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
/**
|
/**
|
||||||
* PDO Forge Class
|
* PDO Forge Class
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/database/
|
* @link https://codeigniter.com/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_pdo_forge extends CI_DB_forge {
|
class CI_DB_pdo_forge extends CI_DB_forge {
|
||||||
|
|
||||||
@ -50,6 +63,3 @@ class CI_DB_pdo_forge extends CI_DB_forge {
|
|||||||
protected $_drop_table_if = FALSE;
|
protected $_drop_table_if = FALSE;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file pdo_forge.php */
|
|
||||||
/* Location: ./system/database/drivers/pdo/pdo_forge.php */
|
|
49
system/database/drivers/pdo/pdo_result.php
Executable file → Normal file
49
system/database/drivers/pdo/pdo_result.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 2.1.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,10 +42,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* This class extends the parent result class: CI_DB_result
|
* This class extends the parent result class: CI_DB_result
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
* @since 2.1
|
|
||||||
*/
|
*/
|
||||||
class CI_DB_pdo_result extends CI_DB_result {
|
class CI_DB_pdo_result extends CI_DB_result {
|
||||||
|
|
||||||
@ -93,7 +105,7 @@ class CI_DB_pdo_result extends CI_DB_result {
|
|||||||
{
|
{
|
||||||
// Might trigger an E_WARNING due to not all subdrivers
|
// Might trigger an E_WARNING due to not all subdrivers
|
||||||
// supporting getColumnMeta()
|
// supporting getColumnMeta()
|
||||||
$field_names[$i] = @$this->result_id->getColumnMeta();
|
$field_names[$i] = @$this->result_id->getColumnMeta($i);
|
||||||
$field_names[$i] = $field_names[$i]['name'];
|
$field_names[$i] = $field_names[$i]['name'];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,6 +196,3 @@ class CI_DB_pdo_result extends CI_DB_result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file pdo_result.php */
|
|
||||||
/* Location: ./system/database/drivers/pdo/pdo_result.php */
|
|
44
system/database/drivers/pdo/pdo_utility.php
Executable file → Normal file
44
system/database/drivers/pdo/pdo_utility.php
Executable file → Normal file
@ -2,25 +2,36 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
* @link https://codeigniter.com
|
||||||
* @since Version 2.1.0
|
* @since Version 2.1.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
@ -29,9 +40,11 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
/**
|
/**
|
||||||
* PDO Utility Class
|
* PDO Utility Class
|
||||||
*
|
*
|
||||||
|
* @package CodeIgniter
|
||||||
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/database/
|
* @link https://codeigniter.com/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_pdo_utility extends CI_DB_utility {
|
class CI_DB_pdo_utility extends CI_DB_utility {
|
||||||
|
|
||||||
@ -48,6 +61,3 @@ class CI_DB_pdo_utility extends CI_DB_utility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file pdo_utility.php */
|
|
||||||
/* Location: ./system/database/drivers/pdo/pdo_utility.php */
|
|
1
system/database/drivers/pdo/subdrivers/index.html
Executable file → Normal file
1
system/database/drivers/pdo/subdrivers/index.html
Executable file → Normal file
@ -1,3 +1,4 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>403 Forbidden</title>
|
<title>403 Forbidden</title>
|
||||||
|
42
system/database/drivers/pdo/subdrivers/pdo_4d_driver.php
Executable file → Normal file
42
system/database/drivers/pdo/subdrivers/pdo_4d_driver.php
Executable file → Normal file
@ -2,25 +2,36 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
* @link https://codeigniter.com
|
||||||
* @since Version 3.0.0
|
* @since Version 3.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
@ -37,7 +48,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_pdo_4d_driver extends CI_DB_pdo_driver {
|
class CI_DB_pdo_4d_driver extends CI_DB_pdo_driver {
|
||||||
|
|
||||||
@ -187,6 +198,3 @@ class CI_DB_pdo_4d_driver extends CI_DB_pdo_driver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file pdo_4d_driver.php */
|
|
||||||
/* Location: ./system/database/drivers/pdo/subdrivers/pdo_4d_driver.php */
|
|
48
system/database/drivers/pdo/subdrivers/pdo_4d_forge.php
Executable file → Normal file
48
system/database/drivers/pdo/subdrivers/pdo_4d_forge.php
Executable file → Normal file
@ -2,26 +2,37 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
* @since Version 2.1.0
|
* @link https://codeigniter.com
|
||||||
|
* @since Version 3.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||||
@ -31,9 +42,9 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
*
|
*
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_pdo_4d_forge extends CI_DB_4d_forge {
|
class CI_DB_pdo_4d_forge extends CI_DB_pdo_forge {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CREATE DATABASE statement
|
* CREATE DATABASE statement
|
||||||
@ -153,7 +164,7 @@ class CI_DB_pdo_4d_forge extends CI_DB_4d_forge {
|
|||||||
$attributes['TYPE'] = 'INT';
|
$attributes['TYPE'] = 'INT';
|
||||||
return;
|
return;
|
||||||
case 'BIGINT':
|
case 'BIGINT':
|
||||||
$attribites['TYPE'] = 'INT64';
|
$attributes['TYPE'] = 'INT64';
|
||||||
return;
|
return;
|
||||||
default: return;
|
default: return;
|
||||||
}
|
}
|
||||||
@ -204,6 +215,3 @@ class CI_DB_pdo_4d_forge extends CI_DB_4d_forge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file pdo_4d_forge.php */
|
|
||||||
/* Location: ./system/database/drivers/pdo/subdrivers/pdo_4d_forge.php */
|
|
90
system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php
Executable file → Normal file
90
system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php
Executable file → Normal file
@ -2,25 +2,36 @@
|
|||||||
/**
|
/**
|
||||||
* CodeIgniter
|
* CodeIgniter
|
||||||
*
|
*
|
||||||
* An open source application development framework for PHP 5.2.4 or newer
|
* An open source application development framework for PHP
|
||||||
*
|
*
|
||||||
* NOTICE OF LICENSE
|
* This content is released under the MIT License (MIT)
|
||||||
*
|
*
|
||||||
* Licensed under the Open Software License version 3.0
|
* Copyright (c) 2014 - 2019, British Columbia Institute of Technology
|
||||||
*
|
*
|
||||||
* This source file is subject to the Open Software License (OSL 3.0) that is
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* bundled with this package in the files license.txt / license.rst. It is
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
* also available through the world wide web at this URL:
|
* in the Software without restriction, including without limitation the rights
|
||||||
* http://opensource.org/licenses/OSL-3.0
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
* If you did not receive a copy of the license and are unable to obtain it
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
* through the world wide web, please send an email to
|
* furnished to do so, subject to the following conditions:
|
||||||
* licensing@ellislab.com so we can send you a copy immediately.
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
*
|
*
|
||||||
* @package CodeIgniter
|
* @package CodeIgniter
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
|
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
|
||||||
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
|
||||||
* @link http://codeigniter.com
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
* @link https://codeigniter.com
|
||||||
* @since Version 3.0.0
|
* @since Version 3.0.0
|
||||||
* @filesource
|
* @filesource
|
||||||
*/
|
*/
|
||||||
@ -37,7 +48,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
|
|||||||
* @subpackage Drivers
|
* @subpackage Drivers
|
||||||
* @category Database
|
* @category Database
|
||||||
* @author EllisLab Dev Team
|
* @author EllisLab Dev Team
|
||||||
* @link http://codeigniter.com/user_guide/database/
|
* @link https://codeigniter.com/user_guide/database/
|
||||||
*/
|
*/
|
||||||
class CI_DB_pdo_cubrid_driver extends CI_DB_pdo_driver {
|
class CI_DB_pdo_cubrid_driver extends CI_DB_pdo_driver {
|
||||||
|
|
||||||
@ -131,13 +142,8 @@ class CI_DB_pdo_cubrid_driver extends CI_DB_pdo_driver {
|
|||||||
* @param string $table
|
* @param string $table
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function field_data($table = '')
|
public function field_data($table)
|
||||||
{
|
{
|
||||||
if ($table === '')
|
|
||||||
{
|
|
||||||
return ($this->db_debug) ? $this->display_error('db_field_param_missing') : FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)
|
if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -164,47 +170,6 @@ class CI_DB_pdo_cubrid_driver extends CI_DB_pdo_driver {
|
|||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
|
||||||
* Update_Batch statement
|
|
||||||
*
|
|
||||||
* Generates a platform-specific batch update string from the supplied data
|
|
||||||
*
|
|
||||||
* @param string $table Table name
|
|
||||||
* @param array $values Update data
|
|
||||||
* @param string $index WHERE key
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function _update_batch($table, $values, $index)
|
|
||||||
{
|
|
||||||
$ids = array();
|
|
||||||
foreach ($values as $key => $val)
|
|
||||||
{
|
|
||||||
$ids[] = $val[$index];
|
|
||||||
|
|
||||||
foreach (array_keys($val) as $field)
|
|
||||||
{
|
|
||||||
if ($field !== $index)
|
|
||||||
{
|
|
||||||
$final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$cases = '';
|
|
||||||
foreach ($final as $k => $v)
|
|
||||||
{
|
|
||||||
$cases .= $k." = CASE \n"
|
|
||||||
.implode("\n", $v)."\n"
|
|
||||||
.'ELSE '.$k.' END), ';
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->where($index.' IN('.implode(',', $ids).')', NULL, FALSE);
|
|
||||||
|
|
||||||
return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where');
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Truncate statement
|
* Truncate statement
|
||||||
*
|
*
|
||||||
@ -242,6 +207,3 @@ class CI_DB_pdo_cubrid_driver extends CI_DB_pdo_driver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End of file pdo_cubrid_driver.php */
|
|
||||||
/* Location: ./system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php */
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user