-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/*\r
-| -------------------------------------------------------------------\r
-| AUTO-LOADER\r
-| -------------------------------------------------------------------\r
-| This file specifies which systems should be loaded by default.\r
-|\r
-| In order to keep the framework as light-weight as possible only the\r
-| absolute minimal resources are loaded by default. For example,\r
-| the database is not connected to automatically since no assumption\r
-| is made regarding whether you intend to use it. This file lets\r
-| you globally define which systems you would like loaded with every\r
-| request.\r
-|\r
-| -------------------------------------------------------------------\r
-| Instructions\r
-| -------------------------------------------------------------------\r
-|\r
-| These are the things you can load automatically:\r
-|\r
-| 1. Libraries\r
-| 2. Helper files\r
-| 3. Plugins\r
-| 4. Custom config files\r
-| 5. Language files\r
-| 6. Models\r
-|\r
-*/\r
-\r
-/*\r
-| -------------------------------------------------------------------\r
-| Auto-load Libraries\r
-| -------------------------------------------------------------------\r
-| These are the classes located in the system/libraries folder\r
-| or in your system/application/libraries folder.\r
-|\r
-| Prototype:\r
-|\r
-| $autoload['libraries'] = array('database', 'session', 'xmlrpc');\r
-*/\r
-\r
-$autoload['libraries'] = array();\r
-\r
-\r
-/*\r
-| -------------------------------------------------------------------\r
-| Auto-load Helper Files\r
-| -------------------------------------------------------------------\r
-| Prototype:\r
-|\r
-| $autoload['helper'] = array('url', 'file');\r
-*/\r
-\r
-$autoload['helper'] = array();\r
-\r
-\r
-/*\r
-| -------------------------------------------------------------------\r
-| Auto-load Plugins\r
-| -------------------------------------------------------------------\r
-| Prototype:\r
-|\r
-| $autoload['plugin'] = array('captcha', 'js_calendar');\r
-*/\r
-\r
-$autoload['plugin'] = array();\r
-\r
-\r
-/*\r
-| -------------------------------------------------------------------\r
-| Auto-load Config files\r
-| -------------------------------------------------------------------\r
-| Prototype:\r
-|\r
-| $autoload['config'] = array('config1', 'config2');\r
-|\r
-| NOTE: This item is intended for use ONLY if you have created custom\r
-| config files. Otherwise, leave it blank.\r
-|\r
-*/\r
-\r
-$autoload['config'] = array();\r
-\r
-\r
-/*\r
-| -------------------------------------------------------------------\r
-| Auto-load Language files\r
-| -------------------------------------------------------------------\r
-| Prototype:\r
-|\r
-| $autoload['language'] = array('lang1', 'lang2');\r
-|\r
-| NOTE: Do not include the "_lang" part of your file. For example \r
-| "codeigniter_lang.php" would be referenced as array('codeigniter');\r
-|\r
-*/\r
-\r
-$autoload['language'] = array();\r
-\r
-\r
-/*\r
-| -------------------------------------------------------------------\r
-| Auto-load Models\r
-| -------------------------------------------------------------------\r
-| Prototype:\r
-|\r
-| $autoload['model'] = array('model1', 'model2');\r
-|\r
-*/\r
-\r
-$autoload['model'] = array();\r
-\r
-\r
-/*\r
-| -------------------------------------------------------------------\r
-| Auto-load Core Libraries\r
-| -------------------------------------------------------------------\r
-|\r
-| DEPRECATED: Use $autoload['libraries'] above instead.\r
-|\r
-*/\r
-// $autoload['core'] = array();\r
-\r
-\r
-\r
-/* End of file autoload.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/*
+| -------------------------------------------------------------------
+| AUTO-LOADER
+| -------------------------------------------------------------------
+| This file specifies which systems should be loaded by default.
+|
+| In order to keep the framework as light-weight as possible only the
+| absolute minimal resources are loaded by default. For example,
+| the database is not connected to automatically since no assumption
+| is made regarding whether you intend to use it. This file lets
+| you globally define which systems you would like loaded with every
+| request.
+|
+| -------------------------------------------------------------------
+| Instructions
+| -------------------------------------------------------------------
+|
+| These are the things you can load automatically:
+|
+| 1. Libraries
+| 2. Helper files
+| 3. Plugins
+| 4. Custom config files
+| 5. Language files
+| 6. Models
+|
+*/
+
+/*
+| -------------------------------------------------------------------
+| Auto-load Libraries
+| -------------------------------------------------------------------
+| These are the classes located in the system/libraries folder
+| or in your system/application/libraries folder.
+|
+| Prototype:
+|
+| $autoload['libraries'] = array('database', 'session', 'xmlrpc');
+*/
+
+$autoload['libraries'] = array();
+
+
+/*
+| -------------------------------------------------------------------
+| Auto-load Helper Files
+| -------------------------------------------------------------------
+| Prototype:
+|
+| $autoload['helper'] = array('url', 'file');
+*/
+
+$autoload['helper'] = array();
+
+
+/*
+| -------------------------------------------------------------------
+| Auto-load Plugins
+| -------------------------------------------------------------------
+| Prototype:
+|
+| $autoload['plugin'] = array('captcha', 'js_calendar');
+*/
+
+$autoload['plugin'] = array();
+
+
+/*
+| -------------------------------------------------------------------
+| Auto-load Config files
+| -------------------------------------------------------------------
+| Prototype:
+|
+| $autoload['config'] = array('config1', 'config2');
+|
+| NOTE: This item is intended for use ONLY if you have created custom
+| config files. Otherwise, leave it blank.
+|
+*/
+
+$autoload['config'] = array();
+
+
+/*
+| -------------------------------------------------------------------
+| Auto-load Language files
+| -------------------------------------------------------------------
+| Prototype:
+|
+| $autoload['language'] = array('lang1', 'lang2');
+|
+| NOTE: Do not include the "_lang" part of your file. For example
+| "codeigniter_lang.php" would be referenced as array('codeigniter');
+|
+*/
+
+$autoload['language'] = array();
+
+
+/*
+| -------------------------------------------------------------------
+| Auto-load Models
+| -------------------------------------------------------------------
+| Prototype:
+|
+| $autoload['model'] = array('model1', 'model2');
+|
+*/
+
+$autoload['model'] = array();
+
+
+/*
+| -------------------------------------------------------------------
+| Auto-load Core Libraries
+| -------------------------------------------------------------------
+|
+| DEPRECATED: Use $autoload['libraries'] above instead.
+|
+*/
+// $autoload['core'] = array();
+
+
+
+/* End of file autoload.php */
/* Location: ./system/application/config/autoload.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-\r
-include_once 'plc_config.php';\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Base Site URL\r
-|--------------------------------------------------------------------------\r
-|\r
-| URL to your CodeIgniter root. Typically this will be your base URL,\r
-| WITH a trailing slash:\r
-|\r
-| http://example.com/\r
-|\r
-*/\r
-$config['base_url'] = "https://". PLC_WWW_HOST . ":" . PLC_WWW_SSL_PORT ."/registerwizard/";\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Index File\r
-|--------------------------------------------------------------------------\r
-|\r
-| Typically this will be your index.php file, unless you've renamed it to\r
-| something else. If you are using mod_rewrite to remove the page set this\r
-| variable so that it is blank.\r
-|\r
-*/\r
-$config['index_page'] = "index.php";\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| URI PROTOCOL\r
-|--------------------------------------------------------------------------\r
-|\r
-| This item determines which server global should be used to retrieve the\r
-| URI string. The default setting of "AUTO" works for most servers.\r
-| If your links do not seem to work, try one of the other delicious flavors:\r
-|\r
-| 'AUTO' Default - auto detects\r
-| 'PATH_INFO' Uses the PATH_INFO\r
-| 'QUERY_STRING' Uses the QUERY_STRING\r
-| 'REQUEST_URI' Uses the REQUEST_URI\r
-| 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO\r
-|\r
-*/\r
-$config['uri_protocol'] = "AUTO";\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| URL suffix\r
-|--------------------------------------------------------------------------\r
-|\r
-| This option allows you to add a suffix to all URLs generated by CodeIgniter.\r
-| For more information please see the user guide:\r
-|\r
-| http://codeigniter.com/user_guide/general/urls.html\r
-*/\r
-\r
-$config['url_suffix'] = "";\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Default Language\r
-|--------------------------------------------------------------------------\r
-|\r
-| This determines which set of language files should be used. Make sure\r
-| there is an available translation if you intend to use something other\r
-| than english.\r
-|\r
-*/\r
-$config['language'] = "english";\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Default Character Set\r
-|--------------------------------------------------------------------------\r
-|\r
-| This determines which character set is used by default in various methods\r
-| that require a character set to be provided.\r
-|\r
-*/\r
-$config['charset'] = "UTF-8";\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Enable/Disable System Hooks\r
-|--------------------------------------------------------------------------\r
-|\r
-| If you would like to use the "hooks" feature you must enable it by\r
-| setting this variable to TRUE (boolean). See the user guide for details.\r
-|\r
-*/\r
-$config['enable_hooks'] = FALSE;\r
-\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Class Extension Prefix\r
-|--------------------------------------------------------------------------\r
-|\r
-| This item allows you to set the filename/classname prefix when extending\r
-| native libraries. For more information please see the user guide:\r
-|\r
-| http://codeigniter.com/user_guide/general/core_classes.html\r
-| http://codeigniter.com/user_guide/general/creating_libraries.html\r
-|\r
-*/\r
-$config['subclass_prefix'] = 'MY_';\r
-\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Allowed URL Characters\r
-|--------------------------------------------------------------------------\r
-|\r
-| This lets you specify with a regular expression which characters are permitted\r
-| within your URLs. When someone tries to submit a URL with disallowed\r
-| characters they will get a warning message.\r
-|\r
-| As a security measure you are STRONGLY encouraged to restrict URLs to\r
-| as few characters as possible. By default only these are allowed: a-z 0-9~%.:_-\r
-|\r
-| Leave blank to allow all characters -- but only if you are insane.\r
-|\r
-| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!\r
-|\r
-*/\r
-$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';\r
-\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Enable Query Strings\r
-|--------------------------------------------------------------------------\r
-|\r
-| By default CodeIgniter uses search-engine friendly segment based URLs:\r
-| example.com/who/what/where/\r
-|\r
-| You can optionally enable standard query string based URLs:\r
-| example.com?who=me&what=something&where=here\r
-|\r
-| Options are: TRUE or FALSE (boolean)\r
-|\r
-| The other items let you set the query string "words" that will\r
-| invoke your controllers and its functions:\r
-| example.com/index.php?c=controller&m=function\r
-|\r
-| Please note that some of the helpers won't work as expected when\r
-| this feature is enabled, since CodeIgniter is designed primarily to\r
-| use segment based URLs.\r
-|\r
-*/\r
-$config['enable_query_strings'] = FALSE;\r
-$config['controller_trigger'] = 'c';\r
-$config['function_trigger'] = 'm';\r
-$config['directory_trigger'] = 'd'; // experimental not currently in use\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Error Logging Threshold\r
-|--------------------------------------------------------------------------\r
-|\r
-| If you have enabled error logging, you can set an error threshold to \r
-| determine what gets logged. Threshold options are:\r
-| You can enable error logging by setting a threshold over zero. The\r
-| threshold determines what gets logged. Threshold options are:\r
-|\r
-| 0 = Disables logging, Error logging TURNED OFF\r
-| 1 = Error Messages (including PHP errors)\r
-| 2 = Debug Messages\r
-| 3 = Informational Messages\r
-| 4 = All Messages\r
-|\r
-| For a live site you'll usually only enable Errors (1) to be logged otherwise\r
-| your log files will fill up very fast.\r
-|\r
-*/\r
-$config['log_threshold'] = 0;\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Error Logging Directory Path\r
-|--------------------------------------------------------------------------\r
-|\r
-| Leave this BLANK unless you would like to set something other than the default\r
-| system/logs/ folder. Use a full server path with trailing slash.\r
-|\r
-*/\r
-$config['log_path'] = '';\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Date Format for Logs\r
-|--------------------------------------------------------------------------\r
-|\r
-| Each item that is logged has an associated date. You can use PHP date\r
-| codes to set your own date formatting\r
-|\r
-*/\r
-$config['log_date_format'] = 'Y-m-d H:i:s';\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Cache Directory Path\r
-|--------------------------------------------------------------------------\r
-|\r
-| Leave this BLANK unless you would like to set something other than the default\r
-| system/cache/ folder. Use a full server path with trailing slash.\r
-|\r
-*/\r
-$config['cache_path'] = '';\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Encryption Key\r
-|--------------------------------------------------------------------------\r
-|\r
-| If you use the Encryption class or the Sessions class with encryption\r
-| enabled you MUST set an encryption key. See the user guide for info.\r
-|\r
-*/\r
-$config['encryption_key'] = "";\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Session Variables\r
-|--------------------------------------------------------------------------\r
-|\r
-| 'session_cookie_name' = the name you want for the cookie\r
-| 'encrypt_sess_cookie' = TRUE/FALSE (boolean). Whether to encrypt the cookie\r
-| 'session_expiration' = the number of SECONDS you want the session to last.\r
-| by default sessions last 7200 seconds (two hours). Set to zero for no expiration.\r
-| 'time_to_update' = how many seconds between CI refreshing Session Information\r
-|\r
-*/\r
-$config['sess_cookie_name'] = 'ci_session';\r
-$config['sess_expiration'] = 7200;\r
-$config['sess_encrypt_cookie'] = FALSE;\r
-$config['sess_use_database'] = FALSE;\r
-$config['sess_table_name'] = 'ci_sessions';\r
-$config['sess_match_ip'] = FALSE;\r
-$config['sess_match_useragent'] = TRUE;\r
-$config['sess_time_to_update'] = 300;\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Cookie Related Variables\r
-|--------------------------------------------------------------------------\r
-|\r
-| 'cookie_prefix' = Set a prefix if you need to avoid collisions\r
-| 'cookie_domain' = Set to .your-domain.com for site-wide cookies\r
-| 'cookie_path' = Typically will be a forward slash\r
-|\r
-*/\r
-$config['cookie_prefix'] = "";\r
-$config['cookie_domain'] = "";\r
-$config['cookie_path'] = "/";\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Global XSS Filtering\r
-|--------------------------------------------------------------------------\r
-|\r
-| Determines whether the XSS filter is always active when GET, POST or\r
-| COOKIE data is encountered\r
-|\r
-*/\r
-$config['global_xss_filtering'] = FALSE;\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Output Compression\r
-|--------------------------------------------------------------------------\r
-|\r
-| Enables Gzip output compression for faster page loads. When enabled,\r
-| the output class will test whether your server supports Gzip.\r
-| Even if it does, however, not all browsers support compression\r
-| so enable only if you are reasonably sure your visitors can handle it.\r
-|\r
-| VERY IMPORTANT: If you are getting a blank page when compression is enabled it\r
-| means you are prematurely outputting something to your browser. It could\r
-| even be a line of whitespace at the end of one of your scripts. For\r
-| compression to work, nothing can be sent before the output buffer is called\r
-| by the output class. Do not "echo" any values with compression enabled.\r
-|\r
-*/\r
-$config['compress_output'] = FALSE;\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Master Time Reference\r
-|--------------------------------------------------------------------------\r
-|\r
-| Options are "local" or "gmt". This pref tells the system whether to use\r
-| your server's local time as the master "now" reference, or convert it to\r
-| GMT. See the "date helper" page of the user guide for information\r
-| regarding date handling.\r
-|\r
-*/\r
-$config['time_reference'] = 'local';\r
-\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| Rewrite PHP Short Tags\r
-|--------------------------------------------------------------------------\r
-|\r
-| If your PHP installation does not have short tag support enabled CI\r
-| can rewrite the tags on-the-fly, enabling you to utilize that syntax\r
-| in your view files. Options are TRUE or FALSE (boolean)\r
-|\r
-*/\r
-$config['rewrite_short_tags'] = FALSE;\r
-\r
-\r
-\r
-/* End of file config.php */\r
-/* Location: ./system/application/config/config.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+
+include_once 'plc_config.php';
+/*
+|--------------------------------------------------------------------------
+| Base Site URL
+|--------------------------------------------------------------------------
+|
+| URL to your CodeIgniter root. Typically this will be your base URL,
+| WITH a trailing slash:
+|
+| http://example.com/
+|
+*/
+$config['base_url'] = "https://". PLC_WWW_HOST . ":" . PLC_WWW_SSL_PORT ."/registerwizard/";
+
+/*
+|--------------------------------------------------------------------------
+| Index File
+|--------------------------------------------------------------------------
+|
+| Typically this will be your index.php file, unless you've renamed it to
+| something else. If you are using mod_rewrite to remove the page set this
+| variable so that it is blank.
+|
+*/
+$config['index_page'] = "index.php";
+
+/*
+|--------------------------------------------------------------------------
+| URI PROTOCOL
+|--------------------------------------------------------------------------
+|
+| This item determines which server global should be used to retrieve the
+| URI string. The default setting of "AUTO" works for most servers.
+| If your links do not seem to work, try one of the other delicious flavors:
+|
+| 'AUTO' Default - auto detects
+| 'PATH_INFO' Uses the PATH_INFO
+| 'QUERY_STRING' Uses the QUERY_STRING
+| 'REQUEST_URI' Uses the REQUEST_URI
+| 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO
+|
+*/
+$config['uri_protocol'] = "AUTO";
+
+/*
+|--------------------------------------------------------------------------
+| URL suffix
+|--------------------------------------------------------------------------
+|
+| This option allows you to add a suffix to all URLs generated by CodeIgniter.
+| For more information please see the user guide:
+|
+| http://codeigniter.com/user_guide/general/urls.html
+*/
+
+$config['url_suffix'] = "";
+
+/*
+|--------------------------------------------------------------------------
+| Default Language
+|--------------------------------------------------------------------------
+|
+| This determines which set of language files should be used. Make sure
+| there is an available translation if you intend to use something other
+| than english.
+|
+*/
+$config['language'] = "english";
+
+/*
+|--------------------------------------------------------------------------
+| Default Character Set
+|--------------------------------------------------------------------------
+|
+| This determines which character set is used by default in various methods
+| that require a character set to be provided.
+|
+*/
+$config['charset'] = "UTF-8";
+
+/*
+|--------------------------------------------------------------------------
+| Enable/Disable System Hooks
+|--------------------------------------------------------------------------
+|
+| If you would like to use the "hooks" feature you must enable it by
+| setting this variable to TRUE (boolean). See the user guide for details.
+|
+*/
+$config['enable_hooks'] = FALSE;
+
+
+/*
+|--------------------------------------------------------------------------
+| Class Extension Prefix
+|--------------------------------------------------------------------------
+|
+| This item allows you to set the filename/classname prefix when extending
+| native libraries. For more information please see the user guide:
+|
+| http://codeigniter.com/user_guide/general/core_classes.html
+| http://codeigniter.com/user_guide/general/creating_libraries.html
+|
+*/
+$config['subclass_prefix'] = 'MY_';
+
+
+/*
+|--------------------------------------------------------------------------
+| Allowed URL Characters
+|--------------------------------------------------------------------------
+|
+| This lets you specify with a regular expression which characters are permitted
+| within your URLs. When someone tries to submit a URL with disallowed
+| characters they will get a warning message.
+|
+| As a security measure you are STRONGLY encouraged to restrict URLs to
+| as few characters as possible. By default only these are allowed: a-z 0-9~%.:_-
+|
+| Leave blank to allow all characters -- but only if you are insane.
+|
+| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
+|
+*/
+$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
+
+
+/*
+|--------------------------------------------------------------------------
+| Enable Query Strings
+|--------------------------------------------------------------------------
+|
+| By default CodeIgniter uses search-engine friendly segment based URLs:
+| example.com/who/what/where/
+|
+| You can optionally enable standard query string based URLs:
+| example.com?who=me&what=something&where=here
+|
+| Options are: TRUE or FALSE (boolean)
+|
+| The other items let you set the query string "words" that will
+| invoke your controllers and its functions:
+| example.com/index.php?c=controller&m=function
+|
+| Please note that some of the helpers won't work as expected when
+| this feature is enabled, since CodeIgniter is designed primarily to
+| use segment based URLs.
+|
+*/
+$config['enable_query_strings'] = FALSE;
+$config['controller_trigger'] = 'c';
+$config['function_trigger'] = 'm';
+$config['directory_trigger'] = 'd'; // experimental not currently in use
+
+/*
+|--------------------------------------------------------------------------
+| Error Logging Threshold
+|--------------------------------------------------------------------------
+|
+| If you have enabled error logging, you can set an error threshold to
+| determine what gets logged. Threshold options are:
+| You can enable error logging by setting a threshold over zero. The
+| threshold determines what gets logged. Threshold options are:
+|
+| 0 = Disables logging, Error logging TURNED OFF
+| 1 = Error Messages (including PHP errors)
+| 2 = Debug Messages
+| 3 = Informational Messages
+| 4 = All Messages
+|
+| For a live site you'll usually only enable Errors (1) to be logged otherwise
+| your log files will fill up very fast.
+|
+*/
+$config['log_threshold'] = 0;
+
+/*
+|--------------------------------------------------------------------------
+| Error Logging Directory Path
+|--------------------------------------------------------------------------
+|
+| Leave this BLANK unless you would like to set something other than the default
+| system/logs/ folder. Use a full server path with trailing slash.
+|
+*/
+$config['log_path'] = '';
+
+/*
+|--------------------------------------------------------------------------
+| Date Format for Logs
+|--------------------------------------------------------------------------
+|
+| Each item that is logged has an associated date. You can use PHP date
+| codes to set your own date formatting
+|
+*/
+$config['log_date_format'] = 'Y-m-d H:i:s';
+
+/*
+|--------------------------------------------------------------------------
+| Cache Directory Path
+|--------------------------------------------------------------------------
+|
+| Leave this BLANK unless you would like to set something other than the default
+| system/cache/ folder. Use a full server path with trailing slash.
+|
+*/
+$config['cache_path'] = '';
+
+/*
+|--------------------------------------------------------------------------
+| Encryption Key
+|--------------------------------------------------------------------------
+|
+| If you use the Encryption class or the Sessions class with encryption
+| enabled you MUST set an encryption key. See the user guide for info.
+|
+*/
+$config['encryption_key'] = "";
+
+/*
+|--------------------------------------------------------------------------
+| Session Variables
+|--------------------------------------------------------------------------
+|
+| 'session_cookie_name' = the name you want for the cookie
+| 'encrypt_sess_cookie' = TRUE/FALSE (boolean). Whether to encrypt the cookie
+| 'session_expiration' = the number of SECONDS you want the session to last.
+| by default sessions last 7200 seconds (two hours). Set to zero for no expiration.
+| 'time_to_update' = how many seconds between CI refreshing Session Information
+|
+*/
+$config['sess_cookie_name'] = 'ci_session';
+$config['sess_expiration'] = 7200;
+$config['sess_encrypt_cookie'] = FALSE;
+$config['sess_use_database'] = FALSE;
+$config['sess_table_name'] = 'ci_sessions';
+$config['sess_match_ip'] = FALSE;
+$config['sess_match_useragent'] = TRUE;
+$config['sess_time_to_update'] = 300;
+
+/*
+|--------------------------------------------------------------------------
+| Cookie Related Variables
+|--------------------------------------------------------------------------
+|
+| 'cookie_prefix' = Set a prefix if you need to avoid collisions
+| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
+| 'cookie_path' = Typically will be a forward slash
+|
+*/
+$config['cookie_prefix'] = "";
+$config['cookie_domain'] = "";
+$config['cookie_path'] = "/";
+
+/*
+|--------------------------------------------------------------------------
+| Global XSS Filtering
+|--------------------------------------------------------------------------
+|
+| Determines whether the XSS filter is always active when GET, POST or
+| COOKIE data is encountered
+|
+*/
+$config['global_xss_filtering'] = FALSE;
+
+/*
+|--------------------------------------------------------------------------
+| Output Compression
+|--------------------------------------------------------------------------
+|
+| Enables Gzip output compression for faster page loads. When enabled,
+| the output class will test whether your server supports Gzip.
+| Even if it does, however, not all browsers support compression
+| so enable only if you are reasonably sure your visitors can handle it.
+|
+| VERY IMPORTANT: If you are getting a blank page when compression is enabled it
+| means you are prematurely outputting something to your browser. It could
+| even be a line of whitespace at the end of one of your scripts. For
+| compression to work, nothing can be sent before the output buffer is called
+| by the output class. Do not "echo" any values with compression enabled.
+|
+*/
+$config['compress_output'] = FALSE;
+
+/*
+|--------------------------------------------------------------------------
+| Master Time Reference
+|--------------------------------------------------------------------------
+|
+| Options are "local" or "gmt". This pref tells the system whether to use
+| your server's local time as the master "now" reference, or convert it to
+| GMT. See the "date helper" page of the user guide for information
+| regarding date handling.
+|
+*/
+$config['time_reference'] = 'local';
+
+
+/*
+|--------------------------------------------------------------------------
+| Rewrite PHP Short Tags
+|--------------------------------------------------------------------------
+|
+| If your PHP installation does not have short tag support enabled CI
+| can rewrite the tags on-the-fly, enabling you to utilize that syntax
+| in your view files. Options are TRUE or FALSE (boolean)
+|
+*/
+$config['rewrite_short_tags'] = FALSE;
+
+
+
+/* End of file config.php */
+/* Location: ./system/application/config/config.php */
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| File and Directory Modes\r
-|--------------------------------------------------------------------------\r
-|\r
-| These prefs are used when checking and setting modes when working\r
-| with the file system. The defaults are fine on servers with proper\r
-| security, but you may wish (or even need) to change the values in\r
-| certain environments (Apache running a separate process for each\r
-| user, PHP under CGI with Apache suEXEC, etc.). Octal values should\r
-| always be used to set the mode correctly.\r
-|\r
-*/\r
-define('FILE_READ_MODE', 0644);\r
-define('FILE_WRITE_MODE', 0666);\r
-define('DIR_READ_MODE', 0755);\r
-define('DIR_WRITE_MODE', 0777);\r
-\r
-/*\r
-|--------------------------------------------------------------------------\r
-| File Stream Modes\r
-|--------------------------------------------------------------------------\r
-|\r
-| These modes are used when working with fopen()/popen()\r
-|\r
-*/\r
-\r
-define('FOPEN_READ', 'rb');\r
-define('FOPEN_READ_WRITE', 'r+b');\r
-define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care\r
-define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care\r
-define('FOPEN_WRITE_CREATE', 'ab');\r
-define('FOPEN_READ_WRITE_CREATE', 'a+b');\r
-define('FOPEN_WRITE_CREATE_STRICT', 'xb');\r
-define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');\r
-\r
-\r
-/* End of file constants.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+
+/*
+|--------------------------------------------------------------------------
+| File and Directory Modes
+|--------------------------------------------------------------------------
+|
+| These prefs are used when checking and setting modes when working
+| with the file system. The defaults are fine on servers with proper
+| security, but you may wish (or even need) to change the values in
+| certain environments (Apache running a separate process for each
+| user, PHP under CGI with Apache suEXEC, etc.). Octal values should
+| always be used to set the mode correctly.
+|
+*/
+define('FILE_READ_MODE', 0644);
+define('FILE_WRITE_MODE', 0666);
+define('DIR_READ_MODE', 0755);
+define('DIR_WRITE_MODE', 0777);
+
+/*
+|--------------------------------------------------------------------------
+| File Stream Modes
+|--------------------------------------------------------------------------
+|
+| These modes are used when working with fopen()/popen()
+|
+*/
+
+define('FOPEN_READ', 'rb');
+define('FOPEN_READ_WRITE', 'r+b');
+define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care
+define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care
+define('FOPEN_WRITE_CREATE', 'ab');
+define('FOPEN_READ_WRITE_CREATE', 'a+b');
+define('FOPEN_WRITE_CREATE_STRICT', 'xb');
+define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');
+
+
+/* End of file constants.php */
/* Location: ./system/application/config/constants.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/*\r
-| -------------------------------------------------------------------\r
-| DATABASE CONNECTIVITY SETTINGS\r
-| -------------------------------------------------------------------\r
-| This file will contain the settings needed to access your database.\r
-|\r
-| For complete instructions please consult the "Database Connection"\r
-| page of the User Guide.\r
-|\r
-| -------------------------------------------------------------------\r
-| EXPLANATION OF VARIABLES\r
-| -------------------------------------------------------------------\r
-|\r
-| ['hostname'] The hostname of your database server.\r
-| ['username'] The username used to connect to the database\r
-| ['password'] The password used to connect to the database\r
-| ['database'] The name of the database you want to connect to\r
-| ['dbdriver'] The database type. ie: mysql. Currently supported:\r
- mysql, mysqli, postgre, odbc, mssql, sqlite, oci8\r
-| ['dbprefix'] You can add an optional prefix, which will be added\r
-| to the table name when using the Active Record class\r
-| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection\r
-| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.\r
-| ['cache_on'] TRUE/FALSE - Enables/disables query caching\r
-| ['cachedir'] The path to the folder where cache files should be stored\r
-| ['char_set'] The character set used in communicating with the database\r
-| ['dbcollat'] The character collation used in communicating with the database\r
-|\r
-| The $active_group variable lets you choose which connection group to\r
-| make active. By default there is only one group (the "default" group).\r
-|\r
-| The $active_record variables lets you determine whether or not to load\r
-| the active record class\r
-*/\r
-\r
-$active_group = "default";\r
-$active_record = TRUE;\r
-\r
-$db['default']['hostname'] = "localhost";\r
-$db['default']['username'] = "";\r
-$db['default']['password'] = "";\r
-$db['default']['database'] = "";\r
-$db['default']['dbdriver'] = "mysql";\r
-$db['default']['dbprefix'] = "";\r
-$db['default']['pconnect'] = TRUE;\r
-$db['default']['db_debug'] = TRUE;\r
-$db['default']['cache_on'] = FALSE;\r
-$db['default']['cachedir'] = "";\r
-$db['default']['char_set'] = "utf8";\r
-$db['default']['dbcollat'] = "utf8_general_ci";\r
-\r
-\r
-/* End of file database.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/*
+| -------------------------------------------------------------------
+| DATABASE CONNECTIVITY SETTINGS
+| -------------------------------------------------------------------
+| This file will contain the settings needed to access your database.
+|
+| For complete instructions please consult the "Database Connection"
+| page of the User Guide.
+|
+| -------------------------------------------------------------------
+| EXPLANATION OF VARIABLES
+| -------------------------------------------------------------------
+|
+| ['hostname'] The hostname of your database server.
+| ['username'] The username used to connect to the database
+| ['password'] The password used to connect to the database
+| ['database'] The name of the database you want to connect to
+| ['dbdriver'] The database type. ie: mysql. Currently supported:
+ mysql, mysqli, postgre, odbc, mssql, sqlite, oci8
+| ['dbprefix'] You can add an optional prefix, which will be added
+| to the table name when using the Active Record class
+| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
+| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
+| ['cache_on'] TRUE/FALSE - Enables/disables query caching
+| ['cachedir'] The path to the folder where cache files should be stored
+| ['char_set'] The character set used in communicating with the database
+| ['dbcollat'] The character collation used in communicating with the database
+|
+| The $active_group variable lets you choose which connection group to
+| make active. By default there is only one group (the "default" group).
+|
+| The $active_record variables lets you determine whether or not to load
+| the active record class
+*/
+
+$active_group = "default";
+$active_record = TRUE;
+
+$db['default']['hostname'] = "localhost";
+$db['default']['username'] = "";
+$db['default']['password'] = "";
+$db['default']['database'] = "";
+$db['default']['dbdriver'] = "mysql";
+$db['default']['dbprefix'] = "";
+$db['default']['pconnect'] = TRUE;
+$db['default']['db_debug'] = TRUE;
+$db['default']['cache_on'] = FALSE;
+$db['default']['cachedir'] = "";
+$db['default']['char_set'] = "utf8";
+$db['default']['dbcollat'] = "utf8_general_ci";
+
+
+/* End of file database.php */
/* Location: ./system/application/config/database.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/*\r
-| -------------------------------------------------------------------\r
-| MIME TYPES\r
-| -------------------------------------------------------------------\r
-| This file contains an array of mime types. It is used by the\r
-| Upload class to help identify allowed file types.\r
-|\r
-*/\r
-\r
-$mimes = array( 'hqx' => 'application/mac-binhex40',\r
- 'cpt' => 'application/mac-compactpro',\r
- 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel'),\r
- 'bin' => 'application/macbinary',\r
- 'dms' => 'application/octet-stream',\r
- 'lha' => 'application/octet-stream',\r
- 'lzh' => 'application/octet-stream',\r
- 'exe' => 'application/octet-stream',\r
- 'class' => 'application/octet-stream',\r
- 'psd' => 'application/x-photoshop',\r
- 'so' => 'application/octet-stream',\r
- 'sea' => 'application/octet-stream',\r
- 'dll' => 'application/octet-stream',\r
- 'oda' => 'application/oda',\r
- 'pdf' => array('application/pdf', 'application/x-download'),\r
- 'ai' => 'application/postscript',\r
- 'eps' => 'application/postscript',\r
- 'ps' => 'application/postscript',\r
- 'smi' => 'application/smil',\r
- 'smil' => 'application/smil',\r
- 'mif' => 'application/vnd.mif',\r
- 'xls' => array('application/excel', 'application/vnd.ms-excel'),\r
- 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint'),\r
- 'wbxml' => 'application/wbxml',\r
- 'wmlc' => 'application/wmlc',\r
- 'dcr' => 'application/x-director',\r
- 'dir' => 'application/x-director',\r
- 'dxr' => 'application/x-director',\r
- 'dvi' => 'application/x-dvi',\r
- 'gtar' => 'application/x-gtar',\r
- 'gz' => 'application/x-gzip',\r
- 'php' => 'application/x-httpd-php',\r
- 'php4' => 'application/x-httpd-php',\r
- 'php3' => 'application/x-httpd-php',\r
- 'phtml' => 'application/x-httpd-php',\r
- 'phps' => 'application/x-httpd-php-source',\r
- 'js' => 'application/x-javascript',\r
- 'swf' => 'application/x-shockwave-flash',\r
- 'sit' => 'application/x-stuffit',\r
- 'tar' => 'application/x-tar',\r
- 'tgz' => 'application/x-tar',\r
- 'xhtml' => 'application/xhtml+xml',\r
- 'xht' => 'application/xhtml+xml',\r
- 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed'),\r
- 'mid' => 'audio/midi',\r
- 'midi' => 'audio/midi',\r
- 'mpga' => 'audio/mpeg',\r
- 'mp2' => 'audio/mpeg',\r
- 'mp3' => array('audio/mpeg', 'audio/mpg'),\r
- 'aif' => 'audio/x-aiff',\r
- 'aiff' => 'audio/x-aiff',\r
- 'aifc' => 'audio/x-aiff',\r
- 'ram' => 'audio/x-pn-realaudio',\r
- 'rm' => 'audio/x-pn-realaudio',\r
- 'rpm' => 'audio/x-pn-realaudio-plugin',\r
- 'ra' => 'audio/x-realaudio',\r
- 'rv' => 'video/vnd.rn-realvideo',\r
- 'wav' => 'audio/x-wav',\r
- 'bmp' => 'image/bmp',\r
- 'gif' => 'image/gif',\r
- 'jpeg' => array('image/jpeg', 'image/pjpeg'),\r
- 'jpg' => array('image/jpeg', 'image/pjpeg'),\r
- 'jpe' => array('image/jpeg', 'image/pjpeg'),\r
- 'png' => array('image/png', 'image/x-png'),\r
- 'tiff' => 'image/tiff',\r
- 'tif' => 'image/tiff',\r
- 'css' => 'text/css',\r
- 'html' => 'text/html',\r
- 'htm' => 'text/html',\r
- 'shtml' => 'text/html',\r
- 'txt' => 'text/plain',\r
- 'text' => 'text/plain',\r
- 'log' => array('text/plain', 'text/x-log'),\r
- 'rtx' => 'text/richtext',\r
- 'rtf' => 'text/rtf',\r
- 'xml' => 'text/xml',\r
- 'xsl' => 'text/xml',\r
- 'mpeg' => 'video/mpeg',\r
- 'mpg' => 'video/mpeg',\r
- 'mpe' => 'video/mpeg',\r
- 'qt' => 'video/quicktime',\r
- 'mov' => 'video/quicktime',\r
- 'avi' => 'video/x-msvideo',\r
- 'movie' => 'video/x-sgi-movie',\r
- 'doc' => 'application/msword',\r
- 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r
- 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r
- 'word' => array('application/msword', 'application/octet-stream'),\r
- 'xl' => 'application/excel',\r
- 'eml' => 'message/rfc822'\r
- );\r
-\r
-\r
-/* End of file mimes.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/*
+| -------------------------------------------------------------------
+| MIME TYPES
+| -------------------------------------------------------------------
+| This file contains an array of mime types. It is used by the
+| Upload class to help identify allowed file types.
+|
+*/
+
+$mimes = array( 'hqx' => 'application/mac-binhex40',
+ 'cpt' => 'application/mac-compactpro',
+ 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel'),
+ 'bin' => 'application/macbinary',
+ 'dms' => 'application/octet-stream',
+ 'lha' => 'application/octet-stream',
+ 'lzh' => 'application/octet-stream',
+ 'exe' => 'application/octet-stream',
+ 'class' => 'application/octet-stream',
+ 'psd' => 'application/x-photoshop',
+ 'so' => 'application/octet-stream',
+ 'sea' => 'application/octet-stream',
+ 'dll' => 'application/octet-stream',
+ 'oda' => 'application/oda',
+ 'pdf' => array('application/pdf', 'application/x-download'),
+ 'ai' => 'application/postscript',
+ 'eps' => 'application/postscript',
+ 'ps' => 'application/postscript',
+ 'smi' => 'application/smil',
+ 'smil' => 'application/smil',
+ 'mif' => 'application/vnd.mif',
+ 'xls' => array('application/excel', 'application/vnd.ms-excel'),
+ 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint'),
+ 'wbxml' => 'application/wbxml',
+ 'wmlc' => 'application/wmlc',
+ 'dcr' => 'application/x-director',
+ 'dir' => 'application/x-director',
+ 'dxr' => 'application/x-director',
+ 'dvi' => 'application/x-dvi',
+ 'gtar' => 'application/x-gtar',
+ 'gz' => 'application/x-gzip',
+ 'php' => 'application/x-httpd-php',
+ 'php4' => 'application/x-httpd-php',
+ 'php3' => 'application/x-httpd-php',
+ 'phtml' => 'application/x-httpd-php',
+ 'phps' => 'application/x-httpd-php-source',
+ 'js' => 'application/x-javascript',
+ 'swf' => 'application/x-shockwave-flash',
+ 'sit' => 'application/x-stuffit',
+ 'tar' => 'application/x-tar',
+ 'tgz' => 'application/x-tar',
+ 'xhtml' => 'application/xhtml+xml',
+ 'xht' => 'application/xhtml+xml',
+ 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed'),
+ 'mid' => 'audio/midi',
+ 'midi' => 'audio/midi',
+ 'mpga' => 'audio/mpeg',
+ 'mp2' => 'audio/mpeg',
+ 'mp3' => array('audio/mpeg', 'audio/mpg'),
+ 'aif' => 'audio/x-aiff',
+ 'aiff' => 'audio/x-aiff',
+ 'aifc' => 'audio/x-aiff',
+ 'ram' => 'audio/x-pn-realaudio',
+ 'rm' => 'audio/x-pn-realaudio',
+ 'rpm' => 'audio/x-pn-realaudio-plugin',
+ 'ra' => 'audio/x-realaudio',
+ 'rv' => 'video/vnd.rn-realvideo',
+ 'wav' => 'audio/x-wav',
+ 'bmp' => 'image/bmp',
+ 'gif' => 'image/gif',
+ 'jpeg' => array('image/jpeg', 'image/pjpeg'),
+ 'jpg' => array('image/jpeg', 'image/pjpeg'),
+ 'jpe' => array('image/jpeg', 'image/pjpeg'),
+ 'png' => array('image/png', 'image/x-png'),
+ 'tiff' => 'image/tiff',
+ 'tif' => 'image/tiff',
+ 'css' => 'text/css',
+ 'html' => 'text/html',
+ 'htm' => 'text/html',
+ 'shtml' => 'text/html',
+ 'txt' => 'text/plain',
+ 'text' => 'text/plain',
+ 'log' => array('text/plain', 'text/x-log'),
+ 'rtx' => 'text/richtext',
+ 'rtf' => 'text/rtf',
+ 'xml' => 'text/xml',
+ 'xsl' => 'text/xml',
+ 'mpeg' => 'video/mpeg',
+ 'mpg' => 'video/mpeg',
+ 'mpe' => 'video/mpeg',
+ 'qt' => 'video/quicktime',
+ 'mov' => 'video/quicktime',
+ 'avi' => 'video/x-msvideo',
+ 'movie' => 'video/x-sgi-movie',
+ 'doc' => 'application/msword',
+ 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ 'word' => array('application/msword', 'application/octet-stream'),
+ 'xl' => 'application/excel',
+ 'eml' => 'message/rfc822'
+ );
+
+
+/* End of file mimes.php */
/* Location: ./system/application/config/mimes.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/*\r
-| -------------------------------------------------------------------------\r
-| URI ROUTING\r
-| -------------------------------------------------------------------------\r
-| This file lets you re-map URI requests to specific controller functions.\r
-|\r
-| Typically there is a one-to-one relationship between a URL string\r
-| and its corresponding controller class/method. The segments in a\r
-| URL normally follow this pattern:\r
-|\r
-| example.com/class/method/id/\r
-|\r
-| In some instances, however, you may want to remap this relationship\r
-| so that a different class/function is called than the one\r
-| corresponding to the URL.\r
-|\r
-| Please see the user guide for complete details:\r
-|\r
-| http://codeigniter.com/user_guide/general/routing.html\r
-|\r
-| -------------------------------------------------------------------------\r
-| RESERVED ROUTES\r
-| -------------------------------------------------------------------------\r
-|\r
-| There are two reserved routes:\r
-|\r
-| $route['default_controller'] = 'welcome';\r
-|\r
-| This route indicates which controller class should be loaded if the\r
-| URI contains no data. In the above example, the "welcome" class\r
-| would be loaded.\r
-|\r
-| $route['scaffolding_trigger'] = 'scaffolding';\r
-|\r
-| This route lets you set a "secret" word that will trigger the\r
-| scaffolding feature for added security. Note: Scaffolding must be\r
-| enabled in the controller in which you intend to use it. The reserved \r
-| routes must come before any wildcard or regular expression routes.\r
-|\r
-*/\r
-\r
-$route['default_controller'] = "register";\r
-$route['scaffolding_trigger'] = "";\r
-\r
-\r
-/* End of file routes.php */\r
-/* Location: ./system/application/config/routes.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/*
+| -------------------------------------------------------------------------
+| URI ROUTING
+| -------------------------------------------------------------------------
+| This file lets you re-map URI requests to specific controller functions.
+|
+| Typically there is a one-to-one relationship between a URL string
+| and its corresponding controller class/method. The segments in a
+| URL normally follow this pattern:
+|
+| example.com/class/method/id/
+|
+| In some instances, however, you may want to remap this relationship
+| so that a different class/function is called than the one
+| corresponding to the URL.
+|
+| Please see the user guide for complete details:
+|
+| http://codeigniter.com/user_guide/general/routing.html
+|
+| -------------------------------------------------------------------------
+| RESERVED ROUTES
+| -------------------------------------------------------------------------
+|
+| There are two reserved routes:
+|
+| $route['default_controller'] = 'welcome';
+|
+| This route indicates which controller class should be loaded if the
+| URI contains no data. In the above example, the "welcome" class
+| would be loaded.
+|
+| $route['scaffolding_trigger'] = 'scaffolding';
+|
+| This route lets you set a "secret" word that will trigger the
+| scaffolding feature for added security. Note: Scaffolding must be
+| enabled in the controller in which you intend to use it. The reserved
+| routes must come before any wildcard or regular expression routes.
+|
+*/
+
+$route['default_controller'] = "register";
+$route['scaffolding_trigger'] = "";
+
+
+/* End of file routes.php */
+/* Location: ./system/application/config/routes.php */
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/*\r
-| -------------------------------------------------------------------\r
-| USER AGENT TYPES\r
-| -------------------------------------------------------------------\r
-| This file contains four arrays of user agent data. It is used by the\r
-| User Agent Class to help identify browser, platform, robot, and\r
-| mobile device data. The array keys are used to identify the device\r
-| and the array values are used to set the actual name of the item.\r
-|\r
-*/\r
-\r
-$platforms = array (\r
- 'windows nt 6.0' => 'Windows Longhorn',\r
- 'windows nt 5.2' => 'Windows 2003',\r
- 'windows nt 5.0' => 'Windows 2000',\r
- 'windows nt 5.1' => 'Windows XP',\r
- 'windows nt 4.0' => 'Windows NT 4.0',\r
- 'winnt4.0' => 'Windows NT 4.0',\r
- 'winnt 4.0' => 'Windows NT',\r
- 'winnt' => 'Windows NT',\r
- 'windows 98' => 'Windows 98',\r
- 'win98' => 'Windows 98',\r
- 'windows 95' => 'Windows 95',\r
- 'win95' => 'Windows 95',\r
- 'windows' => 'Unknown Windows OS',\r
- 'os x' => 'Mac OS X',\r
- 'ppc mac' => 'Power PC Mac',\r
- 'freebsd' => 'FreeBSD',\r
- 'ppc' => 'Macintosh',\r
- 'linux' => 'Linux',\r
- 'debian' => 'Debian',\r
- 'sunos' => 'Sun Solaris',\r
- 'beos' => 'BeOS',\r
- 'apachebench' => 'ApacheBench',\r
- 'aix' => 'AIX',\r
- 'irix' => 'Irix',\r
- 'osf' => 'DEC OSF',\r
- 'hp-ux' => 'HP-UX',\r
- 'netbsd' => 'NetBSD',\r
- 'bsdi' => 'BSDi',\r
- 'openbsd' => 'OpenBSD',\r
- 'gnu' => 'GNU/Linux',\r
- 'unix' => 'Unknown Unix OS'\r
- );\r
-\r
-\r
-// The order of this array should NOT be changed. Many browsers return\r
-// multiple browser types so we want to identify the sub-type first.\r
-$browsers = array(\r
- 'Opera' => 'Opera',\r
- 'MSIE' => 'Internet Explorer',\r
- 'Internet Explorer' => 'Internet Explorer',\r
- 'Shiira' => 'Shiira',\r
- 'Firefox' => 'Firefox',\r
- 'Chimera' => 'Chimera',\r
- 'Phoenix' => 'Phoenix',\r
- 'Firebird' => 'Firebird',\r
- 'Camino' => 'Camino',\r
- 'Netscape' => 'Netscape',\r
- 'OmniWeb' => 'OmniWeb',\r
- 'Mozilla' => 'Mozilla',\r
- 'Safari' => 'Safari',\r
- 'Konqueror' => 'Konqueror',\r
- 'icab' => 'iCab',\r
- 'Lynx' => 'Lynx',\r
- 'Links' => 'Links',\r
- 'hotjava' => 'HotJava',\r
- 'amaya' => 'Amaya',\r
- 'IBrowse' => 'IBrowse'\r
- );\r
-\r
-$mobiles = array(\r
- // legacy array, old values commented out\r
- 'mobileexplorer' => 'Mobile Explorer',\r
-// 'openwave' => 'Open Wave',\r
-// 'opera mini' => 'Opera Mini',\r
-// 'operamini' => 'Opera Mini',\r
-// 'elaine' => 'Palm',\r
- 'palmsource' => 'Palm',\r
-// 'digital paths' => 'Palm',\r
-// 'avantgo' => 'Avantgo',\r
-// 'xiino' => 'Xiino',\r
- 'palmscape' => 'Palmscape',\r
-// 'nokia' => 'Nokia',\r
-// 'ericsson' => 'Ericsson',\r
-// 'blackberry' => 'BlackBerry',\r
-// 'motorola' => 'Motorola'\r
- \r
- // Phones and Manufacturers\r
- 'motorola' => "Motorola",\r
- 'nokia' => "Nokia",\r
- 'palm' => "Palm",\r
- 'iphone' => "Apple iPhone",\r
- 'ipod' => "Apple iPod Touch",\r
- 'sony' => "Sony Ericsson",\r
- 'ericsson' => "Sony Ericsson",\r
- 'blackberry' => "BlackBerry",\r
- 'cocoon' => "O2 Cocoon",\r
- 'blazer' => "Treo",\r
- 'lg' => "LG",\r
- 'amoi' => "Amoi",\r
- 'xda' => "XDA",\r
- 'mda' => "MDA",\r
- 'vario' => "Vario",\r
- 'htc' => "HTC",\r
- 'samsung' => "Samsung",\r
- 'sharp' => "Sharp",\r
- 'sie-' => "Siemens",\r
- 'alcatel' => "Alcatel",\r
- 'benq' => "BenQ",\r
- 'ipaq' => "HP iPaq",\r
- 'mot-' => "Motorola",\r
- 'playstation portable' => "PlayStation Portable",\r
- 'hiptop' => "Danger Hiptop",\r
- 'nec-' => "NEC",\r
- 'panasonic' => "Panasonic",\r
- 'philips' => "Philips",\r
- 'sagem' => "Sagem",\r
- 'sanyo' => "Sanyo",\r
- 'spv' => "SPV",\r
- 'zte' => "ZTE",\r
- 'sendo' => "Sendo",\r
- \r
- // Operating Systems\r
- 'symbian' => "Symbian",\r
- 'SymbianOS' => "SymbianOS", \r
- 'elaine' => "Palm",\r
- 'palm' => "Palm",\r
- 'series60' => "Symbian S60",\r
- 'windows ce' => "Windows CE",\r
- \r
- // Browsers \r
- 'obigo' => "Obigo",\r
- 'netfront' => "Netfront Browser",\r
- 'openwave' => "Openwave Browser",\r
- 'mobilexplorer' => "Mobile Explorer",\r
- 'operamini' => "Opera Mini",\r
- 'opera mini' => "Opera Mini",\r
- \r
- // Other\r
- 'digital paths' => "Digital Paths",\r
- 'avantgo' => "AvantGo",\r
- 'xiino' => "Xiino",\r
- 'novarra' => "Novarra Transcoder",\r
- 'vodafone' => "Vodafone",\r
- 'docomo' => "NTT DoCoMo",\r
- 'o2' => "O2",\r
- \r
- // Fallback\r
- 'mobile' => "Generic Mobile",\r
- 'wireless' => "Generic Mobile",\r
- 'j2me' => "Generic Mobile",\r
- 'midp' => "Generic Mobile",\r
- 'cldc' => "Generic Mobile",\r
- 'up.link' => "Generic Mobile",\r
- 'up.browser' => "Generic Mobile",\r
- 'smartphone' => "Generic Mobile",\r
- 'cellphone' => "Generic Mobile"\r
- );\r
-\r
-// There are hundreds of bots but these are the most common.\r
-$robots = array(\r
- 'googlebot' => 'Googlebot',\r
- 'msnbot' => 'MSNBot',\r
- 'slurp' => 'Inktomi Slurp',\r
- 'yahoo' => 'Yahoo',\r
- 'askjeeves' => 'AskJeeves',\r
- 'fastcrawler' => 'FastCrawler',\r
- 'infoseek' => 'InfoSeek Robot 1.0',\r
- 'lycos' => 'Lycos'\r
- );\r
-\r
-/* End of file user_agents.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/*
+| -------------------------------------------------------------------
+| USER AGENT TYPES
+| -------------------------------------------------------------------
+| This file contains four arrays of user agent data. It is used by the
+| User Agent Class to help identify browser, platform, robot, and
+| mobile device data. The array keys are used to identify the device
+| and the array values are used to set the actual name of the item.
+|
+*/
+
+$platforms = array (
+ 'windows nt 6.0' => 'Windows Longhorn',
+ 'windows nt 5.2' => 'Windows 2003',
+ 'windows nt 5.0' => 'Windows 2000',
+ 'windows nt 5.1' => 'Windows XP',
+ 'windows nt 4.0' => 'Windows NT 4.0',
+ 'winnt4.0' => 'Windows NT 4.0',
+ 'winnt 4.0' => 'Windows NT',
+ 'winnt' => 'Windows NT',
+ 'windows 98' => 'Windows 98',
+ 'win98' => 'Windows 98',
+ 'windows 95' => 'Windows 95',
+ 'win95' => 'Windows 95',
+ 'windows' => 'Unknown Windows OS',
+ 'os x' => 'Mac OS X',
+ 'ppc mac' => 'Power PC Mac',
+ 'freebsd' => 'FreeBSD',
+ 'ppc' => 'Macintosh',
+ 'linux' => 'Linux',
+ 'debian' => 'Debian',
+ 'sunos' => 'Sun Solaris',
+ 'beos' => 'BeOS',
+ 'apachebench' => 'ApacheBench',
+ 'aix' => 'AIX',
+ 'irix' => 'Irix',
+ 'osf' => 'DEC OSF',
+ 'hp-ux' => 'HP-UX',
+ 'netbsd' => 'NetBSD',
+ 'bsdi' => 'BSDi',
+ 'openbsd' => 'OpenBSD',
+ 'gnu' => 'GNU/Linux',
+ 'unix' => 'Unknown Unix OS'
+ );
+
+
+// The order of this array should NOT be changed. Many browsers return
+// multiple browser types so we want to identify the sub-type first.
+$browsers = array(
+ 'Opera' => 'Opera',
+ 'MSIE' => 'Internet Explorer',
+ 'Internet Explorer' => 'Internet Explorer',
+ 'Shiira' => 'Shiira',
+ 'Firefox' => 'Firefox',
+ 'Chimera' => 'Chimera',
+ 'Phoenix' => 'Phoenix',
+ 'Firebird' => 'Firebird',
+ 'Camino' => 'Camino',
+ 'Netscape' => 'Netscape',
+ 'OmniWeb' => 'OmniWeb',
+ 'Mozilla' => 'Mozilla',
+ 'Safari' => 'Safari',
+ 'Konqueror' => 'Konqueror',
+ 'icab' => 'iCab',
+ 'Lynx' => 'Lynx',
+ 'Links' => 'Links',
+ 'hotjava' => 'HotJava',
+ 'amaya' => 'Amaya',
+ 'IBrowse' => 'IBrowse'
+ );
+
+$mobiles = array(
+ // legacy array, old values commented out
+ 'mobileexplorer' => 'Mobile Explorer',
+// 'openwave' => 'Open Wave',
+// 'opera mini' => 'Opera Mini',
+// 'operamini' => 'Opera Mini',
+// 'elaine' => 'Palm',
+ 'palmsource' => 'Palm',
+// 'digital paths' => 'Palm',
+// 'avantgo' => 'Avantgo',
+// 'xiino' => 'Xiino',
+ 'palmscape' => 'Palmscape',
+// 'nokia' => 'Nokia',
+// 'ericsson' => 'Ericsson',
+// 'blackberry' => 'BlackBerry',
+// 'motorola' => 'Motorola'
+
+ // Phones and Manufacturers
+ 'motorola' => "Motorola",
+ 'nokia' => "Nokia",
+ 'palm' => "Palm",
+ 'iphone' => "Apple iPhone",
+ 'ipod' => "Apple iPod Touch",
+ 'sony' => "Sony Ericsson",
+ 'ericsson' => "Sony Ericsson",
+ 'blackberry' => "BlackBerry",
+ 'cocoon' => "O2 Cocoon",
+ 'blazer' => "Treo",
+ 'lg' => "LG",
+ 'amoi' => "Amoi",
+ 'xda' => "XDA",
+ 'mda' => "MDA",
+ 'vario' => "Vario",
+ 'htc' => "HTC",
+ 'samsung' => "Samsung",
+ 'sharp' => "Sharp",
+ 'sie-' => "Siemens",
+ 'alcatel' => "Alcatel",
+ 'benq' => "BenQ",
+ 'ipaq' => "HP iPaq",
+ 'mot-' => "Motorola",
+ 'playstation portable' => "PlayStation Portable",
+ 'hiptop' => "Danger Hiptop",
+ 'nec-' => "NEC",
+ 'panasonic' => "Panasonic",
+ 'philips' => "Philips",
+ 'sagem' => "Sagem",
+ 'sanyo' => "Sanyo",
+ 'spv' => "SPV",
+ 'zte' => "ZTE",
+ 'sendo' => "Sendo",
+
+ // Operating Systems
+ 'symbian' => "Symbian",
+ 'SymbianOS' => "SymbianOS",
+ 'elaine' => "Palm",
+ 'palm' => "Palm",
+ 'series60' => "Symbian S60",
+ 'windows ce' => "Windows CE",
+
+ // Browsers
+ 'obigo' => "Obigo",
+ 'netfront' => "Netfront Browser",
+ 'openwave' => "Openwave Browser",
+ 'mobilexplorer' => "Mobile Explorer",
+ 'operamini' => "Opera Mini",
+ 'opera mini' => "Opera Mini",
+
+ // Other
+ 'digital paths' => "Digital Paths",
+ 'avantgo' => "AvantGo",
+ 'xiino' => "Xiino",
+ 'novarra' => "Novarra Transcoder",
+ 'vodafone' => "Vodafone",
+ 'docomo' => "NTT DoCoMo",
+ 'o2' => "O2",
+
+ // Fallback
+ 'mobile' => "Generic Mobile",
+ 'wireless' => "Generic Mobile",
+ 'j2me' => "Generic Mobile",
+ 'midp' => "Generic Mobile",
+ 'cldc' => "Generic Mobile",
+ 'up.link' => "Generic Mobile",
+ 'up.browser' => "Generic Mobile",
+ 'smartphone' => "Generic Mobile",
+ 'cellphone' => "Generic Mobile"
+ );
+
+// There are hundreds of bots but these are the most common.
+$robots = array(
+ 'googlebot' => 'Googlebot',
+ 'msnbot' => 'MSNBot',
+ 'slurp' => 'Inktomi Slurp',
+ 'yahoo' => 'Yahoo',
+ 'askjeeves' => 'AskJeeves',
+ 'fastcrawler' => 'FastCrawler',
+ 'infoseek' => 'InfoSeek Robot 1.0',
+ 'lycos' => 'Lycos'
+ );
+
+/* End of file user_agents.php */
/* Location: ./system/application/config/user_agents.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php\r
-\r
-class Welcome extends Controller {\r
-\r
- function Welcome()\r
- {\r
- parent::Controller(); \r
- }\r
- \r
- function index()\r
- {\r
- $this->load->view('welcome_message');\r
- }\r
-}\r
-\r
-/* End of file welcome.php */\r
+<?php
+
+class Welcome extends Controller {
+
+ function Welcome()
+ {
+ parent::Controller();
+ }
+
+ function index()
+ {
+ $this->load->view('welcome_message');
+ }
+}
+
+/* End of file welcome.php */
/* Location: ./system/application/controllers/welcome.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
-<title>Welcome to CodeIgniter</title>\r
-\r
-<style type="text/css">\r
-\r
-body {\r
- background-color: #fff;\r
- margin: 40px;\r
- font-family: Lucida Grande, Verdana, Sans-serif;\r
- font-size: 14px;\r
- color: #4F5155;\r
-}\r
-\r
-a {\r
- color: #003399;\r
- background-color: transparent;\r
- font-weight: normal;\r
-}\r
-\r
-h1 {\r
- color: #444;\r
- background-color: transparent;\r
- border-bottom: 1px solid #D0D0D0;\r
- font-size: 16px;\r
- font-weight: bold;\r
- margin: 24px 0 2px 0;\r
- padding: 5px 0 6px 0;\r
-}\r
-\r
-code {\r
- font-family: Monaco, Verdana, Sans-serif;\r
- font-size: 12px;\r
- background-color: #f9f9f9;\r
- border: 1px solid #D0D0D0;\r
- color: #002166;\r
- display: block;\r
- margin: 14px 0 14px 0;\r
- padding: 12px 10px 12px 10px;\r
-}\r
-\r
-</style>\r
-</head>\r
-<body>\r
-\r
-<h1>Welcome to CodeIgniter!</h1>\r
-\r
-<p>The page you are looking at is being generated dynamically by CodeIgniter.</p>\r
-\r
-<p>If you would like to edit this page you'll find it located at:</p>\r
-<code>system/application/views/welcome_message.php</code>\r
-\r
-<p>The corresponding controller for this page is found at:</p>\r
-<code>system/application/controllers/welcome.php</code>\r
-\r
-<p>If you are exploring CodeIgniter for the very first time, you should start by reading the <a href="user_guide/">User Guide</a>.</p>\r
-\r
-\r
-<p><br />Page rendered in {elapsed_time} seconds</p>\r
-\r
-</body>\r
+<html>
+<head>
+<title>Welcome to CodeIgniter</title>
+
+<style type="text/css">
+
+body {
+ background-color: #fff;
+ margin: 40px;
+ font-family: Lucida Grande, Verdana, Sans-serif;
+ font-size: 14px;
+ color: #4F5155;
+}
+
+a {
+ color: #003399;
+ background-color: transparent;
+ font-weight: normal;
+}
+
+h1 {
+ color: #444;
+ background-color: transparent;
+ border-bottom: 1px solid #D0D0D0;
+ font-size: 16px;
+ font-weight: bold;
+ margin: 24px 0 2px 0;
+ padding: 5px 0 6px 0;
+}
+
+code {
+ font-family: Monaco, Verdana, Sans-serif;
+ font-size: 12px;
+ background-color: #f9f9f9;
+ border: 1px solid #D0D0D0;
+ color: #002166;
+ display: block;
+ margin: 14px 0 14px 0;
+ padding: 12px 10px 12px 10px;
+}
+
+</style>
+</head>
+<body>
+
+<h1>Welcome to CodeIgniter!</h1>
+
+<p>The page you are looking at is being generated dynamically by CodeIgniter.</p>
+
+<p>If you would like to edit this page you'll find it located at:</p>
+<code>system/application/views/welcome_message.php</code>
+
+<p>The corresponding controller for this page is found at:</p>
+<code>system/application/controllers/welcome.php</code>
+
+<p>If you are exploring CodeIgniter for the very first time, you should start by reading the <a href="user_guide/">User Guide</a>.</p>
+
+
+<p><br />Page rendered in {elapsed_time} seconds</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.3\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CI_BASE - For PHP 4\r
- *\r
- * This file is used only when CodeIgniter is being run under PHP 4.\r
- *\r
- * In order to allow CI to work under PHP 4 we had to make the Loader class\r
- * the parent of the Controller Base class. It's the only way we can\r
- * enable functions like $this->load->library('email') to instantiate\r
- * classes that can then be used within controllers as $this->email->send()\r
- *\r
- * PHP 4 also has trouble referencing the CI super object within application\r
- * constructors since objects do not exist until the class is fully\r
- * instantiated. Basically PHP 4 sucks...\r
- *\r
- * Since PHP 5 doesn't suffer from this problem so we load one of\r
- * two files based on the version of PHP being run.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage codeigniter\r
- * @category front-controller\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/\r
- */\r
- class CI_Base extends CI_Loader {\r
-\r
- function CI_Base()\r
- {\r
- // This allows syntax like $this->load->foo() to work\r
- parent::CI_Loader();\r
- $this->load =& $this;\r
- \r
- // This allows resources used within controller constructors to work\r
- global $OBJ;\r
- $OBJ = $this->load; // Do NOT use a reference.\r
- }\r
-}\r
-\r
-function &get_instance()\r
-{\r
- global $CI, $OBJ;\r
- \r
- if (is_object($CI))\r
- {\r
- return $CI;\r
- }\r
- \r
- return $OBJ->load;\r
-}\r
-\r
-\r
-/* End of file Base4.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.3
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CI_BASE - For PHP 4
+ *
+ * This file is used only when CodeIgniter is being run under PHP 4.
+ *
+ * In order to allow CI to work under PHP 4 we had to make the Loader class
+ * the parent of the Controller Base class. It's the only way we can
+ * enable functions like $this->load->library('email') to instantiate
+ * classes that can then be used within controllers as $this->email->send()
+ *
+ * PHP 4 also has trouble referencing the CI super object within application
+ * constructors since objects do not exist until the class is fully
+ * instantiated. Basically PHP 4 sucks...
+ *
+ * Since PHP 5 doesn't suffer from this problem so we load one of
+ * two files based on the version of PHP being run.
+ *
+ * @package CodeIgniter
+ * @subpackage codeigniter
+ * @category front-controller
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/
+ */
+ class CI_Base extends CI_Loader {
+
+ function CI_Base()
+ {
+ // This allows syntax like $this->load->foo() to work
+ parent::CI_Loader();
+ $this->load =& $this;
+
+ // This allows resources used within controller constructors to work
+ global $OBJ;
+ $OBJ = $this->load; // Do NOT use a reference.
+ }
+}
+
+function &get_instance()
+{
+ global $CI, $OBJ;
+
+ if (is_object($CI))
+ {
+ return $CI;
+ }
+
+ return $OBJ->load;
+}
+
+
+/* End of file Base4.php */
/* Location: ./system/codeigniter/Base4.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.3\r
- * @filesource\r
- */\r
-\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CI_BASE - For PHP 5\r
- *\r
- * This file contains some code used only when CodeIgniter is being\r
- * run under PHP 5. It allows us to manage the CI super object more\r
- * gracefully than what is possible with PHP 4.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage codeigniter\r
- * @category front-controller\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/\r
- */\r
-\r
-class CI_Base {\r
-\r
- private static $instance;\r
-\r
- public function CI_Base()\r
- {\r
- self::$instance =& $this;\r
- }\r
-\r
- public static function &get_instance()\r
- {\r
- return self::$instance;\r
- }\r
-}\r
-\r
-function &get_instance()\r
-{\r
- return CI_Base::get_instance();\r
-}\r
-\r
-\r
-\r
-/* End of file Base5.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.3
+ * @filesource
+ */
+
+
+// ------------------------------------------------------------------------
+
+/**
+ * CI_BASE - For PHP 5
+ *
+ * This file contains some code used only when CodeIgniter is being
+ * run under PHP 5. It allows us to manage the CI super object more
+ * gracefully than what is possible with PHP 4.
+ *
+ * @package CodeIgniter
+ * @subpackage codeigniter
+ * @category front-controller
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/
+ */
+
+class CI_Base {
+
+ private static $instance;
+
+ public function CI_Base()
+ {
+ self::$instance =& $this;
+ }
+
+ public static function &get_instance()
+ {
+ return self::$instance;
+ }
+}
+
+function &get_instance()
+{
+ return CI_Base::get_instance();
+}
+
+
+
+/* End of file Base5.php */
/* Location: ./system/codeigniter/Base5.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * System Front Controller\r
- *\r
- * Loads the base classes and executes the request.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage codeigniter\r
- * @category Front-controller\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/\r
- */\r
-\r
-// CI Version\r
-define('CI_VERSION', '1.7.0');\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Load the global functions\r
- * ------------------------------------------------------\r
- */\r
-require(BASEPATH.'codeigniter/Common'.EXT);\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Load the compatibility override functions\r
- * ------------------------------------------------------\r
- */\r
-require(BASEPATH.'codeigniter/Compat'.EXT);\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Load the framework constants\r
- * ------------------------------------------------------\r
- */\r
-require(APPPATH.'config/constants'.EXT);\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Define a custom error handler so we can log PHP errors\r
- * ------------------------------------------------------\r
- */\r
-set_error_handler('_exception_handler');\r
-set_magic_quotes_runtime(0); // Kill magic quotes\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Start the timer... tick tock tick tock...\r
- * ------------------------------------------------------\r
- */\r
-\r
-$BM =& load_class('Benchmark');\r
-$BM->mark('total_execution_time_start');\r
-$BM->mark('loading_time_base_classes_start');\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Instantiate the hooks class\r
- * ------------------------------------------------------\r
- */\r
-\r
-$EXT =& load_class('Hooks');\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Is there a "pre_system" hook?\r
- * ------------------------------------------------------\r
- */\r
-$EXT->_call_hook('pre_system');\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Instantiate the base classes\r
- * ------------------------------------------------------\r
- */\r
-\r
-$CFG =& load_class('Config');\r
-$URI =& load_class('URI');\r
-$RTR =& load_class('Router');\r
-$OUT =& load_class('Output');\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Is there a valid cache file? If so, we're done...\r
- * ------------------------------------------------------\r
- */\r
-\r
-if ($EXT->_call_hook('cache_override') === FALSE)\r
-{\r
- if ($OUT->_display_cache($CFG, $URI) == TRUE)\r
- {\r
- exit;\r
- }\r
-}\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Load the remaining base classes\r
- * ------------------------------------------------------\r
- */\r
-\r
-$IN =& load_class('Input');\r
-$LANG =& load_class('Language');\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Load the app controller and local controller\r
- * ------------------------------------------------------\r
- *\r
- * Note: Due to the poor object handling in PHP 4 we'll\r
- * conditionally load different versions of the base\r
- * class. Retaining PHP 4 compatibility requires a bit of a hack.\r
- *\r
- * Note: The Loader class needs to be included first\r
- *\r
- */\r
-if (floor(phpversion()) < 5)\r
-{\r
- load_class('Loader', FALSE);\r
- require(BASEPATH.'codeigniter/Base4'.EXT);\r
-}\r
-else\r
-{\r
- require(BASEPATH.'codeigniter/Base5'.EXT);\r
-}\r
-\r
-// Load the base controller class\r
-load_class('Controller', FALSE);\r
-\r
-// Load the local application controller\r
-// Note: The Router class automatically validates the controller path. If this include fails it \r
-// means that the default controller in the Routes.php file is not resolving to something valid.\r
-if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT))\r
-{\r
- show_error('Unable to load your default controller. Please make sure the controller specified in your Routes.php file is valid.');\r
-}\r
-\r
-include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT);\r
-\r
-// Set a mark point for benchmarking\r
-$BM->mark('loading_time_base_classes_end');\r
-\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Security check\r
- * ------------------------------------------------------\r
- *\r
- * None of the functions in the app controller or the\r
- * loader class can be called via the URI, nor can\r
- * controller functions that begin with an underscore\r
- */\r
-$class = $RTR->fetch_class();\r
-$method = $RTR->fetch_method();\r
-\r
-if ( ! class_exists($class)\r
- OR $method == 'controller'\r
- OR strncmp($method, '_', 1) == 0\r
- OR in_array(strtolower($method), array_map('strtolower', get_class_methods('Controller')))\r
- )\r
-{\r
- show_404("{$class}/{$method}");\r
-}\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Is there a "pre_controller" hook?\r
- * ------------------------------------------------------\r
- */\r
-$EXT->_call_hook('pre_controller');\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Instantiate the controller and call requested method\r
- * ------------------------------------------------------\r
- */\r
-\r
-// Mark a start point so we can benchmark the controller\r
-$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');\r
-\r
-$CI = new $class();\r
-\r
-// Is this a scaffolding request?\r
-if ($RTR->scaffolding_request === TRUE)\r
-{\r
- if ($EXT->_call_hook('scaffolding_override') === FALSE)\r
- {\r
- $CI->_ci_scaffolding();\r
- }\r
-}\r
-else\r
-{\r
- /*\r
- * ------------------------------------------------------\r
- * Is there a "post_controller_constructor" hook?\r
- * ------------------------------------------------------\r
- */\r
- $EXT->_call_hook('post_controller_constructor');\r
- \r
- // Is there a "remap" function?\r
- if (method_exists($CI, '_remap'))\r
- {\r
- $CI->_remap($method);\r
- }\r
- else\r
- {\r
- // is_callable() returns TRUE on some versions of PHP 5 for private and protected\r
- // methods, so we'll use this workaround for consistent behavior\r
- if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI))))\r
- {\r
- show_404("{$class}/{$method}");\r
- }\r
-\r
- // Call the requested method.\r
- // Any URI segments present (besides the class/function) will be passed to the method for convenience\r
- call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));\r
- }\r
-}\r
-\r
-// Mark a benchmark end point\r
-$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Is there a "post_controller" hook?\r
- * ------------------------------------------------------\r
- */\r
-$EXT->_call_hook('post_controller');\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Send the final rendered output to the browser\r
- * ------------------------------------------------------\r
- */\r
-\r
-if ($EXT->_call_hook('display_override') === FALSE)\r
-{\r
- $OUT->_display();\r
-}\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Is there a "post_system" hook?\r
- * ------------------------------------------------------\r
- */\r
-$EXT->_call_hook('post_system');\r
-\r
-/*\r
- * ------------------------------------------------------\r
- * Close the DB connection if one exists\r
- * ------------------------------------------------------\r
- */\r
-if (class_exists('CI_DB') AND isset($CI->db))\r
-{\r
- $CI->db->close();\r
-}\r
-\r
-\r
-/* End of file CodeIgniter.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * System Front Controller
+ *
+ * Loads the base classes and executes the request.
+ *
+ * @package CodeIgniter
+ * @subpackage codeigniter
+ * @category Front-controller
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/
+ */
+
+// CI Version
+define('CI_VERSION', '1.7.0');
+
+/*
+ * ------------------------------------------------------
+ * Load the global functions
+ * ------------------------------------------------------
+ */
+require(BASEPATH.'codeigniter/Common'.EXT);
+
+/*
+ * ------------------------------------------------------
+ * Load the compatibility override functions
+ * ------------------------------------------------------
+ */
+require(BASEPATH.'codeigniter/Compat'.EXT);
+
+/*
+ * ------------------------------------------------------
+ * Load the framework constants
+ * ------------------------------------------------------
+ */
+require(APPPATH.'config/constants'.EXT);
+
+/*
+ * ------------------------------------------------------
+ * Define a custom error handler so we can log PHP errors
+ * ------------------------------------------------------
+ */
+set_error_handler('_exception_handler');
+set_magic_quotes_runtime(0); // Kill magic quotes
+
+/*
+ * ------------------------------------------------------
+ * Start the timer... tick tock tick tock...
+ * ------------------------------------------------------
+ */
+
+$BM =& load_class('Benchmark');
+$BM->mark('total_execution_time_start');
+$BM->mark('loading_time_base_classes_start');
+
+/*
+ * ------------------------------------------------------
+ * Instantiate the hooks class
+ * ------------------------------------------------------
+ */
+
+$EXT =& load_class('Hooks');
+
+/*
+ * ------------------------------------------------------
+ * Is there a "pre_system" hook?
+ * ------------------------------------------------------
+ */
+$EXT->_call_hook('pre_system');
+
+/*
+ * ------------------------------------------------------
+ * Instantiate the base classes
+ * ------------------------------------------------------
+ */
+
+$CFG =& load_class('Config');
+$URI =& load_class('URI');
+$RTR =& load_class('Router');
+$OUT =& load_class('Output');
+
+/*
+ * ------------------------------------------------------
+ * Is there a valid cache file? If so, we're done...
+ * ------------------------------------------------------
+ */
+
+if ($EXT->_call_hook('cache_override') === FALSE)
+{
+ if ($OUT->_display_cache($CFG, $URI) == TRUE)
+ {
+ exit;
+ }
+}
+
+/*
+ * ------------------------------------------------------
+ * Load the remaining base classes
+ * ------------------------------------------------------
+ */
+
+$IN =& load_class('Input');
+$LANG =& load_class('Language');
+
+/*
+ * ------------------------------------------------------
+ * Load the app controller and local controller
+ * ------------------------------------------------------
+ *
+ * Note: Due to the poor object handling in PHP 4 we'll
+ * conditionally load different versions of the base
+ * class. Retaining PHP 4 compatibility requires a bit of a hack.
+ *
+ * Note: The Loader class needs to be included first
+ *
+ */
+if (floor(phpversion()) < 5)
+{
+ load_class('Loader', FALSE);
+ require(BASEPATH.'codeigniter/Base4'.EXT);
+}
+else
+{
+ require(BASEPATH.'codeigniter/Base5'.EXT);
+}
+
+// Load the base controller class
+load_class('Controller', FALSE);
+
+// Load the local application controller
+// Note: The Router class automatically validates the controller path. 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().EXT))
+{
+ 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().EXT);
+
+// Set a mark point for benchmarking
+$BM->mark('loading_time_base_classes_end');
+
+
+/*
+ * ------------------------------------------------------
+ * Security check
+ * ------------------------------------------------------
+ *
+ * None of the functions in the app controller or the
+ * loader class can be called via the URI, nor can
+ * controller functions that begin with an underscore
+ */
+$class = $RTR->fetch_class();
+$method = $RTR->fetch_method();
+
+if ( ! class_exists($class)
+ OR $method == 'controller'
+ OR strncmp($method, '_', 1) == 0
+ OR in_array(strtolower($method), array_map('strtolower', get_class_methods('Controller')))
+ )
+{
+ show_404("{$class}/{$method}");
+}
+
+/*
+ * ------------------------------------------------------
+ * Is there a "pre_controller" hook?
+ * ------------------------------------------------------
+ */
+$EXT->_call_hook('pre_controller');
+
+/*
+ * ------------------------------------------------------
+ * Instantiate the controller and call requested method
+ * ------------------------------------------------------
+ */
+
+// Mark a start point so we can benchmark the controller
+$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');
+
+$CI = new $class();
+
+// Is this a scaffolding request?
+if ($RTR->scaffolding_request === TRUE)
+{
+ if ($EXT->_call_hook('scaffolding_override') === FALSE)
+ {
+ $CI->_ci_scaffolding();
+ }
+}
+else
+{
+ /*
+ * ------------------------------------------------------
+ * Is there a "post_controller_constructor" hook?
+ * ------------------------------------------------------
+ */
+ $EXT->_call_hook('post_controller_constructor');
+
+ // Is there a "remap" function?
+ if (method_exists($CI, '_remap'))
+ {
+ $CI->_remap($method);
+ }
+ 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))))
+ {
+ show_404("{$class}/{$method}");
+ }
+
+ // Call the requested method.
+ // Any URI segments present (besides the class/function) will be passed to the method for convenience
+ call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
+ }
+}
+
+// Mark a benchmark end point
+$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');
+
+/*
+ * ------------------------------------------------------
+ * Is there a "post_controller" hook?
+ * ------------------------------------------------------
+ */
+$EXT->_call_hook('post_controller');
+
+/*
+ * ------------------------------------------------------
+ * Send the final rendered output to the browser
+ * ------------------------------------------------------
+ */
+
+if ($EXT->_call_hook('display_override') === FALSE)
+{
+ $OUT->_display();
+}
+
+/*
+ * ------------------------------------------------------
+ * Is there a "post_system" hook?
+ * ------------------------------------------------------
+ */
+$EXT->_call_hook('post_system');
+
+/*
+ * ------------------------------------------------------
+ * Close the DB connection if one exists
+ * ------------------------------------------------------
+ */
+if (class_exists('CI_DB') AND isset($CI->db))
+{
+ $CI->db->close();
+}
+
+
+/* End of file CodeIgniter.php */
/* Location: ./system/codeigniter/CodeIgniter.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Common Functions\r
- *\r
- * Loads the base classes and executes the request.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage codeigniter\r
- * @category Common Functions\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Tests for file writability\r
- *\r
- * is_writable() returns TRUE on Windows servers when you really can't write to \r
- * the file, based on the read-only attribute. is_writable() is also unreliable\r
- * on Unix servers if safe_mode is on. \r
- *\r
- * @access private\r
- * @return void\r
- */\r
-function is_really_writable($file)\r
-{ \r
- // If we're on a Unix server with safe_mode off we call is_writable\r
- if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)\r
- {\r
- return is_writable($file);\r
- }\r
-\r
- // For windows servers and safe_mode "on" installations we'll actually\r
- // write a file then read it. Bah...\r
- if (is_dir($file))\r
- {\r
- $file = rtrim($file, '/').'/'.md5(rand(1,100));\r
-\r
- if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)\r
- {\r
- return FALSE;\r
- }\r
-\r
- fclose($fp);\r
- @chmod($file, DIR_WRITE_MODE);\r
- @unlink($file);\r
- return TRUE;\r
- }\r
- elseif (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)\r
- {\r
- return FALSE;\r
- }\r
-\r
- fclose($fp);\r
- return TRUE;\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
-* Class registry\r
-*\r
-* This function acts as a singleton. If the requested class does not\r
-* exist it is instantiated and set to a static variable. If it has\r
-* previously been instantiated the variable is returned.\r
-*\r
-* @access public\r
-* @param string the class name being requested\r
-* @param bool optional flag that lets classes get loaded but not instantiated\r
-* @return object\r
-*/\r
-function &load_class($class, $instantiate = TRUE)\r
-{\r
- static $objects = array();\r
-\r
- // Does the class exist? If so, we're done...\r
- if (isset($objects[$class]))\r
- {\r
- return $objects[$class];\r
- }\r
-\r
- // If the requested class does not exist in the application/libraries\r
- // folder we'll load the native class from the system/libraries folder. \r
- if (file_exists(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT))\r
- {\r
- require(BASEPATH.'libraries/'.$class.EXT);\r
- require(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT);\r
- $is_subclass = TRUE;\r
- }\r
- else\r
- {\r
- if (file_exists(APPPATH.'libraries/'.$class.EXT))\r
- {\r
- require(APPPATH.'libraries/'.$class.EXT);\r
- $is_subclass = FALSE;\r
- }\r
- else\r
- {\r
- require(BASEPATH.'libraries/'.$class.EXT);\r
- $is_subclass = FALSE;\r
- }\r
- }\r
-\r
- if ($instantiate == FALSE)\r
- {\r
- $objects[$class] = TRUE;\r
- return $objects[$class];\r
- }\r
-\r
- if ($is_subclass == TRUE)\r
- {\r
- $name = config_item('subclass_prefix').$class;\r
- $objects[$class] =& new $name();\r
- return $objects[$class];\r
- }\r
-\r
- $name = ($class != 'Controller') ? 'CI_'.$class : $class;\r
- \r
- $objects[$class] =& new $name();\r
- return $objects[$class];\r
-}\r
-\r
-/**\r
-* Loads the main config.php file\r
-*\r
-* @access private\r
-* @return array\r
-*/\r
-function &get_config()\r
-{\r
- static $main_conf;\r
-\r
- if ( ! isset($main_conf))\r
- {\r
- if ( ! file_exists(APPPATH.'config/config'.EXT))\r
- {\r
- exit('The configuration file config'.EXT.' does not exist.');\r
- }\r
-\r
- require(APPPATH.'config/config'.EXT);\r
-\r
- if ( ! isset($config) OR ! is_array($config))\r
- {\r
- exit('Your config file does not appear to be formatted correctly.');\r
- }\r
-\r
- $main_conf[0] =& $config;\r
- }\r
- return $main_conf[0];\r
-}\r
-\r
-/**\r
-* Gets a config item\r
-*\r
-* @access public\r
-* @return mixed\r
-*/\r
-function config_item($item)\r
-{\r
- static $config_item = array();\r
-\r
- if ( ! isset($config_item[$item]))\r
- {\r
- $config =& get_config();\r
-\r
- if ( ! isset($config[$item]))\r
- {\r
- return FALSE;\r
- }\r
- $config_item[$item] = $config[$item];\r
- }\r
-\r
- return $config_item[$item];\r
-}\r
-\r
-\r
-/**\r
-* Error Handler\r
-*\r
-* This function lets us invoke the exception class and\r
-* display errors using the standard error template located\r
-* in application/errors/errors.php\r
-* This function will send the error page directly to the\r
-* browser and exit.\r
-*\r
-* @access public\r
-* @return void\r
-*/\r
-function show_error($message)\r
-{\r
- $error =& load_class('Exceptions');\r
- echo $error->show_error('An Error Was Encountered', $message);\r
- exit;\r
-}\r
-\r
-\r
-/**\r
-* 404 Page Handler\r
-*\r
-* This function is similar to the show_error() function above\r
-* However, instead of the standard error template it displays\r
-* 404 errors.\r
-*\r
-* @access public\r
-* @return void\r
-*/\r
-function show_404($page = '')\r
-{\r
- $error =& load_class('Exceptions');\r
- $error->show_404($page);\r
- exit;\r
-}\r
-\r
-\r
-/**\r
-* Error Logging Interface\r
-*\r
-* We use this as a simple mechanism to access the logging\r
-* class and send messages to be logged.\r
-*\r
-* @access public\r
-* @return void\r
-*/\r
-function log_message($level = 'error', $message, $php_error = FALSE)\r
-{\r
- static $LOG;\r
- \r
- $config =& get_config();\r
- if ($config['log_threshold'] == 0)\r
- {\r
- return;\r
- }\r
-\r
- $LOG =& load_class('Log');\r
- $LOG->write_log($level, $message, $php_error);\r
-}\r
-\r
-/**\r
-* Exception Handler\r
-*\r
-* This is the custom exception handler that is declaired at the top\r
-* of Codeigniter.php. The main reason we use this is permit\r
-* PHP errors to be logged in our own log files since we may\r
-* not have access to server logs. Since this function\r
-* effectively intercepts PHP errors, however, we also need\r
-* to display errors based on the current error_reporting level.\r
-* We do that with the use of a PHP error template.\r
-*\r
-* @access private\r
-* @return void\r
-*/\r
-function _exception_handler($severity, $message, $filepath, $line)\r
-{ \r
- // We don't bother with "strict" notices since they will fill up\r
- // the log file with information that isn't normally very\r
- // helpful. For example, if you are running PHP 5 and you\r
- // use version 4 style class functions (without prefixes\r
- // like "public", "private", etc.) you'll get notices telling\r
- // you that these have been deprecated.\r
- \r
- if ($severity == E_STRICT)\r
- {\r
- return;\r
- }\r
-\r
- $error =& load_class('Exceptions');\r
-\r
- // Should we display the error?\r
- // We'll get the current error_reporting level and add its bits\r
- // with the severity bits to find out.\r
- \r
- if (($severity & error_reporting()) == $severity)\r
- {\r
- $error->show_php_error($severity, $message, $filepath, $line);\r
- }\r
- \r
- // Should we log the error? No? We're done...\r
- $config =& get_config();\r
- if ($config['log_threshold'] == 0)\r
- {\r
- return;\r
- }\r
-\r
- $error->log_exception($severity, $message, $filepath, $line);\r
-}\r
-\r
-\r
-\r
-/* End of file Common.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Common Functions
+ *
+ * Loads the base classes and executes the request.
+ *
+ * @package CodeIgniter
+ * @subpackage codeigniter
+ * @category Common Functions
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Tests for file writability
+ *
+ * is_writable() returns TRUE on Windows servers when you really can't write to
+ * the file, based on the read-only attribute. is_writable() is also unreliable
+ * on Unix servers if safe_mode is on.
+ *
+ * @access private
+ * @return void
+ */
+function is_really_writable($file)
+{
+ // If we're on a Unix server with safe_mode off we call is_writable
+ if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
+ {
+ return is_writable($file);
+ }
+
+ // For windows servers and safe_mode "on" installations we'll actually
+ // write a file then read it. Bah...
+ if (is_dir($file))
+ {
+ $file = rtrim($file, '/').'/'.md5(rand(1,100));
+
+ if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
+ {
+ return FALSE;
+ }
+
+ fclose($fp);
+ @chmod($file, DIR_WRITE_MODE);
+ @unlink($file);
+ return TRUE;
+ }
+ elseif (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
+ {
+ return FALSE;
+ }
+
+ fclose($fp);
+ return TRUE;
+}
+
+// ------------------------------------------------------------------------
+
+/**
+* Class registry
+*
+* This function acts as a singleton. If the requested class does not
+* exist it is instantiated and set to a static variable. If it has
+* previously been instantiated the variable is returned.
+*
+* @access public
+* @param string the class name being requested
+* @param bool optional flag that lets classes get loaded but not instantiated
+* @return object
+*/
+function &load_class($class, $instantiate = TRUE)
+{
+ static $objects = array();
+
+ // Does the class exist? If so, we're done...
+ if (isset($objects[$class]))
+ {
+ return $objects[$class];
+ }
+
+ // If the requested class does not exist in the application/libraries
+ // folder we'll load the native class from the system/libraries folder.
+ if (file_exists(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT))
+ {
+ require(BASEPATH.'libraries/'.$class.EXT);
+ require(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT);
+ $is_subclass = TRUE;
+ }
+ else
+ {
+ if (file_exists(APPPATH.'libraries/'.$class.EXT))
+ {
+ require(APPPATH.'libraries/'.$class.EXT);
+ $is_subclass = FALSE;
+ }
+ else
+ {
+ require(BASEPATH.'libraries/'.$class.EXT);
+ $is_subclass = FALSE;
+ }
+ }
+
+ if ($instantiate == FALSE)
+ {
+ $objects[$class] = TRUE;
+ return $objects[$class];
+ }
+
+ if ($is_subclass == TRUE)
+ {
+ $name = config_item('subclass_prefix').$class;
+ $objects[$class] =& new $name();
+ return $objects[$class];
+ }
+
+ $name = ($class != 'Controller') ? 'CI_'.$class : $class;
+
+ $objects[$class] =& new $name();
+ return $objects[$class];
+}
+
+/**
+* Loads the main config.php file
+*
+* @access private
+* @return array
+*/
+function &get_config()
+{
+ static $main_conf;
+
+ if ( ! isset($main_conf))
+ {
+ if ( ! file_exists(APPPATH.'config/config'.EXT))
+ {
+ exit('The configuration file config'.EXT.' does not exist.');
+ }
+
+ require(APPPATH.'config/config'.EXT);
+
+ if ( ! isset($config) OR ! is_array($config))
+ {
+ exit('Your config file does not appear to be formatted correctly.');
+ }
+
+ $main_conf[0] =& $config;
+ }
+ return $main_conf[0];
+}
+
+/**
+* Gets a config item
+*
+* @access public
+* @return mixed
+*/
+function config_item($item)
+{
+ static $config_item = array();
+
+ if ( ! isset($config_item[$item]))
+ {
+ $config =& get_config();
+
+ if ( ! isset($config[$item]))
+ {
+ return FALSE;
+ }
+ $config_item[$item] = $config[$item];
+ }
+
+ return $config_item[$item];
+}
+
+
+/**
+* Error Handler
+*
+* This function lets us invoke the exception class and
+* display errors using the standard error template located
+* in application/errors/errors.php
+* This function will send the error page directly to the
+* browser and exit.
+*
+* @access public
+* @return void
+*/
+function show_error($message)
+{
+ $error =& load_class('Exceptions');
+ echo $error->show_error('An Error Was Encountered', $message);
+ exit;
+}
+
+
+/**
+* 404 Page Handler
+*
+* This function is similar to the show_error() function above
+* However, instead of the standard error template it displays
+* 404 errors.
+*
+* @access public
+* @return void
+*/
+function show_404($page = '')
+{
+ $error =& load_class('Exceptions');
+ $error->show_404($page);
+ exit;
+}
+
+
+/**
+* Error Logging Interface
+*
+* We use this as a simple mechanism to access the logging
+* class and send messages to be logged.
+*
+* @access public
+* @return void
+*/
+function log_message($level = 'error', $message, $php_error = FALSE)
+{
+ static $LOG;
+
+ $config =& get_config();
+ if ($config['log_threshold'] == 0)
+ {
+ return;
+ }
+
+ $LOG =& load_class('Log');
+ $LOG->write_log($level, $message, $php_error);
+}
+
+/**
+* Exception Handler
+*
+* This is the custom exception handler that is declaired at the top
+* of Codeigniter.php. The main reason we use this is permit
+* PHP errors to be logged in our own log files since we may
+* not have access to server logs. Since this function
+* effectively intercepts PHP errors, however, we also need
+* to display errors based on the current error_reporting level.
+* We do that with the use of a PHP error template.
+*
+* @access private
+* @return void
+*/
+function _exception_handler($severity, $message, $filepath, $line)
+{
+ // We don't bother with "strict" notices since they will fill up
+ // the log file with information that isn't normally very
+ // helpful. For example, if you are running PHP 5 and you
+ // use version 4 style class functions (without prefixes
+ // like "public", "private", etc.) you'll get notices telling
+ // you that these have been deprecated.
+
+ if ($severity == E_STRICT)
+ {
+ return;
+ }
+
+ $error =& load_class('Exceptions');
+
+ // Should we display the error?
+ // We'll get the current error_reporting level and add its bits
+ // with the severity bits to find out.
+
+ if (($severity & error_reporting()) == $severity)
+ {
+ $error->show_php_error($severity, $message, $filepath, $line);
+ }
+
+ // Should we log the error? No? We're done...
+ $config =& get_config();
+ if ($config['log_threshold'] == 0)
+ {
+ return;
+ }
+
+ $error->log_exception($severity, $message, $filepath, $line);
+}
+
+
+
+/* End of file Common.php */
/* Location: ./system/codeigniter/Common.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Compatibility Functions\r
- *\r
- * Function overrides for older versions of PHP or PHP environments missing\r
- * certain extensions / libraries\r
- *\r
- * @package CodeIgniter\r
- * @subpackage codeigniter\r
- * @category Compatibility Functions\r
- * @author ExpressionEngine Development Team\r
- * @link http://codeigniter.com/user_guide/\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/*\r
- * PHP versions prior to 5.0 don't support the E_STRICT constant\r
- * so we need to explicitly define it otherwise the Exception class \r
- * will generate errors when running under PHP 4\r
- *\r
- */\r
-if ( ! defined('E_STRICT'))\r
-{\r
- define('E_STRICT', 2048);\r
-}\r
-\r
-/**\r
- * ctype_digit()\r
- *\r
- * Determines if a string is comprised only of digits\r
- * http://us.php.net/manual/en/function.ctype_digit.php\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
-if ( ! function_exists('ctype_digit'))\r
-{\r
- function ctype_digit($str)\r
- {\r
- if ( ! is_string($str) OR $str == '')\r
- {\r
- return FALSE;\r
- }\r
- \r
- return ! preg_match('/[^0-9]/', $str);\r
- } \r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * ctype_alnum()\r
- *\r
- * Determines if a string is comprised of only alphanumeric characters\r
- * http://us.php.net/manual/en/function.ctype-alnum.php\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
-if ( ! function_exists('ctype_alnum'))\r
-{\r
- function ctype_alnum($str)\r
- {\r
- if ( ! is_string($str) OR $str == '')\r
- {\r
- return FALSE;\r
- }\r
- \r
- return ! preg_match('/[^0-9a-z]/i', $str);\r
- } \r
-}\r
-\r
-/* End of file Compat.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Compatibility Functions
+ *
+ * Function overrides for older versions of PHP or PHP environments missing
+ * certain extensions / libraries
+ *
+ * @package CodeIgniter
+ * @subpackage codeigniter
+ * @category Compatibility Functions
+ * @author ExpressionEngine Development Team
+ * @link http://codeigniter.com/user_guide/
+ */
+
+// ------------------------------------------------------------------------
+
+/*
+ * PHP versions prior to 5.0 don't support the E_STRICT constant
+ * so we need to explicitly define it otherwise the Exception class
+ * will generate errors when running under PHP 4
+ *
+ */
+if ( ! defined('E_STRICT'))
+{
+ define('E_STRICT', 2048);
+}
+
+/**
+ * ctype_digit()
+ *
+ * Determines if a string is comprised only of digits
+ * http://us.php.net/manual/en/function.ctype_digit.php
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+if ( ! function_exists('ctype_digit'))
+{
+ function ctype_digit($str)
+ {
+ if ( ! is_string($str) OR $str == '')
+ {
+ return FALSE;
+ }
+
+ return ! preg_match('/[^0-9]/', $str);
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * ctype_alnum()
+ *
+ * Determines if a string is comprised of only alphanumeric characters
+ * http://us.php.net/manual/en/function.ctype-alnum.php
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+if ( ! function_exists('ctype_alnum'))
+{
+ function ctype_alnum($str)
+ {
+ if ( ! is_string($str) OR $str == '')
+ {
+ return FALSE;
+ }
+
+ return ! preg_match('/[^0-9a-z]/i', $str);
+ }
+}
+
+/* End of file Compat.php */
/* Location: ./system/codeigniter/Compat.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Initialize the database\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-function &DB($params = '', $active_record_override = FALSE)\r
-{\r
- // Load the DB config file if a DSN string wasn't passed\r
- if (is_string($params) AND strpos($params, '://') === FALSE)\r
- {\r
- include(APPPATH.'config/database'.EXT);\r
- \r
- if ( ! isset($db) OR count($db) == 0)\r
- {\r
- show_error('No database connection settings were found in the database config file.');\r
- }\r
- \r
- if ($params != '')\r
- {\r
- $active_group = $params;\r
- }\r
- \r
- if ( ! isset($active_group) OR ! isset($db[$active_group]))\r
- {\r
- show_error('You have specified an invalid database connection group.');\r
- }\r
- \r
- $params = $db[$active_group];\r
- }\r
- elseif (is_string($params))\r
- {\r
- \r
- /* parse the URL from the DSN string\r
- * Database settings can be passed as discreet\r
- * parameters or as a data source name in the first\r
- * parameter. DSNs must have this prototype:\r
- * $dsn = 'driver://username:password@hostname/database';\r
- */\r
- \r
- if (($dns = @parse_url($params)) === FALSE)\r
- {\r
- show_error('Invalid DB Connection String');\r
- }\r
- \r
- $params = array(\r
- 'dbdriver' => $dns['scheme'],\r
- 'hostname' => (isset($dns['host'])) ? rawurldecode($dns['host']) : '',\r
- 'username' => (isset($dns['user'])) ? rawurldecode($dns['user']) : '',\r
- 'password' => (isset($dns['pass'])) ? rawurldecode($dns['pass']) : '',\r
- 'database' => (isset($dns['path'])) ? rawurldecode(substr($dns['path'], 1)) : ''\r
- );\r
- \r
- // were additional config items set?\r
- if (isset($dns['query']))\r
- {\r
- parse_str($dns['query'], $extra);\r
-\r
- foreach($extra as $key => $val)\r
- {\r
- // booleans please\r
- if (strtoupper($val) == "TRUE")\r
- {\r
- $val = TRUE;\r
- }\r
- elseif (strtoupper($val) == "FALSE")\r
- {\r
- $val = FALSE;\r
- }\r
-\r
- $params[$key] = $val;\r
- }\r
- }\r
- }\r
- \r
- // No DB specified yet? Beat them senseless...\r
- if ( ! isset($params['dbdriver']) OR $params['dbdriver'] == '')\r
- {\r
- show_error('You have not selected a database type to connect to.');\r
- }\r
-\r
- // Load the DB classes. Note: Since the active record class is optional\r
- // we need to dynamically create a class that extends proper parent class\r
- // based on whether we're using the active record class or not.\r
- // Kudos to Paul for discovering this clever use of eval()\r
- \r
- if ($active_record_override == TRUE)\r
- {\r
- $active_record = TRUE;\r
- }\r
- \r
- require_once(BASEPATH.'database/DB_driver'.EXT);\r
-\r
- if ( ! isset($active_record) OR $active_record == TRUE)\r
- {\r
- require_once(BASEPATH.'database/DB_active_rec'.EXT);\r
- \r
- if ( ! class_exists('CI_DB'))\r
- {\r
- eval('class CI_DB extends CI_DB_active_record { }');\r
- }\r
- }\r
- else\r
- {\r
- if ( ! class_exists('CI_DB'))\r
- {\r
- eval('class CI_DB extends CI_DB_driver { }');\r
- }\r
- }\r
- \r
- require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver'.EXT);\r
-\r
- // Instantiate the DB adapter\r
- $driver = 'CI_DB_'.$params['dbdriver'].'_driver';\r
- $DB =& new $driver($params);\r
- \r
- if ($DB->autoinit == TRUE)\r
- {\r
- $DB->initialize();\r
- }\r
- \r
- return $DB;\r
-} \r
-\r
-\r
-\r
-/* End of file DB.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Initialize the database
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+function &DB($params = '', $active_record_override = FALSE)
+{
+ // Load the DB config file if a DSN string wasn't passed
+ if (is_string($params) AND strpos($params, '://') === FALSE)
+ {
+ include(APPPATH.'config/database'.EXT);
+
+ if ( ! isset($db) OR count($db) == 0)
+ {
+ show_error('No database connection settings were found in the database config file.');
+ }
+
+ if ($params != '')
+ {
+ $active_group = $params;
+ }
+
+ if ( ! isset($active_group) OR ! isset($db[$active_group]))
+ {
+ show_error('You have specified an invalid database connection group.');
+ }
+
+ $params = $db[$active_group];
+ }
+ elseif (is_string($params))
+ {
+
+ /* parse the URL from the DSN string
+ * Database settings can be passed as discreet
+ * parameters or as a data source name in the first
+ * parameter. DSNs must have this prototype:
+ * $dsn = 'driver://username:password@hostname/database';
+ */
+
+ if (($dns = @parse_url($params)) === FALSE)
+ {
+ show_error('Invalid DB Connection String');
+ }
+
+ $params = array(
+ 'dbdriver' => $dns['scheme'],
+ 'hostname' => (isset($dns['host'])) ? rawurldecode($dns['host']) : '',
+ 'username' => (isset($dns['user'])) ? rawurldecode($dns['user']) : '',
+ 'password' => (isset($dns['pass'])) ? rawurldecode($dns['pass']) : '',
+ 'database' => (isset($dns['path'])) ? rawurldecode(substr($dns['path'], 1)) : ''
+ );
+
+ // were additional config items set?
+ if (isset($dns['query']))
+ {
+ parse_str($dns['query'], $extra);
+
+ foreach($extra as $key => $val)
+ {
+ // booleans please
+ if (strtoupper($val) == "TRUE")
+ {
+ $val = TRUE;
+ }
+ elseif (strtoupper($val) == "FALSE")
+ {
+ $val = FALSE;
+ }
+
+ $params[$key] = $val;
+ }
+ }
+ }
+
+ // No DB specified yet? Beat them senseless...
+ if ( ! isset($params['dbdriver']) OR $params['dbdriver'] == '')
+ {
+ show_error('You have not selected a database type to connect to.');
+ }
+
+ // Load the DB classes. Note: Since the active record class is optional
+ // we need to dynamically create a class that extends proper parent class
+ // based on whether we're using the active record class or not.
+ // Kudos to Paul for discovering this clever use of eval()
+
+ if ($active_record_override == TRUE)
+ {
+ $active_record = TRUE;
+ }
+
+ require_once(BASEPATH.'database/DB_driver'.EXT);
+
+ if ( ! isset($active_record) OR $active_record == TRUE)
+ {
+ require_once(BASEPATH.'database/DB_active_rec'.EXT);
+
+ if ( ! class_exists('CI_DB'))
+ {
+ eval('class CI_DB extends CI_DB_active_record { }');
+ }
+ }
+ else
+ {
+ if ( ! class_exists('CI_DB'))
+ {
+ eval('class CI_DB extends CI_DB_driver { }');
+ }
+ }
+
+ require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver'.EXT);
+
+ // Instantiate the DB adapter
+ $driver = 'CI_DB_'.$params['dbdriver'].'_driver';
+ $DB =& new $driver($params);
+
+ if ($DB->autoinit == TRUE)
+ {
+ $DB->initialize();
+ }
+
+ return $DB;
+}
+
+
+
+/* End of file DB.php */
/* Location: ./system/database/DB.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Active Record Class\r
- *\r
- * This is the platform-independent base Active Record implementation class.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Drivers\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_active_record extends CI_DB_driver {\r
-\r
- var $ar_select = array();\r
- var $ar_distinct = FALSE;\r
- var $ar_from = array();\r
- var $ar_join = array();\r
- var $ar_where = array();\r
- var $ar_like = array();\r
- var $ar_groupby = array();\r
- var $ar_having = array();\r
- var $ar_limit = FALSE;\r
- var $ar_offset = FALSE;\r
- var $ar_order = FALSE;\r
- var $ar_orderby = array();\r
- var $ar_set = array(); \r
- var $ar_wherein = array();\r
- var $ar_aliased_tables = array();\r
- var $ar_store_array = array();\r
- \r
- // Active Record Caching variables\r
- var $ar_caching = FALSE;\r
- var $ar_cache_exists = array();\r
- var $ar_cache_select = array();\r
- var $ar_cache_from = array();\r
- var $ar_cache_join = array();\r
- var $ar_cache_where = array();\r
- var $ar_cache_like = array();\r
- var $ar_cache_groupby = array();\r
- var $ar_cache_having = array();\r
- var $ar_cache_orderby = array();\r
- var $ar_cache_set = array(); \r
-\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select\r
- *\r
- * Generates the SELECT portion of the query\r
- *\r
- * @access public\r
- * @param string\r
- * @return object\r
- */\r
- function select($select = '*', $escape = NULL)\r
- {\r
- // Set the global value if this was sepecified \r
- if (is_bool($escape))\r
- {\r
- $this->_protect_identifiers = $escape;\r
- }\r
- \r
- if (is_string($select))\r
- {\r
- $select = explode(',', $select);\r
- }\r
-\r
- foreach ($select as $val)\r
- {\r
- $val = trim($val);\r
-\r
- if ($val != '')\r
- {\r
- $this->ar_select[] = $val;\r
-\r
- if ($this->ar_caching === TRUE)\r
- {\r
- $this->ar_cache_select[] = $val;\r
- $this->ar_cache_exists[] = 'select';\r
- }\r
- }\r
- }\r
- return $this;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select Max\r
- *\r
- * Generates a SELECT MAX(field) portion of a query\r
- *\r
- * @access public\r
- * @param string the field\r
- * @param string an alias\r
- * @return object\r
- */\r
- function select_max($select = '', $alias = '')\r
- {\r
- return $this->_max_min_avg_sum($select, $alias, 'MAX');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select Min\r
- *\r
- * Generates a SELECT MIN(field) portion of a query\r
- *\r
- * @access public\r
- * @param string the field\r
- * @param string an alias\r
- * @return object\r
- */\r
- function select_min($select = '', $alias = '')\r
- {\r
- return $this->_max_min_avg_sum($select, $alias, 'MIN');\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select Average\r
- *\r
- * Generates a SELECT AVG(field) portion of a query\r
- *\r
- * @access public\r
- * @param string the field\r
- * @param string an alias\r
- * @return object\r
- */\r
- function select_avg($select = '', $alias = '')\r
- {\r
- return $this->_max_min_avg_sum($select, $alias, 'AVG');\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select Sum\r
- *\r
- * Generates a SELECT SUM(field) portion of a query\r
- *\r
- * @access public\r
- * @param string the field\r
- * @param string an alias\r
- * @return object\r
- */\r
- function select_sum($select = '', $alias = '')\r
- {\r
- return $this->_max_min_avg_sum($select, $alias, 'SUM');\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Processing Function for the four functions above:\r
- *\r
- * select_max()\r
- * select_min()\r
- * select_avg()\r
- * select_sum()\r
- * \r
- * @access public\r
- * @param string the field\r
- * @param string an alias\r
- * @return object\r
- */\r
- function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX')\r
- {\r
- if ( ! is_string($select) OR $select == '')\r
- {\r
- $this->display_error('db_invalid_query');\r
- }\r
- \r
- $type = strtoupper($type);\r
- \r
- if ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM')))\r
- {\r
- show_error('Invalid function type: '.$type);\r
- }\r
- \r
- if ($alias == '')\r
- {\r
- $alias = $this->_create_alias_from_table(trim($select));\r
- }\r
- \r
- $sql = $type.'('.$this->_protect_identifiers(trim($select)).') AS '.$alias;\r
-\r
- $this->ar_select[] = $sql;\r
- \r
- if ($this->ar_caching === TRUE)\r
- {\r
- $this->ar_cache_select[] = $sql;\r
- $this->ar_cache_exists[] = 'select';\r
- }\r
- \r
- return $this;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Determines the alias name based on the table\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _create_alias_from_table($item)\r
- {\r
- if (strpos($item, '.') !== FALSE)\r
- {\r
- return end(explode('.', $item));\r
- }\r
- \r
- return $item;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * DISTINCT\r
- *\r
- * Sets a flag which tells the query string compiler to add DISTINCT\r
- *\r
- * @access public\r
- * @param bool\r
- * @return object\r
- */\r
- function distinct($val = TRUE)\r
- {\r
- $this->ar_distinct = (is_bool($val)) ? $val : TRUE;\r
- return $this;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * From\r
- *\r
- * Generates the FROM portion of the query\r
- *\r
- * @access public\r
- * @param mixed can be a string or array\r
- * @return object\r
- */\r
- function from($from)\r
- {\r
- foreach ((array)$from as $val)\r
- {\r
- // Extract any aliases that might exist. We use this information\r
- // in the _protect_identifiers to know whether to add a table prefix \r
- $this->_track_aliases($val);\r
-\r
- $this->ar_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE);\r
- \r
- if ($this->ar_caching === TRUE)\r
- {\r
- $this->ar_cache_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE);\r
- $this->ar_cache_exists[] = 'from';\r
- }\r
- }\r
-\r
- return $this;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Join\r
- *\r
- * Generates the JOIN portion of the query\r
- *\r
- * @access public\r
- * @param string\r
- * @param string the join condition\r
- * @param string the type of join\r
- * @return object\r
- */\r
- function join($table, $cond, $type = '')\r
- { \r
- if ($type != '')\r
- {\r
- $type = strtoupper(trim($type));\r
-\r
- if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER')))\r
- {\r
- $type = '';\r
- }\r
- else\r
- {\r
- $type .= ' ';\r
- }\r
- }\r
-\r
- // Extract any aliases that might exist. We use this information\r
- // in the _protect_identifiers to know whether to add a table prefix \r
- $this->_track_aliases($table);\r
-\r
- // Strip apart the condition and protect the identifiers\r
- if (preg_match('/([\w\.]+)([\W\s]+)(.+)/', $cond, $match))\r
- {\r
- $match[1] = $this->_protect_identifiers($match[1]);\r
- $match[3] = $this->_protect_identifiers($match[3]);\r
- \r
- $cond = $match[1].$match[2].$match[3]; \r
- }\r
- \r
- // Assemble the JOIN statement\r
- $join = $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond;\r
-\r
- $this->ar_join[] = $join;\r
- if ($this->ar_caching === TRUE)\r
- {\r
- $this->ar_cache_join[] = $join;\r
- $this->ar_cache_exists[] = 'join';\r
- }\r
-\r
- return $this;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Where\r
- *\r
- * Generates the WHERE portion of the query. Separates\r
- * multiple calls with AND\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param mixed\r
- * @return object\r
- */\r
- function where($key, $value = NULL, $escape = TRUE)\r
- {\r
- return $this->_where($key, $value, 'AND ', $escape);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * OR Where\r
- *\r
- * Generates the WHERE portion of the query. Separates\r
- * multiple calls with OR\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param mixed\r
- * @return object\r
- */\r
- function or_where($key, $value = NULL, $escape = TRUE)\r
- {\r
- return $this->_where($key, $value, 'OR ', $escape);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * orwhere() is an alias of or_where()\r
- * this function is here for backwards compatibility, as\r
- * orwhere() has been deprecated\r
- */\r
- function orwhere($key, $value = NULL, $escape = TRUE)\r
- {\r
- return $this->or_where($key, $value, $escape);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Where\r
- *\r
- * Called by where() or orwhere()\r
- *\r
- * @access private\r
- * @param mixed\r
- * @param mixed\r
- * @param string\r
- * @return object\r
- */\r
- function _where($key, $value = NULL, $type = 'AND ', $escape = NULL)\r
- {\r
- if ( ! is_array($key))\r
- {\r
- $key = array($key => $value);\r
- }\r
- \r
- // If the escape value was not set will will base it on the global setting\r
- if ( ! is_bool($escape))\r
- {\r
- $escape = $this->_protect_identifiers;\r
- }\r
-\r
- foreach ($key as $k => $v)\r
- {\r
- $prefix = (count($this->ar_where) == 0 AND count($this->ar_cache_where) == 0) ? '' : $type;\r
-\r
- if (is_null($v) && ! $this->_has_operator($k))\r
- {\r
- // value appears not to have been set, assign the test to IS NULL\r
- $k .= ' IS NULL';\r
- }\r
- \r
- if ( ! is_null($v))\r
- {\r
- if ($escape === TRUE)\r
- {\r
- $k = $this->_protect_identifiers($k, FALSE, $escape);\r
- \r
- $v = ' '.$this->escape($v);\r
- }\r
-\r
- if ( ! $this->_has_operator($k))\r
- {\r
- $k .= ' =';\r
- }\r
- }\r
- else\r
- {\r
- $k = $this->_protect_identifiers($k, FALSE, $escape); \r
- }\r
-\r
- $this->ar_where[] = $prefix.$k.$v;\r
- \r
- if ($this->ar_caching === TRUE)\r
- {\r
- $this->ar_cache_where[] = $prefix.$k.$v;\r
- $this->ar_cache_exists[] = 'where';\r
- }\r
- \r
- }\r
- \r
- return $this;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Where_in\r
- *\r
- * Generates a WHERE field IN ('item', 'item') SQL query joined with\r
- * AND if appropriate\r
- *\r
- * @access public\r
- * @param string The field to search\r
- * @param array The values searched on\r
- * @return object\r
- */\r
- function where_in($key = NULL, $values = NULL)\r
- {\r
- return $this->_where_in($key, $values);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Where_in_or\r
- *\r
- * Generates a WHERE field IN ('item', 'item') SQL query joined with\r
- * OR if appropriate\r
- *\r
- * @access public\r
- * @param string The field to search\r
- * @param array The values searched on\r
- * @return object\r
- */\r
- function or_where_in($key = NULL, $values = NULL)\r
- {\r
- return $this->_where_in($key, $values, FALSE, 'OR ');\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Where_not_in\r
- *\r
- * Generates a WHERE field NOT IN ('item', 'item') SQL query joined\r
- * with AND if appropriate\r
- *\r
- * @access public\r
- * @param string The field to search\r
- * @param array The values searched on\r
- * @return object\r
- */\r
- function where_not_in($key = NULL, $values = NULL)\r
- {\r
- return $this->_where_in($key, $values, TRUE);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Where_not_in_or\r
- *\r
- * Generates a WHERE field NOT IN ('item', 'item') SQL query joined\r
- * with OR if appropriate\r
- *\r
- * @access public\r
- * @param string The field to search\r
- * @param array The values searched on\r
- * @return object\r
- */\r
- function or_where_not_in($key = NULL, $values = NULL)\r
- {\r
- return $this->_where_in($key, $values, TRUE, 'OR ');\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Where_in\r
- *\r
- * Called by where_in, where_in_or, where_not_in, where_not_in_or\r
- *\r
- * @access public\r
- * @param string The field to search\r
- * @param array The values searched on\r
- * @param boolean If the statement would be IN or NOT IN\r
- * @param string \r
- * @return object\r
- */\r
- function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ')\r
- {\r
- if ($key === NULL OR $values === NULL)\r
- {\r
- return;\r
- }\r
- \r
- if ( ! is_array($values))\r
- {\r
- $values = array($values);\r
- }\r
- \r
- $not = ($not) ? ' NOT' : '';\r
-\r
- foreach ($values as $value)\r
- {\r
- $this->ar_wherein[] = $this->escape($value);\r
- }\r
-\r
- $prefix = (count($this->ar_where) == 0) ? '' : $type;\r
- \r
- $where_in = $prefix . $this->_protect_identifiers($key) . $not . " IN (" . implode(", ", $this->ar_wherein) . ") ";\r
-\r
- $this->ar_where[] = $where_in;\r
- if ($this->ar_caching === TRUE)\r
- {\r
- $this->ar_cache_where[] = $where_in;\r
- $this->ar_cache_exists[] = 'where';\r
- }\r
-\r
- // reset the array for multiple calls\r
- $this->ar_wherein = array();\r
- return $this;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Like\r
- *\r
- * Generates a %LIKE% portion of the query. Separates\r
- * multiple calls with AND\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param mixed\r
- * @return object\r
- */\r
- function like($field, $match = '', $side = 'both')\r
- {\r
- return $this->_like($field, $match, 'AND ', $side);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Not Like\r
- *\r
- * Generates a NOT LIKE portion of the query. Separates\r
- * multiple calls with AND\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param mixed\r
- * @return object\r
- */\r
- function not_like($field, $match = '', $side = 'both')\r
- {\r
- return $this->_like($field, $match, 'AND ', $side, 'NOT');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * OR Like\r
- *\r
- * Generates a %LIKE% portion of the query. Separates\r
- * multiple calls with OR\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param mixed\r
- * @return object\r
- */\r
- function or_like($field, $match = '', $side = 'both')\r
- {\r
- return $this->_like($field, $match, 'OR ', $side);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * OR Not Like\r
- *\r
- * Generates a NOT LIKE portion of the query. Separates\r
- * multiple calls with OR\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param mixed\r
- * @return object\r
- */\r
- function or_not_like($field, $match = '', $side = 'both')\r
- {\r
- return $this->_like($field, $match, 'OR ', $side, 'NOT');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * orlike() is an alias of or_like()\r
- * this function is here for backwards compatibility, as\r
- * orlike() has been deprecated\r
- */\r
- function orlike($field, $match = '', $side = 'both')\r
- {\r
- return $this->or_like($field, $match, $side);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Like\r
- *\r
- * Called by like() or orlike()\r
- *\r
- * @access private\r
- * @param mixed\r
- * @param mixed\r
- * @param string\r
- * @return object\r
- */\r
- function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '')\r
- {\r
- if ( ! is_array($field))\r
- {\r
- $field = array($field => $match);\r
- }\r
- \r
- foreach ($field as $k => $v)\r
- {\r
- $k = $this->_protect_identifiers($k);\r
-\r
- $prefix = (count($this->ar_like) == 0) ? '' : $type;\r
-\r
- $v = $this->escape_str($v);\r
-\r
- if ($side == 'before')\r
- {\r
- $like_statement = $prefix." $k $not LIKE '%{$v}'";\r
- }\r
- elseif ($side == 'after')\r
- {\r
- $like_statement = $prefix." $k $not LIKE '{$v}%'";\r
- }\r
- else\r
- {\r
- $like_statement = $prefix." $k $not LIKE '%{$v}%'";\r
- }\r
- \r
- $this->ar_like[] = $like_statement;\r
- if ($this->ar_caching === TRUE)\r
- {\r
- $this->ar_cache_like[] = $like_statement;\r
- $this->ar_cache_exists[] = 'like';\r
- }\r
- \r
- }\r
- return $this;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * GROUP BY\r
- *\r
- * @access public\r
- * @param string\r
- * @return object\r
- */\r
- function group_by($by)\r
- {\r
- if (is_string($by))\r
- {\r
- $by = explode(',', $by);\r
- }\r
- \r
- foreach ($by as $val)\r
- {\r
- $val = trim($val);\r
- \r
- if ($val != '')\r
- {\r
- $this->ar_groupby[] = $this->_protect_identifiers($val);\r
- \r
- if ($this->ar_caching === TRUE)\r
- {\r
- $this->ar_cache_groupby[] = $this->_protect_identifiers($val);\r
- $this->ar_cache_exists[] = 'groupby';\r
- }\r
- }\r
- }\r
- return $this;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * groupby() is an alias of group_by()\r
- * this function is here for backwards compatibility, as\r
- * groupby() has been deprecated\r
- */\r
- function groupby($by)\r
- {\r
- return $this->group_by($by);\r
- } \r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Sets the HAVING value\r
- *\r
- * Separates multiple calls with AND\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return object\r
- */\r
- function having($key, $value = '', $escape = TRUE)\r
- {\r
- return $this->_having($key, $value, 'AND ', $escape);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * orhaving() is an alias of or_having()\r
- * this function is here for backwards compatibility, as\r
- * orhaving() has been deprecated\r
- */\r
-\r
- function orhaving($key, $value = '', $escape = TRUE)\r
- {\r
- return $this->or_having($key, $value, $escape);\r
- } \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Sets the OR HAVING value\r
- *\r
- * Separates multiple calls with OR\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return object\r
- */\r
- function or_having($key, $value = '', $escape = TRUE)\r
- {\r
- return $this->_having($key, $value, 'OR ', $escape);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Sets the HAVING values\r
- *\r
- * Called by having() or or_having()\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @return object\r
- */\r
- function _having($key, $value = '', $type = 'AND ', $escape = TRUE)\r
- {\r
- if ( ! is_array($key))\r
- {\r
- $key = array($key => $value);\r
- }\r
- \r
- foreach ($key as $k => $v)\r
- {\r
- $prefix = (count($this->ar_having) == 0) ? '' : $type;\r
-\r
- if ($escape === TRUE)\r
- {\r
- $k = $this->_protect_identifiers($k);\r
- }\r
-\r
- if ( ! $this->_has_operator($k))\r
- {\r
- $k .= ' = ';\r
- }\r
-\r
- if ($v != '')\r
- {\r
- $v = ' '.$this->escape_str($v);\r
- }\r
- \r
- $this->ar_having[] = $prefix.$k.$v;\r
- if ($this->ar_caching === TRUE)\r
- {\r
- $this->ar_cache_having[] = $prefix.$k.$v;\r
- $this->ar_cache_exists[] = 'having';\r
- }\r
- }\r
- \r
- return $this;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Sets the ORDER BY value\r
- *\r
- * @access public\r
- * @param string\r
- * @param string direction: asc or desc\r
- * @return object\r
- */\r
- function order_by($orderby, $direction = '')\r
- {\r
- if (strtolower($direction) == 'random')\r
- {\r
- $orderby = ''; // Random results want or don't need a field name\r
- $direction = $this->_random_keyword;\r
- }\r
- elseif (trim($direction) != '')\r
- {\r
- $direction = (in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE)) ? ' '.$direction : ' ASC';\r
- }\r
- \r
- $orderby_statement = $this->_protect_identifiers($orderby).$direction;\r
- \r
- $this->ar_orderby[] = $orderby_statement;\r
- if ($this->ar_caching === TRUE)\r
- {\r
- $this->ar_cache_orderby[] = $orderby_statement;\r
- $this->ar_cache_exists[] = 'orderby';\r
- }\r
-\r
- return $this;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * orderby() is an alias of order_by()\r
- * this function is here for backwards compatibility, as\r
- * orderby() has been deprecated\r
- */\r
- function orderby($orderby, $direction = '')\r
- {\r
- return $this->order_by($orderby, $direction);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Sets the LIMIT value\r
- *\r
- * @access public\r
- * @param integer the limit value\r
- * @param integer the offset value\r
- * @return object\r
- */\r
- function limit($value, $offset = '')\r
- {\r
- $this->ar_limit = $value;\r
-\r
- if ($offset != '')\r
- {\r
- $this->ar_offset = $offset;\r
- }\r
- \r
- return $this;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Sets the OFFSET value\r
- *\r
- * @access public\r
- * @param integer the offset value\r
- * @return object\r
- */\r
- function offset($offset)\r
- {\r
- $this->ar_offset = $offset;\r
- return $this;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The "set" function. Allows key/value pairs to be set for inserting or updating\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @param boolean\r
- * @return object\r
- */\r
- function set($key, $value = '', $escape = TRUE)\r
- {\r
- $key = $this->_object_to_array($key);\r
- \r
- if ( ! is_array($key))\r
- {\r
- $key = array($key => $value);\r
- } \r
-\r
- foreach ($key as $k => $v)\r
- {\r
- if ($escape === FALSE)\r
- {\r
- $this->ar_set[$this->_protect_identifiers($k)] = $v;\r
- }\r
- else\r
- {\r
- $this->ar_set[$this->_protect_identifiers($k)] = $this->escape($v);\r
- }\r
- }\r
- \r
- return $this;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get\r
- *\r
- * Compiles the select statement based on the other functions called\r
- * and runs the query\r
- *\r
- * @access public\r
- * @param string the table\r
- * @param string the limit clause\r
- * @param string the offset clause\r
- * @return object\r
- */\r
- function get($table = '', $limit = null, $offset = null)\r
- {\r
- if ($table != '')\r
- {\r
- $this->_track_aliases($table);\r
- $this->from($table);\r
- }\r
- \r
- if ( ! is_null($limit))\r
- {\r
- $this->limit($limit, $offset);\r
- }\r
- \r
- $sql = $this->_compile_select();\r
-\r
- $result = $this->query($sql);\r
- $this->_reset_select();\r
- return $result;\r
- }\r
-\r
- /**\r
- * "Count All Results" query\r
- *\r
- * Generates a platform-specific query string that counts all records \r
- * returned by an Active Record query.\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function count_all_results($table = '')\r
- {\r
- if ($table != '')\r
- {\r
- $this->_track_aliases($table);\r
- $this->from($table);\r
- }\r
- \r
- $sql = $this->_compile_select($this->_count_string . $this->_protect_identifiers('numrows'));\r
-\r
- $query = $this->query($sql);\r
- $this->_reset_select();\r
- \r
- if ($query->num_rows() == 0)\r
- {\r
- return '0';\r
- }\r
-\r
- $row = $query->row();\r
- return $row->numrows;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get_Where\r
- *\r
- * Allows the where clause, limit and offset to be added directly\r
- *\r
- * @access public\r
- * @param string the where clause\r
- * @param string the limit clause\r
- * @param string the offset clause\r
- * @return object\r
- */\r
- function get_where($table = '', $where = null, $limit = null, $offset = null)\r
- {\r
- if ($table != '')\r
- {\r
- $this->from($table);\r
- }\r
-\r
- if ( ! is_null($where))\r
- {\r
- $this->where($where);\r
- }\r
- \r
- if ( ! is_null($limit))\r
- {\r
- $this->limit($limit, $offset);\r
- }\r
- \r
- $sql = $this->_compile_select();\r
-\r
- $result = $this->query($sql);\r
- $this->_reset_select();\r
- return $result;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * getwhere() is an alias of get_where()\r
- * this function is here for backwards compatibility, as\r
- * getwhere() has been deprecated\r
- */\r
- function getwhere($table = '', $where = null, $limit = null, $offset = null)\r
- {\r
- return $this->get_where($table, $where, $limit, $offset);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Insert\r
- *\r
- * Compiles an insert string and runs the query\r
- *\r
- * @access public\r
- * @param string the table to retrieve the results from\r
- * @param array an associative array of insert values\r
- * @return object\r
- */\r
- function insert($table = '', $set = NULL)\r
- { \r
- if ( ! is_null($set))\r
- {\r
- $this->set($set);\r
- }\r
- \r
- if (count($this->ar_set) == 0)\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_must_use_set');\r
- }\r
- return FALSE;\r
- }\r
-\r
- if ($table == '')\r
- {\r
- if ( ! isset($this->ar_from[0]))\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_must_set_table');\r
- }\r
- return FALSE;\r
- }\r
- \r
- $table = $this->ar_from[0];\r
- }\r
-\r
- $sql = $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set));\r
- \r
- $this->_reset_write();\r
- return $this->query($sql); \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Update\r
- *\r
- * Compiles an update string and runs the query\r
- *\r
- * @access public\r
- * @param string the table to retrieve the results from\r
- * @param array an associative array of update values\r
- * @param mixed the where clause\r
- * @return object\r
- */\r
- function update($table = '', $set = NULL, $where = NULL, $limit = NULL)\r
- {\r
- // Combine any cached components with the current statements\r
- $this->_merge_cache();\r
-\r
- if ( ! is_null($set))\r
- {\r
- $this->set($set);\r
- }\r
- \r
- if (count($this->ar_set) == 0)\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_must_use_set');\r
- }\r
- return FALSE;\r
- }\r
-\r
- if ($table == '')\r
- {\r
- if ( ! isset($this->ar_from[0]))\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_must_set_table');\r
- }\r
- return FALSE;\r
- }\r
- \r
- $table = $this->ar_from[0];\r
- }\r
- \r
- if ($where != NULL)\r
- {\r
- $this->where($where);\r
- }\r
-\r
- if ($limit != NULL)\r
- {\r
- $this->limit($limit);\r
- }\r
- \r
- $sql = $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit);\r
- \r
- $this->_reset_write();\r
- return $this->query($sql);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Empty Table\r
- *\r
- * Compiles a delete string and runs "DELETE FROM table"\r
- *\r
- * @access public\r
- * @param string the table to empty\r
- * @return object\r
- */\r
- function empty_table($table = '')\r
- {\r
- if ($table == '')\r
- {\r
- if ( ! isset($this->ar_from[0]))\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_must_set_table');\r
- }\r
- return FALSE;\r
- }\r
-\r
- $table = $this->ar_from[0];\r
- }\r
- else\r
- {\r
- $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);\r
- }\r
-\r
- $sql = $this->_delete($table);\r
-\r
- $this->_reset_write();\r
- \r
- return $this->query($sql);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Truncate\r
- *\r
- * Compiles a truncate string and runs the query\r
- * If the database does not support the truncate() command\r
- * This function maps to "DELETE FROM table"\r
- *\r
- * @access public\r
- * @param string the table to truncate\r
- * @return object\r
- */\r
- function truncate($table = '')\r
- {\r
- if ($table == '')\r
- {\r
- if ( ! isset($this->ar_from[0]))\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_must_set_table');\r
- }\r
- return FALSE;\r
- }\r
-\r
- $table = $this->ar_from[0];\r
- }\r
- else\r
- {\r
- $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);\r
- }\r
-\r
- $sql = $this->_truncate($table);\r
-\r
- $this->_reset_write();\r
- \r
- return $this->query($sql);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete\r
- *\r
- * Compiles a delete string and runs the query\r
- *\r
- * @access public\r
- * @param mixed the table(s) to delete from. String or array\r
- * @param mixed the where clause\r
- * @param mixed the limit clause\r
- * @param boolean\r
- * @return object\r
- */\r
- function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE)\r
- {\r
- // Combine any cached components with the current statements\r
- $this->_merge_cache();\r
-\r
- if ($table == '')\r
- {\r
- if ( ! isset($this->ar_from[0]))\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_must_set_table');\r
- }\r
- return FALSE;\r
- }\r
-\r
- $table = $this->ar_from[0];\r
- }\r
- elseif (is_array($table))\r
- {\r
- foreach($table as $single_table)\r
- {\r
- $this->delete($single_table, $where, $limit, FALSE);\r
- }\r
-\r
- $this->_reset_write();\r
- return;\r
- }\r
- else\r
- {\r
- $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);\r
- }\r
-\r
- if ($where != '')\r
- {\r
- $this->where($where);\r
- }\r
-\r
- if ($limit != NULL)\r
- {\r
- $this->limit($limit);\r
- }\r
-\r
- if (count($this->ar_where) == 0 && count($this->ar_like) == 0)\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_del_must_use_where');\r
- }\r
-\r
- return FALSE;\r
- } \r
-\r
- $sql = $this->_delete($table, $this->ar_where, $this->ar_like, $this->ar_limit);\r
-\r
- if ($reset_data)\r
- {\r
- $this->_reset_write();\r
- }\r
- \r
- return $this->query($sql);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * DB Prefix\r
- *\r
- * Prepends a database prefix if one exists in configuration\r
- *\r
- * @access public\r
- * @param string the table\r
- * @return string\r
- */\r
- function dbprefix($table = '')\r
- {\r
- if ($table == '')\r
- {\r
- $this->display_error('db_table_name_required');\r
- }\r
-\r
- return $this->dbprefix.$table;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Track Aliases\r
- *\r
- * Used to track SQL statements written with aliased tables.\r
- *\r
- * @access private\r
- * @param string The table to inspect\r
- * @return string\r
- */ \r
- function _track_aliases($table)\r
- {\r
- if (is_array($table))\r
- {\r
- foreach ($table as $t)\r
- {\r
- $this->_track_aliases($t);\r
- }\r
- return;\r
- }\r
- \r
- // Does the string contain a comma? If so, we need to separate\r
- // the string into discreet statements\r
- if (strpos($table, ',') !== FALSE)\r
- {\r
- return $this->_track_aliases(explode(',', $table));\r
- }\r
- \r
- // if a table alias is used we can recognize it by a space\r
- if (strpos($table, " ") !== FALSE)\r
- {\r
- // if the alias is written with the AS keyword, remove it\r
- $table = preg_replace('/ AS /i', ' ', $table);\r
- \r
- // Grab the alias\r
- $table = trim(strrchr($table, " "));\r
- \r
- // Store the alias, if it doesn't already exist\r
- if ( ! in_array($table, $this->ar_aliased_tables))\r
- {\r
- $this->ar_aliased_tables[] = $table;\r
- }\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Compile the SELECT statement\r
- *\r
- * Generates a query string based on which functions were used.\r
- * Should not be called directly. The get() function calls it.\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _compile_select($select_override = FALSE)\r
- {\r
- // Combine any cached components with the current statements\r
- $this->_merge_cache();\r
-\r
- // ----------------------------------------------------------------\r
- \r
- // Write the "select" portion of the query\r
-\r
- if ($select_override !== FALSE)\r
- {\r
- $sql = $select_override;\r
- }\r
- else\r
- {\r
- $sql = ( ! $this->ar_distinct) ? 'SELECT ' : 'SELECT DISTINCT ';\r
- \r
- if (count($this->ar_select) == 0)\r
- {\r
- $sql .= '*'; \r
- }\r
- else\r
- { \r
- // Cycle through the "select" portion of the query and prep each column name.\r
- // The reason we protect identifiers here rather then in the select() function\r
- // is because until the user calls the from() function we don't know if there are aliases\r
- foreach ($this->ar_select as $key => $val)\r
- {\r
- $this->ar_select[$key] = $this->_protect_identifiers($val);\r
- }\r
- \r
- $sql .= implode(', ', $this->ar_select);\r
- }\r
- }\r
-\r
- // ----------------------------------------------------------------\r
- \r
- // Write the "FROM" portion of the query\r
-\r
- if (count($this->ar_from) > 0)\r
- {\r
- $sql .= "\nFROM ";\r
-\r
- $sql .= $this->_from_tables($this->ar_from);\r
- }\r
-\r
- // ----------------------------------------------------------------\r
- \r
- // Write the "JOIN" portion of the query\r
-\r
- if (count($this->ar_join) > 0)\r
- {\r
- $sql .= "\n";\r
-\r
- $sql .= implode("\n", $this->ar_join);\r
- }\r
-\r
- // ----------------------------------------------------------------\r
- \r
- // Write the "WHERE" portion of the query\r
-\r
- if (count($this->ar_where) > 0 OR count($this->ar_like) > 0)\r
- {\r
- $sql .= "\n";\r
-\r
- $sql .= "WHERE ";\r
- }\r
-\r
- $sql .= implode("\n", $this->ar_where);\r
-\r
- // ----------------------------------------------------------------\r
- \r
- // Write the "LIKE" portion of the query\r
- \r
- if (count($this->ar_like) > 0)\r
- {\r
- if (count($this->ar_where) > 0)\r
- {\r
- $sql .= "\nAND ";\r
- }\r
-\r
- $sql .= implode("\n", $this->ar_like);\r
- }\r
-\r
- // ----------------------------------------------------------------\r
- \r
- // Write the "GROUP BY" portion of the query\r
- \r
- if (count($this->ar_groupby) > 0)\r
- {\r
- $sql .= "\nGROUP BY ";\r
- \r
- $sql .= implode(', ', $this->ar_groupby);\r
- }\r
-\r
- // ----------------------------------------------------------------\r
- \r
- // Write the "HAVING" portion of the query\r
- \r
- if (count($this->ar_having) > 0)\r
- {\r
- $sql .= "\nHAVING ";\r
- $sql .= implode("\n", $this->ar_having);\r
- }\r
-\r
- // ----------------------------------------------------------------\r
- \r
- // Write the "ORDER BY" portion of the query\r
-\r
- if (count($this->ar_orderby) > 0)\r
- {\r
- $sql .= "\nORDER BY ";\r
- $sql .= implode(', ', $this->ar_orderby);\r
- \r
- if ($this->ar_order !== FALSE)\r
- {\r
- $sql .= ($this->ar_order == 'desc') ? ' DESC' : ' ASC';\r
- } \r
- }\r
-\r
- // ----------------------------------------------------------------\r
- \r
- // Write the "LIMIT" portion of the query\r
- \r
- if (is_numeric($this->ar_limit))\r
- {\r
- $sql .= "\n";\r
- $sql = $this->_limit($sql, $this->ar_limit, $this->ar_offset);\r
- }\r
-\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Object to Array\r
- *\r
- * Takes an object as input and converts the class variables to array key/vals\r
- *\r
- * @access public\r
- * @param object\r
- * @return array\r
- */\r
- function _object_to_array($object)\r
- {\r
- if ( ! is_object($object))\r
- {\r
- return $object;\r
- }\r
- \r
- $array = array();\r
- foreach (get_object_vars($object) as $key => $val)\r
- {\r
- // There are some built in keys we need to ignore for this conversion\r
- if ( ! is_object($val) && ! is_array($val) && $key != '_parent_name' && $key != '_ci_scaffolding' && $key != '_ci_scaff_table')\r
- {\r
- $array[$key] = $val;\r
- }\r
- }\r
- \r
- return $array;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Start Cache\r
- *\r
- * Starts AR caching\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function start_cache()\r
- {\r
- $this->ar_caching = TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Stop Cache\r
- *\r
- * Stops AR caching\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function stop_cache()\r
- {\r
- $this->ar_caching = FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Flush Cache\r
- *\r
- * Empties the AR cache\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function flush_cache()\r
- { \r
- $this->_reset_run(\r
- array(\r
- 'ar_cache_select' => array(), \r
- 'ar_cache_from' => array(), \r
- 'ar_cache_join' => array(),\r
- 'ar_cache_where' => array(), \r
- 'ar_cache_like' => array(), \r
- 'ar_cache_groupby' => array(), \r
- 'ar_cache_having' => array(), \r
- 'ar_cache_orderby' => array(), \r
- 'ar_cache_set' => array(),\r
- 'ar_cache_exists' => array()\r
- )\r
- ); \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Merge Cache\r
- *\r
- * When called, this function merges any cached AR arrays with \r
- * locally called ones.\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _merge_cache()\r
- {\r
- if (count($this->ar_cache_exists) == 0)\r
- {\r
- return;\r
- }\r
-\r
- foreach ($this->ar_cache_exists as $val)\r
- {\r
- $ar_variable = 'ar_'.$val;\r
- $ar_cache_var = 'ar_cache_'.$val;\r
-\r
- if (count($this->$ar_cache_var) == 0)\r
- {\r
- continue;\r
- }\r
-\r
- $this->$ar_variable = array_unique(array_merge($this->$ar_cache_var, $this->$ar_variable));\r
- }\r
-\r
- // If we are "protecting identifiers" we need to examine the "from"\r
- // portion of the query to determine if there are any aliases\r
- if ($this->_protect_identifiers === TRUE AND count($this->ar_cache_from) > 0)\r
- {\r
- $this->_track_aliases($this->ar_from);\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Resets the active record values. Called by the get() function\r
- *\r
- * @access private\r
- * @param array An array of fields to reset\r
- * @return void\r
- */\r
- function _reset_run($ar_reset_items)\r
- {\r
- foreach ($ar_reset_items as $item => $default_value)\r
- {\r
- if ( ! in_array($item, $this->ar_store_array))\r
- {\r
- $this->$item = $default_value;\r
- }\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Resets the active record values. Called by the get() function\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _reset_select()\r
- {\r
- $ar_reset_items = array(\r
- 'ar_select' => array(), \r
- 'ar_from' => array(), \r
- 'ar_join' => array(), \r
- 'ar_where' => array(), \r
- 'ar_like' => array(), \r
- 'ar_groupby' => array(), \r
- 'ar_having' => array(), \r
- 'ar_orderby' => array(), \r
- 'ar_wherein' => array(), \r
- 'ar_aliased_tables' => array(),\r
- 'ar_distinct' => FALSE, \r
- 'ar_limit' => FALSE, \r
- 'ar_offset' => FALSE, \r
- 'ar_order' => FALSE,\r
- );\r
- \r
- $this->_reset_run($ar_reset_items);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Resets the active record "write" values.\r
- *\r
- * Called by the insert() update() and delete() functions\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _reset_write()\r
- { \r
- $ar_reset_items = array(\r
- 'ar_set' => array(), \r
- 'ar_from' => array(), \r
- 'ar_where' => array(), \r
- 'ar_like' => array(),\r
- 'ar_orderby' => array(), \r
- 'ar_limit' => FALSE, \r
- 'ar_order' => FALSE\r
- );\r
-\r
- $this->_reset_run($ar_reset_items);\r
- }\r
- \r
-}\r
-\r
-/* End of file DB_active_rec.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Active Record Class
+ *
+ * This is the platform-independent base Active Record implementation class.
+ *
+ * @package CodeIgniter
+ * @subpackage Drivers
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_active_record extends CI_DB_driver {
+
+ var $ar_select = array();
+ var $ar_distinct = FALSE;
+ var $ar_from = array();
+ var $ar_join = array();
+ var $ar_where = array();
+ var $ar_like = array();
+ var $ar_groupby = array();
+ var $ar_having = array();
+ var $ar_limit = FALSE;
+ var $ar_offset = FALSE;
+ var $ar_order = FALSE;
+ var $ar_orderby = array();
+ var $ar_set = array();
+ var $ar_wherein = array();
+ var $ar_aliased_tables = array();
+ var $ar_store_array = array();
+
+ // Active Record Caching variables
+ var $ar_caching = FALSE;
+ var $ar_cache_exists = array();
+ var $ar_cache_select = array();
+ var $ar_cache_from = array();
+ var $ar_cache_join = array();
+ var $ar_cache_where = array();
+ var $ar_cache_like = array();
+ var $ar_cache_groupby = array();
+ var $ar_cache_having = array();
+ var $ar_cache_orderby = array();
+ var $ar_cache_set = array();
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select
+ *
+ * Generates the SELECT portion of the query
+ *
+ * @access public
+ * @param string
+ * @return object
+ */
+ function select($select = '*', $escape = NULL)
+ {
+ // Set the global value if this was sepecified
+ if (is_bool($escape))
+ {
+ $this->_protect_identifiers = $escape;
+ }
+
+ if (is_string($select))
+ {
+ $select = explode(',', $select);
+ }
+
+ foreach ($select as $val)
+ {
+ $val = trim($val);
+
+ if ($val != '')
+ {
+ $this->ar_select[] = $val;
+
+ if ($this->ar_caching === TRUE)
+ {
+ $this->ar_cache_select[] = $val;
+ $this->ar_cache_exists[] = 'select';
+ }
+ }
+ }
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select Max
+ *
+ * Generates a SELECT MAX(field) portion of a query
+ *
+ * @access public
+ * @param string the field
+ * @param string an alias
+ * @return object
+ */
+ function select_max($select = '', $alias = '')
+ {
+ return $this->_max_min_avg_sum($select, $alias, 'MAX');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select Min
+ *
+ * Generates a SELECT MIN(field) portion of a query
+ *
+ * @access public
+ * @param string the field
+ * @param string an alias
+ * @return object
+ */
+ function select_min($select = '', $alias = '')
+ {
+ return $this->_max_min_avg_sum($select, $alias, 'MIN');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select Average
+ *
+ * Generates a SELECT AVG(field) portion of a query
+ *
+ * @access public
+ * @param string the field
+ * @param string an alias
+ * @return object
+ */
+ function select_avg($select = '', $alias = '')
+ {
+ return $this->_max_min_avg_sum($select, $alias, 'AVG');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select Sum
+ *
+ * Generates a SELECT SUM(field) portion of a query
+ *
+ * @access public
+ * @param string the field
+ * @param string an alias
+ * @return object
+ */
+ function select_sum($select = '', $alias = '')
+ {
+ return $this->_max_min_avg_sum($select, $alias, 'SUM');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Processing Function for the four functions above:
+ *
+ * select_max()
+ * select_min()
+ * select_avg()
+ * select_sum()
+ *
+ * @access public
+ * @param string the field
+ * @param string an alias
+ * @return object
+ */
+ function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX')
+ {
+ if ( ! is_string($select) OR $select == '')
+ {
+ $this->display_error('db_invalid_query');
+ }
+
+ $type = strtoupper($type);
+
+ if ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM')))
+ {
+ show_error('Invalid function type: '.$type);
+ }
+
+ if ($alias == '')
+ {
+ $alias = $this->_create_alias_from_table(trim($select));
+ }
+
+ $sql = $type.'('.$this->_protect_identifiers(trim($select)).') AS '.$alias;
+
+ $this->ar_select[] = $sql;
+
+ if ($this->ar_caching === TRUE)
+ {
+ $this->ar_cache_select[] = $sql;
+ $this->ar_cache_exists[] = 'select';
+ }
+
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Determines the alias name based on the table
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _create_alias_from_table($item)
+ {
+ if (strpos($item, '.') !== FALSE)
+ {
+ return end(explode('.', $item));
+ }
+
+ return $item;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * DISTINCT
+ *
+ * Sets a flag which tells the query string compiler to add DISTINCT
+ *
+ * @access public
+ * @param bool
+ * @return object
+ */
+ function distinct($val = TRUE)
+ {
+ $this->ar_distinct = (is_bool($val)) ? $val : TRUE;
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * From
+ *
+ * Generates the FROM portion of the query
+ *
+ * @access public
+ * @param mixed can be a string or array
+ * @return object
+ */
+ function from($from)
+ {
+ foreach ((array)$from as $val)
+ {
+ // Extract any aliases that might exist. We use this information
+ // in the _protect_identifiers to know whether to add a table prefix
+ $this->_track_aliases($val);
+
+ $this->ar_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE);
+
+ if ($this->ar_caching === TRUE)
+ {
+ $this->ar_cache_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE);
+ $this->ar_cache_exists[] = 'from';
+ }
+ }
+
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Join
+ *
+ * Generates the JOIN portion of the query
+ *
+ * @access public
+ * @param string
+ * @param string the join condition
+ * @param string the type of join
+ * @return object
+ */
+ function join($table, $cond, $type = '')
+ {
+ if ($type != '')
+ {
+ $type = strtoupper(trim($type));
+
+ if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER')))
+ {
+ $type = '';
+ }
+ else
+ {
+ $type .= ' ';
+ }
+ }
+
+ // Extract any aliases that might exist. We use this information
+ // in the _protect_identifiers to know whether to add a table prefix
+ $this->_track_aliases($table);
+
+ // Strip apart the condition and protect the identifiers
+ if (preg_match('/([\w\.]+)([\W\s]+)(.+)/', $cond, $match))
+ {
+ $match[1] = $this->_protect_identifiers($match[1]);
+ $match[3] = $this->_protect_identifiers($match[3]);
+
+ $cond = $match[1].$match[2].$match[3];
+ }
+
+ // Assemble the JOIN statement
+ $join = $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond;
+
+ $this->ar_join[] = $join;
+ if ($this->ar_caching === TRUE)
+ {
+ $this->ar_cache_join[] = $join;
+ $this->ar_cache_exists[] = 'join';
+ }
+
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Where
+ *
+ * Generates the WHERE portion of the query. Separates
+ * multiple calls with AND
+ *
+ * @access public
+ * @param mixed
+ * @param mixed
+ * @return object
+ */
+ function where($key, $value = NULL, $escape = TRUE)
+ {
+ return $this->_where($key, $value, 'AND ', $escape);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * OR Where
+ *
+ * Generates the WHERE portion of the query. Separates
+ * multiple calls with OR
+ *
+ * @access public
+ * @param mixed
+ * @param mixed
+ * @return object
+ */
+ function or_where($key, $value = NULL, $escape = TRUE)
+ {
+ return $this->_where($key, $value, 'OR ', $escape);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * orwhere() is an alias of or_where()
+ * this function is here for backwards compatibility, as
+ * orwhere() has been deprecated
+ */
+ function orwhere($key, $value = NULL, $escape = TRUE)
+ {
+ return $this->or_where($key, $value, $escape);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Where
+ *
+ * Called by where() or orwhere()
+ *
+ * @access private
+ * @param mixed
+ * @param mixed
+ * @param string
+ * @return object
+ */
+ function _where($key, $value = NULL, $type = 'AND ', $escape = NULL)
+ {
+ if ( ! is_array($key))
+ {
+ $key = array($key => $value);
+ }
+
+ // If the escape value was not set will will base it on the global setting
+ if ( ! is_bool($escape))
+ {
+ $escape = $this->_protect_identifiers;
+ }
+
+ foreach ($key as $k => $v)
+ {
+ $prefix = (count($this->ar_where) == 0 AND count($this->ar_cache_where) == 0) ? '' : $type;
+
+ if (is_null($v) && ! $this->_has_operator($k))
+ {
+ // value appears not to have been set, assign the test to IS NULL
+ $k .= ' IS NULL';
+ }
+
+ if ( ! is_null($v))
+ {
+ if ($escape === TRUE)
+ {
+ $k = $this->_protect_identifiers($k, FALSE, $escape);
+
+ $v = ' '.$this->escape($v);
+ }
+
+ if ( ! $this->_has_operator($k))
+ {
+ $k .= ' =';
+ }
+ }
+ else
+ {
+ $k = $this->_protect_identifiers($k, FALSE, $escape);
+ }
+
+ $this->ar_where[] = $prefix.$k.$v;
+
+ if ($this->ar_caching === TRUE)
+ {
+ $this->ar_cache_where[] = $prefix.$k.$v;
+ $this->ar_cache_exists[] = 'where';
+ }
+
+ }
+
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Where_in
+ *
+ * Generates a WHERE field IN ('item', 'item') SQL query joined with
+ * AND if appropriate
+ *
+ * @access public
+ * @param string The field to search
+ * @param array The values searched on
+ * @return object
+ */
+ function where_in($key = NULL, $values = NULL)
+ {
+ return $this->_where_in($key, $values);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Where_in_or
+ *
+ * Generates a WHERE field IN ('item', 'item') SQL query joined with
+ * OR if appropriate
+ *
+ * @access public
+ * @param string The field to search
+ * @param array The values searched on
+ * @return object
+ */
+ function or_where_in($key = NULL, $values = NULL)
+ {
+ return $this->_where_in($key, $values, FALSE, 'OR ');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Where_not_in
+ *
+ * Generates a WHERE field NOT IN ('item', 'item') SQL query joined
+ * with AND if appropriate
+ *
+ * @access public
+ * @param string The field to search
+ * @param array The values searched on
+ * @return object
+ */
+ function where_not_in($key = NULL, $values = NULL)
+ {
+ return $this->_where_in($key, $values, TRUE);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Where_not_in_or
+ *
+ * Generates a WHERE field NOT IN ('item', 'item') SQL query joined
+ * with OR if appropriate
+ *
+ * @access public
+ * @param string The field to search
+ * @param array The values searched on
+ * @return object
+ */
+ function or_where_not_in($key = NULL, $values = NULL)
+ {
+ return $this->_where_in($key, $values, TRUE, 'OR ');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Where_in
+ *
+ * Called by where_in, where_in_or, where_not_in, where_not_in_or
+ *
+ * @access public
+ * @param string The field to search
+ * @param array The values searched on
+ * @param boolean If the statement would be IN or NOT IN
+ * @param string
+ * @return object
+ */
+ function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ')
+ {
+ if ($key === NULL OR $values === NULL)
+ {
+ return;
+ }
+
+ if ( ! is_array($values))
+ {
+ $values = array($values);
+ }
+
+ $not = ($not) ? ' NOT' : '';
+
+ foreach ($values as $value)
+ {
+ $this->ar_wherein[] = $this->escape($value);
+ }
+
+ $prefix = (count($this->ar_where) == 0) ? '' : $type;
+
+ $where_in = $prefix . $this->_protect_identifiers($key) . $not . " IN (" . implode(", ", $this->ar_wherein) . ") ";
+
+ $this->ar_where[] = $where_in;
+ if ($this->ar_caching === TRUE)
+ {
+ $this->ar_cache_where[] = $where_in;
+ $this->ar_cache_exists[] = 'where';
+ }
+
+ // reset the array for multiple calls
+ $this->ar_wherein = array();
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Like
+ *
+ * Generates a %LIKE% portion of the query. Separates
+ * multiple calls with AND
+ *
+ * @access public
+ * @param mixed
+ * @param mixed
+ * @return object
+ */
+ function like($field, $match = '', $side = 'both')
+ {
+ return $this->_like($field, $match, 'AND ', $side);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Not Like
+ *
+ * Generates a NOT LIKE portion of the query. Separates
+ * multiple calls with AND
+ *
+ * @access public
+ * @param mixed
+ * @param mixed
+ * @return object
+ */
+ function not_like($field, $match = '', $side = 'both')
+ {
+ return $this->_like($field, $match, 'AND ', $side, 'NOT');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * OR Like
+ *
+ * Generates a %LIKE% portion of the query. Separates
+ * multiple calls with OR
+ *
+ * @access public
+ * @param mixed
+ * @param mixed
+ * @return object
+ */
+ function or_like($field, $match = '', $side = 'both')
+ {
+ return $this->_like($field, $match, 'OR ', $side);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * OR Not Like
+ *
+ * Generates a NOT LIKE portion of the query. Separates
+ * multiple calls with OR
+ *
+ * @access public
+ * @param mixed
+ * @param mixed
+ * @return object
+ */
+ function or_not_like($field, $match = '', $side = 'both')
+ {
+ return $this->_like($field, $match, 'OR ', $side, 'NOT');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * orlike() is an alias of or_like()
+ * this function is here for backwards compatibility, as
+ * orlike() has been deprecated
+ */
+ function orlike($field, $match = '', $side = 'both')
+ {
+ return $this->or_like($field, $match, $side);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Like
+ *
+ * Called by like() or orlike()
+ *
+ * @access private
+ * @param mixed
+ * @param mixed
+ * @param string
+ * @return object
+ */
+ function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '')
+ {
+ if ( ! is_array($field))
+ {
+ $field = array($field => $match);
+ }
+
+ foreach ($field as $k => $v)
+ {
+ $k = $this->_protect_identifiers($k);
+
+ $prefix = (count($this->ar_like) == 0) ? '' : $type;
+
+ $v = $this->escape_str($v);
+
+ if ($side == 'before')
+ {
+ $like_statement = $prefix." $k $not LIKE '%{$v}'";
+ }
+ elseif ($side == 'after')
+ {
+ $like_statement = $prefix." $k $not LIKE '{$v}%'";
+ }
+ else
+ {
+ $like_statement = $prefix." $k $not LIKE '%{$v}%'";
+ }
+
+ $this->ar_like[] = $like_statement;
+ if ($this->ar_caching === TRUE)
+ {
+ $this->ar_cache_like[] = $like_statement;
+ $this->ar_cache_exists[] = 'like';
+ }
+
+ }
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * GROUP BY
+ *
+ * @access public
+ * @param string
+ * @return object
+ */
+ function group_by($by)
+ {
+ if (is_string($by))
+ {
+ $by = explode(',', $by);
+ }
+
+ foreach ($by as $val)
+ {
+ $val = trim($val);
+
+ if ($val != '')
+ {
+ $this->ar_groupby[] = $this->_protect_identifiers($val);
+
+ if ($this->ar_caching === TRUE)
+ {
+ $this->ar_cache_groupby[] = $this->_protect_identifiers($val);
+ $this->ar_cache_exists[] = 'groupby';
+ }
+ }
+ }
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * groupby() is an alias of group_by()
+ * this function is here for backwards compatibility, as
+ * groupby() has been deprecated
+ */
+ function groupby($by)
+ {
+ return $this->group_by($by);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Sets the HAVING value
+ *
+ * Separates multiple calls with AND
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return object
+ */
+ function having($key, $value = '', $escape = TRUE)
+ {
+ return $this->_having($key, $value, 'AND ', $escape);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * orhaving() is an alias of or_having()
+ * this function is here for backwards compatibility, as
+ * orhaving() has been deprecated
+ */
+
+ function orhaving($key, $value = '', $escape = TRUE)
+ {
+ return $this->or_having($key, $value, $escape);
+ }
+ // --------------------------------------------------------------------
+
+ /**
+ * Sets the OR HAVING value
+ *
+ * Separates multiple calls with OR
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return object
+ */
+ function or_having($key, $value = '', $escape = TRUE)
+ {
+ return $this->_having($key, $value, 'OR ', $escape);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Sets the HAVING values
+ *
+ * Called by having() or or_having()
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @return object
+ */
+ function _having($key, $value = '', $type = 'AND ', $escape = TRUE)
+ {
+ if ( ! is_array($key))
+ {
+ $key = array($key => $value);
+ }
+
+ foreach ($key as $k => $v)
+ {
+ $prefix = (count($this->ar_having) == 0) ? '' : $type;
+
+ if ($escape === TRUE)
+ {
+ $k = $this->_protect_identifiers($k);
+ }
+
+ if ( ! $this->_has_operator($k))
+ {
+ $k .= ' = ';
+ }
+
+ if ($v != '')
+ {
+ $v = ' '.$this->escape_str($v);
+ }
+
+ $this->ar_having[] = $prefix.$k.$v;
+ if ($this->ar_caching === TRUE)
+ {
+ $this->ar_cache_having[] = $prefix.$k.$v;
+ $this->ar_cache_exists[] = 'having';
+ }
+ }
+
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Sets the ORDER BY value
+ *
+ * @access public
+ * @param string
+ * @param string direction: asc or desc
+ * @return object
+ */
+ function order_by($orderby, $direction = '')
+ {
+ if (strtolower($direction) == 'random')
+ {
+ $orderby = ''; // Random results want or don't need a field name
+ $direction = $this->_random_keyword;
+ }
+ elseif (trim($direction) != '')
+ {
+ $direction = (in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE)) ? ' '.$direction : ' ASC';
+ }
+
+ $orderby_statement = $this->_protect_identifiers($orderby).$direction;
+
+ $this->ar_orderby[] = $orderby_statement;
+ if ($this->ar_caching === TRUE)
+ {
+ $this->ar_cache_orderby[] = $orderby_statement;
+ $this->ar_cache_exists[] = 'orderby';
+ }
+
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * orderby() is an alias of order_by()
+ * this function is here for backwards compatibility, as
+ * orderby() has been deprecated
+ */
+ function orderby($orderby, $direction = '')
+ {
+ return $this->order_by($orderby, $direction);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Sets the LIMIT value
+ *
+ * @access public
+ * @param integer the limit value
+ * @param integer the offset value
+ * @return object
+ */
+ function limit($value, $offset = '')
+ {
+ $this->ar_limit = $value;
+
+ if ($offset != '')
+ {
+ $this->ar_offset = $offset;
+ }
+
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Sets the OFFSET value
+ *
+ * @access public
+ * @param integer the offset value
+ * @return object
+ */
+ function offset($offset)
+ {
+ $this->ar_offset = $offset;
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The "set" function. Allows key/value pairs to be set for inserting or updating
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @param boolean
+ * @return object
+ */
+ function set($key, $value = '', $escape = TRUE)
+ {
+ $key = $this->_object_to_array($key);
+
+ if ( ! is_array($key))
+ {
+ $key = array($key => $value);
+ }
+
+ foreach ($key as $k => $v)
+ {
+ if ($escape === FALSE)
+ {
+ $this->ar_set[$this->_protect_identifiers($k)] = $v;
+ }
+ else
+ {
+ $this->ar_set[$this->_protect_identifiers($k)] = $this->escape($v);
+ }
+ }
+
+ return $this;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get
+ *
+ * Compiles the select statement based on the other functions called
+ * and runs the query
+ *
+ * @access public
+ * @param string the table
+ * @param string the limit clause
+ * @param string the offset clause
+ * @return object
+ */
+ function get($table = '', $limit = null, $offset = null)
+ {
+ if ($table != '')
+ {
+ $this->_track_aliases($table);
+ $this->from($table);
+ }
+
+ if ( ! is_null($limit))
+ {
+ $this->limit($limit, $offset);
+ }
+
+ $sql = $this->_compile_select();
+
+ $result = $this->query($sql);
+ $this->_reset_select();
+ return $result;
+ }
+
+ /**
+ * "Count All Results" query
+ *
+ * Generates a platform-specific query string that counts all records
+ * returned by an Active Record query.
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function count_all_results($table = '')
+ {
+ if ($table != '')
+ {
+ $this->_track_aliases($table);
+ $this->from($table);
+ }
+
+ $sql = $this->_compile_select($this->_count_string . $this->_protect_identifiers('numrows'));
+
+ $query = $this->query($sql);
+ $this->_reset_select();
+
+ if ($query->num_rows() == 0)
+ {
+ return '0';
+ }
+
+ $row = $query->row();
+ return $row->numrows;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get_Where
+ *
+ * Allows the where clause, limit and offset to be added directly
+ *
+ * @access public
+ * @param string the where clause
+ * @param string the limit clause
+ * @param string the offset clause
+ * @return object
+ */
+ function get_where($table = '', $where = null, $limit = null, $offset = null)
+ {
+ if ($table != '')
+ {
+ $this->from($table);
+ }
+
+ if ( ! is_null($where))
+ {
+ $this->where($where);
+ }
+
+ if ( ! is_null($limit))
+ {
+ $this->limit($limit, $offset);
+ }
+
+ $sql = $this->_compile_select();
+
+ $result = $this->query($sql);
+ $this->_reset_select();
+ return $result;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * getwhere() is an alias of get_where()
+ * this function is here for backwards compatibility, as
+ * getwhere() has been deprecated
+ */
+ function getwhere($table = '', $where = null, $limit = null, $offset = null)
+ {
+ return $this->get_where($table, $where, $limit, $offset);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert
+ *
+ * Compiles an insert string and runs the query
+ *
+ * @access public
+ * @param string the table to retrieve the results from
+ * @param array an associative array of insert values
+ * @return object
+ */
+ function insert($table = '', $set = NULL)
+ {
+ if ( ! is_null($set))
+ {
+ $this->set($set);
+ }
+
+ if (count($this->ar_set) == 0)
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_must_use_set');
+ }
+ return FALSE;
+ }
+
+ if ($table == '')
+ {
+ if ( ! isset($this->ar_from[0]))
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_must_set_table');
+ }
+ return FALSE;
+ }
+
+ $table = $this->ar_from[0];
+ }
+
+ $sql = $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set));
+
+ $this->_reset_write();
+ return $this->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Update
+ *
+ * Compiles an update string and runs the query
+ *
+ * @access public
+ * @param string the table to retrieve the results from
+ * @param array an associative array of update values
+ * @param mixed the where clause
+ * @return object
+ */
+ function update($table = '', $set = NULL, $where = NULL, $limit = NULL)
+ {
+ // Combine any cached components with the current statements
+ $this->_merge_cache();
+
+ if ( ! is_null($set))
+ {
+ $this->set($set);
+ }
+
+ if (count($this->ar_set) == 0)
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_must_use_set');
+ }
+ return FALSE;
+ }
+
+ if ($table == '')
+ {
+ if ( ! isset($this->ar_from[0]))
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_must_set_table');
+ }
+ return FALSE;
+ }
+
+ $table = $this->ar_from[0];
+ }
+
+ if ($where != NULL)
+ {
+ $this->where($where);
+ }
+
+ if ($limit != NULL)
+ {
+ $this->limit($limit);
+ }
+
+ $sql = $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit);
+
+ $this->_reset_write();
+ return $this->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Empty Table
+ *
+ * Compiles a delete string and runs "DELETE FROM table"
+ *
+ * @access public
+ * @param string the table to empty
+ * @return object
+ */
+ function empty_table($table = '')
+ {
+ if ($table == '')
+ {
+ if ( ! isset($this->ar_from[0]))
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_must_set_table');
+ }
+ return FALSE;
+ }
+
+ $table = $this->ar_from[0];
+ }
+ else
+ {
+ $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);
+ }
+
+ $sql = $this->_delete($table);
+
+ $this->_reset_write();
+
+ return $this->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Truncate
+ *
+ * Compiles a truncate string and runs the query
+ * If the database does not support the truncate() command
+ * This function maps to "DELETE FROM table"
+ *
+ * @access public
+ * @param string the table to truncate
+ * @return object
+ */
+ function truncate($table = '')
+ {
+ if ($table == '')
+ {
+ if ( ! isset($this->ar_from[0]))
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_must_set_table');
+ }
+ return FALSE;
+ }
+
+ $table = $this->ar_from[0];
+ }
+ else
+ {
+ $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);
+ }
+
+ $sql = $this->_truncate($table);
+
+ $this->_reset_write();
+
+ return $this->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete
+ *
+ * Compiles a delete string and runs the query
+ *
+ * @access public
+ * @param mixed the table(s) to delete from. String or array
+ * @param mixed the where clause
+ * @param mixed the limit clause
+ * @param boolean
+ * @return object
+ */
+ function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE)
+ {
+ // Combine any cached components with the current statements
+ $this->_merge_cache();
+
+ if ($table == '')
+ {
+ if ( ! isset($this->ar_from[0]))
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_must_set_table');
+ }
+ return FALSE;
+ }
+
+ $table = $this->ar_from[0];
+ }
+ elseif (is_array($table))
+ {
+ foreach($table as $single_table)
+ {
+ $this->delete($single_table, $where, $limit, FALSE);
+ }
+
+ $this->_reset_write();
+ return;
+ }
+ else
+ {
+ $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE);
+ }
+
+ if ($where != '')
+ {
+ $this->where($where);
+ }
+
+ if ($limit != NULL)
+ {
+ $this->limit($limit);
+ }
+
+ if (count($this->ar_where) == 0 && count($this->ar_like) == 0)
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_del_must_use_where');
+ }
+
+ return FALSE;
+ }
+
+ $sql = $this->_delete($table, $this->ar_where, $this->ar_like, $this->ar_limit);
+
+ if ($reset_data)
+ {
+ $this->_reset_write();
+ }
+
+ return $this->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * DB Prefix
+ *
+ * Prepends a database prefix if one exists in configuration
+ *
+ * @access public
+ * @param string the table
+ * @return string
+ */
+ function dbprefix($table = '')
+ {
+ if ($table == '')
+ {
+ $this->display_error('db_table_name_required');
+ }
+
+ return $this->dbprefix.$table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Track Aliases
+ *
+ * Used to track SQL statements written with aliased tables.
+ *
+ * @access private
+ * @param string The table to inspect
+ * @return string
+ */
+ function _track_aliases($table)
+ {
+ if (is_array($table))
+ {
+ foreach ($table as $t)
+ {
+ $this->_track_aliases($t);
+ }
+ return;
+ }
+
+ // Does the string contain a comma? If so, we need to separate
+ // the string into discreet statements
+ if (strpos($table, ',') !== FALSE)
+ {
+ return $this->_track_aliases(explode(',', $table));
+ }
+
+ // if a table alias is used we can recognize it by a space
+ if (strpos($table, " ") !== FALSE)
+ {
+ // if the alias is written with the AS keyword, remove it
+ $table = preg_replace('/ AS /i', ' ', $table);
+
+ // Grab the alias
+ $table = trim(strrchr($table, " "));
+
+ // Store the alias, if it doesn't already exist
+ if ( ! in_array($table, $this->ar_aliased_tables))
+ {
+ $this->ar_aliased_tables[] = $table;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Compile the SELECT statement
+ *
+ * Generates a query string based on which functions were used.
+ * Should not be called directly. The get() function calls it.
+ *
+ * @access private
+ * @return string
+ */
+ function _compile_select($select_override = FALSE)
+ {
+ // Combine any cached components with the current statements
+ $this->_merge_cache();
+
+ // ----------------------------------------------------------------
+
+ // Write the "select" portion of the query
+
+ if ($select_override !== FALSE)
+ {
+ $sql = $select_override;
+ }
+ else
+ {
+ $sql = ( ! $this->ar_distinct) ? 'SELECT ' : 'SELECT DISTINCT ';
+
+ if (count($this->ar_select) == 0)
+ {
+ $sql .= '*';
+ }
+ else
+ {
+ // 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
+ // is because until the user calls the from() function we don't know if there are aliases
+ foreach ($this->ar_select as $key => $val)
+ {
+ $this->ar_select[$key] = $this->_protect_identifiers($val);
+ }
+
+ $sql .= implode(', ', $this->ar_select);
+ }
+ }
+
+ // ----------------------------------------------------------------
+
+ // Write the "FROM" portion of the query
+
+ if (count($this->ar_from) > 0)
+ {
+ $sql .= "\nFROM ";
+
+ $sql .= $this->_from_tables($this->ar_from);
+ }
+
+ // ----------------------------------------------------------------
+
+ // Write the "JOIN" portion of the query
+
+ if (count($this->ar_join) > 0)
+ {
+ $sql .= "\n";
+
+ $sql .= implode("\n", $this->ar_join);
+ }
+
+ // ----------------------------------------------------------------
+
+ // Write the "WHERE" portion of the query
+
+ if (count($this->ar_where) > 0 OR count($this->ar_like) > 0)
+ {
+ $sql .= "\n";
+
+ $sql .= "WHERE ";
+ }
+
+ $sql .= implode("\n", $this->ar_where);
+
+ // ----------------------------------------------------------------
+
+ // Write the "LIKE" portion of the query
+
+ if (count($this->ar_like) > 0)
+ {
+ if (count($this->ar_where) > 0)
+ {
+ $sql .= "\nAND ";
+ }
+
+ $sql .= implode("\n", $this->ar_like);
+ }
+
+ // ----------------------------------------------------------------
+
+ // Write the "GROUP BY" portion of the query
+
+ if (count($this->ar_groupby) > 0)
+ {
+ $sql .= "\nGROUP BY ";
+
+ $sql .= implode(', ', $this->ar_groupby);
+ }
+
+ // ----------------------------------------------------------------
+
+ // Write the "HAVING" portion of the query
+
+ if (count($this->ar_having) > 0)
+ {
+ $sql .= "\nHAVING ";
+ $sql .= implode("\n", $this->ar_having);
+ }
+
+ // ----------------------------------------------------------------
+
+ // Write the "ORDER BY" portion of the query
+
+ if (count($this->ar_orderby) > 0)
+ {
+ $sql .= "\nORDER BY ";
+ $sql .= implode(', ', $this->ar_orderby);
+
+ if ($this->ar_order !== FALSE)
+ {
+ $sql .= ($this->ar_order == 'desc') ? ' DESC' : ' ASC';
+ }
+ }
+
+ // ----------------------------------------------------------------
+
+ // Write the "LIMIT" portion of the query
+
+ if (is_numeric($this->ar_limit))
+ {
+ $sql .= "\n";
+ $sql = $this->_limit($sql, $this->ar_limit, $this->ar_offset);
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Object to Array
+ *
+ * Takes an object as input and converts the class variables to array key/vals
+ *
+ * @access public
+ * @param object
+ * @return array
+ */
+ function _object_to_array($object)
+ {
+ if ( ! is_object($object))
+ {
+ return $object;
+ }
+
+ $array = array();
+ foreach (get_object_vars($object) as $key => $val)
+ {
+ // There are some built in keys we need to ignore for this conversion
+ if ( ! is_object($val) && ! is_array($val) && $key != '_parent_name' && $key != '_ci_scaffolding' && $key != '_ci_scaff_table')
+ {
+ $array[$key] = $val;
+ }
+ }
+
+ return $array;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Start Cache
+ *
+ * Starts AR caching
+ *
+ * @access public
+ * @return void
+ */
+ function start_cache()
+ {
+ $this->ar_caching = TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Stop Cache
+ *
+ * Stops AR caching
+ *
+ * @access public
+ * @return void
+ */
+ function stop_cache()
+ {
+ $this->ar_caching = FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Flush Cache
+ *
+ * Empties the AR cache
+ *
+ * @access public
+ * @return void
+ */
+ function flush_cache()
+ {
+ $this->_reset_run(
+ array(
+ 'ar_cache_select' => array(),
+ 'ar_cache_from' => array(),
+ 'ar_cache_join' => array(),
+ 'ar_cache_where' => array(),
+ 'ar_cache_like' => array(),
+ 'ar_cache_groupby' => array(),
+ 'ar_cache_having' => array(),
+ 'ar_cache_orderby' => array(),
+ 'ar_cache_set' => array(),
+ 'ar_cache_exists' => array()
+ )
+ );
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Merge Cache
+ *
+ * When called, this function merges any cached AR arrays with
+ * locally called ones.
+ *
+ * @access private
+ * @return void
+ */
+ function _merge_cache()
+ {
+ if (count($this->ar_cache_exists) == 0)
+ {
+ return;
+ }
+
+ foreach ($this->ar_cache_exists as $val)
+ {
+ $ar_variable = 'ar_'.$val;
+ $ar_cache_var = 'ar_cache_'.$val;
+
+ if (count($this->$ar_cache_var) == 0)
+ {
+ continue;
+ }
+
+ $this->$ar_variable = array_unique(array_merge($this->$ar_cache_var, $this->$ar_variable));
+ }
+
+ // 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 AND count($this->ar_cache_from) > 0)
+ {
+ $this->_track_aliases($this->ar_from);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Resets the active record values. Called by the get() function
+ *
+ * @access private
+ * @param array An array of fields to reset
+ * @return void
+ */
+ function _reset_run($ar_reset_items)
+ {
+ foreach ($ar_reset_items as $item => $default_value)
+ {
+ if ( ! in_array($item, $this->ar_store_array))
+ {
+ $this->$item = $default_value;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Resets the active record values. Called by the get() function
+ *
+ * @access private
+ * @return void
+ */
+ function _reset_select()
+ {
+ $ar_reset_items = array(
+ 'ar_select' => array(),
+ 'ar_from' => array(),
+ 'ar_join' => array(),
+ 'ar_where' => array(),
+ 'ar_like' => array(),
+ 'ar_groupby' => array(),
+ 'ar_having' => array(),
+ 'ar_orderby' => array(),
+ 'ar_wherein' => array(),
+ 'ar_aliased_tables' => array(),
+ 'ar_distinct' => FALSE,
+ 'ar_limit' => FALSE,
+ 'ar_offset' => FALSE,
+ 'ar_order' => FALSE,
+ );
+
+ $this->_reset_run($ar_reset_items);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Resets the active record "write" values.
+ *
+ * Called by the insert() update() and delete() functions
+ *
+ * @access private
+ * @return void
+ */
+ function _reset_write()
+ {
+ $ar_reset_items = array(
+ 'ar_set' => array(),
+ 'ar_from' => array(),
+ 'ar_where' => array(),
+ 'ar_like' => array(),
+ 'ar_orderby' => array(),
+ 'ar_limit' => FALSE,
+ 'ar_order' => FALSE
+ );
+
+ $this->_reset_run($ar_reset_items);
+ }
+
+}
+
+/* End of file DB_active_rec.php */
/* Location: ./system/database/DB_active_rec.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Database Cache Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_Cache {\r
-\r
- var $CI;\r
- var $db; // allows passing of db object so that multiple database connections and returned db objects can be supported\r
-\r
- /**\r
- * Constructor\r
- *\r
- * Grabs the CI super object instance so we can access it.\r
- *\r
- */ \r
- function CI_DB_Cache(&$db)\r
- {\r
- // Assign the main CI object to $this->CI\r
- // and load the file helper since we use it a lot\r
- $this->CI =& get_instance();\r
- $this->db =& $db;\r
- $this->CI->load->helper('file'); \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Cache Directory Path\r
- *\r
- * @access public\r
- * @param string the path to the cache directory\r
- * @return bool\r
- */ \r
- function check_path($path = '')\r
- {\r
- if ($path == '')\r
- {\r
- if ($this->db->cachedir == '')\r
- {\r
- return $this->db->cache_off();\r
- }\r
- \r
- $path = $this->db->cachedir;\r
- }\r
- \r
- // Add a trailing slash to the path if needed\r
- $path = preg_replace("/(.+?)\/*$/", "\\1/", $path);\r
-\r
- if ( ! is_dir($path) OR ! is_really_writable($path))\r
- {\r
- // If the path is wrong we'll turn off caching\r
- return $this->db->cache_off();\r
- }\r
- \r
- $this->db->cachedir = $path;\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Retrieve a cached query\r
- *\r
- * The URI being requested will become the name of the cache sub-folder.\r
- * An MD5 hash of the SQL statement will become the cache file name\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function read($sql)\r
- {\r
- if ( ! $this->check_path())\r
- {\r
- return $this->db->cache_off();\r
- }\r
-\r
- $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);\r
- \r
- $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);\r
- \r
- $filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql); \r
- \r
- if (FALSE === ($cachedata = read_file($filepath)))\r
- { \r
- return FALSE;\r
- }\r
- \r
- return unserialize($cachedata); \r
- } \r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Write a query to a cache file\r
- *\r
- * @access public\r
- * @return bool\r
- */\r
- function write($sql, $object)\r
- {\r
- if ( ! $this->check_path())\r
- {\r
- return $this->db->cache_off();\r
- }\r
-\r
- $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);\r
- \r
- $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);\r
- \r
- $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';\r
- \r
- $filename = md5($sql);\r
- \r
- if ( ! @is_dir($dir_path))\r
- {\r
- if ( ! @mkdir($dir_path, DIR_WRITE_MODE))\r
- {\r
- return FALSE;\r
- }\r
- \r
- @chmod($dir_path, DIR_WRITE_MODE); \r
- }\r
- \r
- if (write_file($dir_path.$filename, serialize($object)) === FALSE)\r
- {\r
- return FALSE;\r
- }\r
- \r
- @chmod($dir_path.$filename, DIR_WRITE_MODE);\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete cache files within a particular directory\r
- *\r
- * @access public\r
- * @return bool\r
- */\r
- function delete($segment_one = '', $segment_two = '')\r
- { \r
- if ($segment_one == '')\r
- {\r
- $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);\r
- }\r
- \r
- if ($segment_two == '')\r
- {\r
- $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);\r
- }\r
- \r
- $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';\r
- \r
- delete_files($dir_path, TRUE);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete all existing cache files\r
- *\r
- * @access public\r
- * @return bool\r
- */\r
- function delete_all()\r
- {\r
- delete_files($this->db->cachedir, TRUE);\r
- }\r
-\r
-}\r
-\r
-\r
-/* End of file DB_cache.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Database Cache Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_Cache {
+
+ var $CI;
+ var $db; // allows passing of db object so that multiple database connections and returned db objects can be supported
+
+ /**
+ * Constructor
+ *
+ * Grabs the CI super object instance so we can access it.
+ *
+ */
+ function CI_DB_Cache(&$db)
+ {
+ // Assign the main CI object to $this->CI
+ // and load the file helper since we use it a lot
+ $this->CI =& get_instance();
+ $this->db =& $db;
+ $this->CI->load->helper('file');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Cache Directory Path
+ *
+ * @access public
+ * @param string the path to the cache directory
+ * @return bool
+ */
+ function check_path($path = '')
+ {
+ if ($path == '')
+ {
+ if ($this->db->cachedir == '')
+ {
+ return $this->db->cache_off();
+ }
+
+ $path = $this->db->cachedir;
+ }
+
+ // Add a trailing slash to the path if needed
+ $path = preg_replace("/(.+?)\/*$/", "\\1/", $path);
+
+ if ( ! is_dir($path) OR ! is_really_writable($path))
+ {
+ // If the path is wrong we'll turn off caching
+ return $this->db->cache_off();
+ }
+
+ $this->db->cachedir = $path;
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Retrieve a cached query
+ *
+ * The URI being requested will become the name of the cache sub-folder.
+ * An MD5 hash of the SQL statement will become the cache file name
+ *
+ * @access public
+ * @return string
+ */
+ function read($sql)
+ {
+ if ( ! $this->check_path())
+ {
+ return $this->db->cache_off();
+ }
+
+ $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
+
+ $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
+
+ $filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql);
+
+ if (FALSE === ($cachedata = read_file($filepath)))
+ {
+ return FALSE;
+ }
+
+ return unserialize($cachedata);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Write a query to a cache file
+ *
+ * @access public
+ * @return bool
+ */
+ function write($sql, $object)
+ {
+ if ( ! $this->check_path())
+ {
+ return $this->db->cache_off();
+ }
+
+ $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
+
+ $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
+
+ $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';
+
+ $filename = md5($sql);
+
+ if ( ! @is_dir($dir_path))
+ {
+ if ( ! @mkdir($dir_path, DIR_WRITE_MODE))
+ {
+ return FALSE;
+ }
+
+ @chmod($dir_path, DIR_WRITE_MODE);
+ }
+
+ if (write_file($dir_path.$filename, serialize($object)) === FALSE)
+ {
+ return FALSE;
+ }
+
+ @chmod($dir_path.$filename, DIR_WRITE_MODE);
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete cache files within a particular directory
+ *
+ * @access public
+ * @return bool
+ */
+ function delete($segment_one = '', $segment_two = '')
+ {
+ if ($segment_one == '')
+ {
+ $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
+ }
+
+ if ($segment_two == '')
+ {
+ $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
+ }
+
+ $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';
+
+ delete_files($dir_path, TRUE);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete all existing cache files
+ *
+ * @access public
+ * @return bool
+ */
+ function delete_all()
+ {
+ delete_files($this->db->cachedir, TRUE);
+ }
+
+}
+
+
+/* End of file DB_cache.php */
/* Location: ./system/database/DB_cache.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Database Driver Class\r
- *\r
- * This is the platform-independent base DB implementation class.\r
- * This class will not be called directly. Rather, the adapter\r
- * class for the specific database will extend and instantiate it.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Drivers\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_driver {\r
-\r
- var $username;\r
- var $password;\r
- var $hostname;\r
- var $database;\r
- var $dbdriver = 'mysql';\r
- var $dbprefix = '';\r
- var $char_set = 'utf8';\r
- var $dbcollat = 'utf8_general_ci';\r
- var $autoinit = TRUE; // Whether to automatically initialize the DB\r
- var $swap_pre = '';\r
- var $port = '';\r
- var $pconnect = FALSE;\r
- var $conn_id = FALSE;\r
- var $result_id = FALSE;\r
- var $db_debug = FALSE;\r
- var $benchmark = 0;\r
- var $query_count = 0;\r
- var $bind_marker = '?';\r
- var $save_queries = TRUE;\r
- var $queries = array();\r
- var $query_times = array();\r
- var $data_cache = array();\r
- var $trans_enabled = TRUE;\r
- var $trans_strict = TRUE;\r
- var $_trans_depth = 0;\r
- var $_trans_status = TRUE; // Used with transactions to determine if a rollback should occur\r
- var $cache_on = FALSE;\r
- var $cachedir = '';\r
- var $cache_autodel = FALSE;\r
- var $CACHE; // The cache class object\r
-\r
- // Private variables\r
- var $_protect_identifiers = TRUE;\r
- var $_reserved_identifiers = array('*'); // Identifiers that should NOT be escaped\r
-\r
- // These are use with Oracle\r
- var $stmt_id;\r
- var $curs_id;\r
- var $limit_used;\r
-\r
-\r
- \r
- /**\r
- * Constructor. Accepts one parameter containing the database\r
- * connection settings.\r
- *\r
- * @param array\r
- */ \r
- function CI_DB_driver($params)\r
- {\r
- if (is_array($params))\r
- {\r
- foreach ($params as $key => $val)\r
- {\r
- $this->$key = $val;\r
- }\r
- }\r
-\r
- log_message('debug', 'Database Driver Class Initialized');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Initialize Database Settings\r
- *\r
- * @access private Called by the constructor\r
- * @param mixed\r
- * @return void\r
- */ \r
- function initialize()\r
- {\r
- // If an existing connection resource is available\r
- // there is no need to connect and select the database\r
- if (is_resource($this->conn_id) OR is_object($this->conn_id))\r
- {\r
- return TRUE;\r
- }\r
- \r
- // ----------------------------------------------------------------\r
- \r
- // Connect to the database and set the connection ID\r
- $this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();\r
-\r
- // No connection resource? Throw an error\r
- if ( ! $this->conn_id)\r
- {\r
- log_message('error', 'Unable to connect to the database');\r
- \r
- if ($this->db_debug)\r
- {\r
- $this->display_error('db_unable_to_connect');\r
- }\r
- return FALSE;\r
- }\r
-\r
- // ----------------------------------------------------------------\r
-\r
- // Select the DB... assuming a database name is specified in the config file\r
- if ($this->database != '')\r
- {\r
- if ( ! $this->db_select())\r
- {\r
- log_message('error', 'Unable to select database: '.$this->database);\r
- \r
- if ($this->db_debug)\r
- {\r
- $this->display_error('db_unable_to_select', $this->database);\r
- }\r
- return FALSE; \r
- }\r
- else\r
- {\r
- // We've selected the DB. Now we set the character set\r
- if ( ! $this->db_set_charset($this->char_set, $this->dbcollat))\r
- {\r
- return FALSE;\r
- }\r
- \r
- return TRUE;\r
- }\r
- }\r
-\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set client character set\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return resource\r
- */\r
- function db_set_charset($charset, $collation)\r
- {\r
- if ( ! $this->_db_set_charset($this->char_set, $this->dbcollat))\r
- {\r
- log_message('error', 'Unable to set database connection charset: '.$this->char_set);\r
- \r
- if ($this->db_debug)\r
- {\r
- $this->display_error('db_unable_to_set_charset', $this->char_set);\r
- }\r
- \r
- return FALSE;\r
- }\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The name of the platform in use (mysql, mssql, etc...)\r
- *\r
- * @access public\r
- * @return string \r
- */ \r
- function platform()\r
- {\r
- return $this->dbdriver;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Database Version Number. Returns a string containing the\r
- * version of the database being used\r
- *\r
- * @access public\r
- * @return string \r
- */ \r
- function version()\r
- {\r
- if (FALSE === ($sql = $this->_version()))\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_unsupported_function');\r
- }\r
- return FALSE;\r
- }\r
- \r
- if ($this->dbdriver == 'oci8')\r
- {\r
- return $sql;\r
- }\r
- \r
- $query = $this->query($sql);\r
- return $query->row('ver');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Execute the query\r
- *\r
- * Accepts an SQL string as input and returns a result object upon\r
- * successful execution of a "read" type query. Returns boolean TRUE\r
- * upon successful execution of a "write" type query. Returns boolean\r
- * FALSE upon failure, and if the $db_debug variable is set to TRUE\r
- * will raise an error.\r
- *\r
- * @access public\r
- * @param string An SQL query string\r
- * @param array An array of binding data\r
- * @return mixed \r
- */ \r
- function query($sql, $binds = FALSE, $return_object = TRUE)\r
- {\r
- if ($sql == '')\r
- {\r
- if ($this->db_debug)\r
- {\r
- log_message('error', 'Invalid query: '.$sql);\r
- return $this->display_error('db_invalid_query');\r
- }\r
- return FALSE;\r
- }\r
-\r
- // Verify table prefix and replace if necessary\r
- if ( ($this->dbprefix != '' AND $this->swap_pre != '') AND ($this->dbprefix != $this->swap_pre) )\r
- { \r
- $sql = preg_replace("/(\W)".$this->swap_pre."(\S+?)/", "\\1".$this->dbprefix."\\2", $sql);\r
- }\r
- \r
- // Is query caching enabled? If the query is a "read type"\r
- // we will load the caching class and return the previously\r
- // cached query if it exists\r
- if ($this->cache_on == TRUE AND stristr($sql, 'SELECT'))\r
- {\r
- if ($this->_cache_init())\r
- {\r
- $this->load_rdriver();\r
- if (FALSE !== ($cache = $this->CACHE->read($sql)))\r
- {\r
- return $cache;\r
- }\r
- }\r
- }\r
- \r
- // Compile binds if needed\r
- if ($binds !== FALSE)\r
- {\r
- $sql = $this->compile_binds($sql, $binds);\r
- }\r
-\r
- // Save the query for debugging\r
- if ($this->save_queries == TRUE)\r
- {\r
- $this->queries[] = $sql;\r
- }\r
- \r
- // Start the Query Timer\r
- $time_start = list($sm, $ss) = explode(' ', microtime());\r
- \r
- // Run the Query\r
- if (FALSE === ($this->result_id = $this->simple_query($sql)))\r
- {\r
- if ($this->save_queries == TRUE)\r
- {\r
- $this->query_times[] = 0;\r
- }\r
- \r
- // This will trigger a rollback if transactions are being used\r
- $this->_trans_status = FALSE;\r
-\r
- if ($this->db_debug)\r
- {\r
- // grab the error number and message now, as we might run some\r
- // additional queries before displaying the error\r
- $error_no = $this->_error_number();\r
- $error_msg = $this->_error_message();\r
- \r
- // We call this function in order to roll-back queries\r
- // if transactions are enabled. If we don't call this here\r
- // the error message will trigger an exit, causing the \r
- // transactions to remain in limbo.\r
- $this->trans_complete();\r
-\r
- // Log and display errors\r
- log_message('error', 'Query error: '.$error_msg);\r
- return $this->display_error(\r
- array(\r
- 'Error Number: '.$error_no,\r
- $error_msg,\r
- $sql\r
- )\r
- );\r
- }\r
- \r
- return FALSE;\r
- }\r
- \r
- // Stop and aggregate the query time results\r
- $time_end = list($em, $es) = explode(' ', microtime());\r
- $this->benchmark += ($em + $es) - ($sm + $ss);\r
-\r
- if ($this->save_queries == TRUE)\r
- {\r
- $this->query_times[] = ($em + $es) - ($sm + $ss);\r
- }\r
- \r
- // Increment the query counter\r
- $this->query_count++;\r
- \r
- // Was the query a "write" type?\r
- // If so we'll simply return true\r
- if ($this->is_write_type($sql) === TRUE)\r
- {\r
- // If caching is enabled we'll auto-cleanup any\r
- // existing files related to this particular URI\r
- if ($this->cache_on == TRUE AND $this->cache_autodel == TRUE AND $this->_cache_init())\r
- {\r
- $this->CACHE->delete();\r
- }\r
- \r
- return TRUE;\r
- }\r
- \r
- // Return TRUE if we don't need to create a result object\r
- // Currently only the Oracle driver uses this when stored\r
- // procedures are used\r
- if ($return_object !== TRUE)\r
- {\r
- return TRUE;\r
- }\r
- \r
- // Load and instantiate the result driver \r
- \r
- $driver = $this->load_rdriver();\r
- $RES = new $driver();\r
- $RES->conn_id = $this->conn_id;\r
- $RES->result_id = $this->result_id;\r
-\r
- if ($this->dbdriver == 'oci8')\r
- {\r
- $RES->stmt_id = $this->stmt_id;\r
- $RES->curs_id = NULL;\r
- $RES->limit_used = $this->limit_used;\r
- $this->stmt_id = FALSE;\r
- }\r
- \r
- // oci8 vars must be set before calling this\r
- $RES->num_rows = $RES->num_rows();\r
- \r
- // Is query caching enabled? If so, we'll serialize the\r
- // result object and save it to a cache file.\r
- if ($this->cache_on == TRUE AND $this->_cache_init())\r
- {\r
- // We'll create a new instance of the result object\r
- // only without the platform specific driver since\r
- // we can't use it with cached data (the query result\r
- // resource ID won't be any good once we've cached the\r
- // result object, so we'll have to compile the data\r
- // and save it)\r
- $CR = new CI_DB_result();\r
- $CR->num_rows = $RES->num_rows();\r
- $CR->result_object = $RES->result_object();\r
- $CR->result_array = $RES->result_array();\r
- \r
- // Reset these since cached objects can not utilize resource IDs.\r
- $CR->conn_id = NULL;\r
- $CR->result_id = NULL;\r
-\r
- $this->CACHE->write($sql, $CR);\r
- }\r
- \r
- return $RES;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Load the result drivers\r
- *\r
- * @access public\r
- * @return string the name of the result class \r
- */ \r
- function load_rdriver()\r
- {\r
- $driver = 'CI_DB_'.$this->dbdriver.'_result';\r
-\r
- if ( ! class_exists($driver))\r
- {\r
- include_once(BASEPATH.'database/DB_result'.EXT);\r
- include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result'.EXT);\r
- }\r
- \r
- return $driver;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Simple Query\r
- * This is a simplified version of the query() function. Internally\r
- * we only use it when running transaction commands since they do\r
- * not require all the features of the main query() function.\r
- *\r
- * @access public\r
- * @param string the sql query\r
- * @return mixed \r
- */ \r
- function simple_query($sql)\r
- {\r
- if ( ! $this->conn_id)\r
- {\r
- $this->initialize();\r
- }\r
-\r
- return $this->_execute($sql);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Disable Transactions\r
- * This permits transactions to be disabled at run-time.\r
- *\r
- * @access public\r
- * @return void \r
- */ \r
- function trans_off()\r
- {\r
- $this->trans_enabled = FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Enable/disable Transaction Strict Mode\r
- * When strict mode is enabled, if you are running multiple groups of\r
- * transactions, if one group fails all groups will be rolled back.\r
- * If strict mode is disabled, each group is treated autonomously, meaning\r
- * a failure of one group will not affect any others\r
- *\r
- * @access public\r
- * @return void \r
- */ \r
- function trans_strict($mode = TRUE)\r
- {\r
- $this->trans_strict = is_bool($mode) ? $mode : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Start Transaction\r
- *\r
- * @access public\r
- * @return void \r
- */ \r
- function trans_start($test_mode = FALSE)\r
- { \r
- if ( ! $this->trans_enabled)\r
- {\r
- return FALSE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- $this->_trans_depth += 1;\r
- return;\r
- }\r
- \r
- $this->trans_begin($test_mode);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Complete Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_complete()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return FALSE;\r
- }\r
- \r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 1)\r
- {\r
- $this->_trans_depth -= 1;\r
- return TRUE;\r
- }\r
- \r
- // The query() function will set this flag to FALSE in the event that a query failed\r
- if ($this->_trans_status === FALSE)\r
- {\r
- $this->trans_rollback();\r
- \r
- // If we are NOT running in strict mode, we will reset\r
- // the _trans_status flag so that subsequent groups of transactions\r
- // will be permitted.\r
- if ($this->trans_strict === FALSE)\r
- {\r
- $this->_trans_status = TRUE;\r
- }\r
-\r
- log_message('debug', 'DB Transaction Failure');\r
- return FALSE;\r
- }\r
- \r
- $this->trans_commit();\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Lets you retrieve the transaction flag to determine if it has failed\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_status()\r
- {\r
- return $this->_trans_status;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Compile Bindings\r
- *\r
- * @access public\r
- * @param string the sql statement\r
- * @param array an array of bind data\r
- * @return string \r
- */ \r
- function compile_binds($sql, $binds)\r
- {\r
- if (strpos($sql, $this->bind_marker) === FALSE)\r
- {\r
- return $sql;\r
- }\r
- \r
- if ( ! is_array($binds))\r
- {\r
- $binds = array($binds);\r
- }\r
- \r
- // Get the sql segments around the bind markers\r
- $segments = explode($this->bind_marker, $sql);\r
-\r
- // The count of bind should be 1 less then the count of segments\r
- // If there are more bind arguments trim it down\r
- if (count($binds) >= count($segments)) {\r
- $binds = array_slice($binds, 0, count($segments)-1);\r
- }\r
-\r
- // Construct the binded query\r
- $result = $segments[0];\r
- $i = 0;\r
- foreach ($binds as $bind)\r
- {\r
- $result .= $this->escape($bind);\r
- $result .= $segments[++$i];\r
- }\r
-\r
- return $result;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Determines if a query is a "write" type.\r
- *\r
- * @access public\r
- * @param string An SQL query string\r
- * @return boolean \r
- */ \r
- function is_write_type($sql)\r
- {\r
- if ( ! preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i', $sql))\r
- {\r
- return FALSE;\r
- }\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Calculate the aggregate query elapsed time\r
- *\r
- * @access public\r
- * @param integer The number of decimal places\r
- * @return integer \r
- */ \r
- function elapsed_time($decimals = 6)\r
- {\r
- return number_format($this->benchmark, $decimals);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Returns the total number of queries\r
- *\r
- * @access public\r
- * @return integer \r
- */ \r
- function total_queries()\r
- {\r
- return $this->query_count;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Returns the last query that was executed\r
- *\r
- * @access public\r
- * @return void \r
- */ \r
- function last_query()\r
- {\r
- return end($this->queries);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * "Smart" Escape String\r
- *\r
- * Escapes data based on type\r
- * Sets boolean and null types\r
- *\r
- * @access public\r
- * @param string\r
- * @return integer \r
- */ \r
- function escape($str)\r
- { \r
- switch (gettype($str))\r
- {\r
- case 'string' : $str = "'".$this->escape_str($str)."'";\r
- break;\r
- case 'boolean' : $str = ($str === FALSE) ? 0 : 1;\r
- break;\r
- default : $str = ($str === NULL) ? 'NULL' : $str;\r
- break;\r
- } \r
-\r
- return $str;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Primary\r
- *\r
- * Retrieves the primary key. It assumes that the row in the first\r
- * position is the primary key\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string \r
- */ \r
- function primary($table = '')\r
- { \r
- $fields = $this->list_fields($table);\r
- \r
- if ( ! is_array($fields))\r
- {\r
- return FALSE;\r
- }\r
-\r
- return current($fields);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Returns an array of table names\r
- *\r
- * @access public\r
- * @return array \r
- */ \r
- function list_tables($constrain_by_prefix = FALSE)\r
- {\r
- // Is there a cached result?\r
- if (isset($this->data_cache['table_names']))\r
- {\r
- return $this->data_cache['table_names'];\r
- }\r
- \r
- if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix)))\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_unsupported_function');\r
- }\r
- return FALSE;\r
- }\r
-\r
- $retval = array();\r
- $query = $this->query($sql);\r
- \r
- if ($query->num_rows() > 0)\r
- {\r
- foreach($query->result_array() as $row)\r
- {\r
- if (isset($row['TABLE_NAME']))\r
- {\r
- $retval[] = $row['TABLE_NAME'];\r
- }\r
- else\r
- {\r
- $retval[] = array_shift($row);\r
- }\r
- }\r
- }\r
-\r
- $this->data_cache['table_names'] = $retval;\r
- return $this->data_cache['table_names'];\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Determine if a particular table exists\r
- * @access public\r
- * @return boolean\r
- */\r
- function table_exists($table_name)\r
- { \r
- return ( ! in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables())) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch MySQL Field Names\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return array \r
- */\r
- function list_fields($table = '')\r
- {\r
- // Is there a cached result?\r
- if (isset($this->data_cache['field_names'][$table]))\r
- {\r
- return $this->data_cache['field_names'][$table];\r
- }\r
- \r
- if ($table == '')\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_field_param_missing');\r
- }\r
- return FALSE;\r
- }\r
- \r
- if (FALSE === ($sql = $this->_list_columns($this->_protect_identifiers($table, TRUE, NULL, FALSE))))\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_unsupported_function');\r
- }\r
- return FALSE;\r
- }\r
- \r
- $query = $this->query($sql);\r
- \r
- $retval = array();\r
- foreach($query->result_array() as $row)\r
- {\r
- if (isset($row['COLUMN_NAME']))\r
- {\r
- $retval[] = $row['COLUMN_NAME'];\r
- }\r
- else\r
- {\r
- $retval[] = current($row);\r
- } \r
- }\r
- \r
- $this->data_cache['field_names'][$table] = $retval;\r
- return $this->data_cache['field_names'][$table];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Determine if a particular field exists\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return boolean\r
- */\r
- function field_exists($field_name, $table_name)\r
- { \r
- return ( ! in_array($field_name, $this->list_fields($table_name))) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Returns an object with field data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return object \r
- */ \r
- function field_data($table = '')\r
- {\r
- if ($table == '')\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_field_param_missing');\r
- }\r
- return FALSE;\r
- }\r
- \r
- $query = $this->query($this->_field_data($this->_protect_identifiers($table, TRUE, NULL, FALSE)));\r
-\r
- return $query->field_data();\r
- } \r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Generate an insert string\r
- *\r
- * @access public\r
- * @param string the table upon which the query will be performed\r
- * @param array an associative array data of key/values\r
- * @return string \r
- */ \r
- function insert_string($table, $data)\r
- {\r
- $fields = array();\r
- $values = array();\r
- \r
- foreach($data as $key => $val)\r
- {\r
- $fields[] = $this->_escape_identifiers($key);\r
- $values[] = $this->escape($val);\r
- }\r
- \r
- return $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values);\r
- } \r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Generate an update string\r
- *\r
- * @access public\r
- * @param string the table upon which the query will be performed\r
- * @param array an associative array data of key/values\r
- * @param mixed the "where" statement\r
- * @return string \r
- */ \r
- function update_string($table, $data, $where)\r
- {\r
- if ($where == '')\r
- {\r
- return false;\r
- }\r
- \r
- $fields = array();\r
- foreach($data as $key => $val)\r
- {\r
- $fields[$this->_protect_identifiers($key)] = $this->escape($val);\r
- }\r
-\r
- if ( ! is_array($where))\r
- {\r
- $dest = array($where);\r
- }\r
- else\r
- {\r
- $dest = array();\r
- foreach ($where as $key => $val)\r
- {\r
- $prefix = (count($dest) == 0) ? '' : ' AND ';\r
- \r
- if ($val !== '')\r
- {\r
- if ( ! $this->_has_operator($key))\r
- {\r
- $key .= ' =';\r
- }\r
- \r
- $val = ' '.$this->escape($val);\r
- }\r
- \r
- $dest[] = $prefix.$key.$val;\r
- }\r
- } \r
-\r
- return $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $dest);\r
- } \r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Tests whether the string has an SQL operator\r
- *\r
- * @access private\r
- * @param string\r
- * @return bool\r
- */\r
- function _has_operator($str)\r
- {\r
- $str = trim($str);\r
- if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str))\r
- {\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Enables a native PHP function to be run, using a platform agnostic wrapper.\r
- *\r
- * @access public\r
- * @param string the function name\r
- * @param mixed any parameters needed by the function\r
- * @return mixed \r
- */ \r
- function call_function($function)\r
- {\r
- $driver = ($this->dbdriver == 'postgre') ? 'pg_' : $this->dbdriver.'_';\r
- \r
- if (FALSE === strpos($driver, $function))\r
- {\r
- $function = $driver.$function;\r
- }\r
- \r
- if ( ! function_exists($function))\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_unsupported_function');\r
- }\r
- return FALSE;\r
- }\r
- else\r
- {\r
- $args = (func_num_args() > 1) ? array_splice(func_get_args(), 1) : null;\r
-\r
- return call_user_func_array($function, $args);\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Cache Directory Path\r
- *\r
- * @access public\r
- * @param string the path to the cache directory\r
- * @return void\r
- */ \r
- function cache_set_path($path = '')\r
- {\r
- $this->cachedir = $path;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Enable Query Caching\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function cache_on()\r
- {\r
- $this->cache_on = TRUE;\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Disable Query Caching\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function cache_off()\r
- {\r
- $this->cache_on = FALSE;\r
- return FALSE;\r
- }\r
- \r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete the cache files associated with a particular URI\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function cache_delete($segment_one = '', $segment_two = '')\r
- {\r
- if ( ! $this->_cache_init())\r
- {\r
- return FALSE;\r
- }\r
- return $this->CACHE->delete($segment_one, $segment_two);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete All cache files\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function cache_delete_all()\r
- {\r
- if ( ! $this->_cache_init())\r
- {\r
- return FALSE;\r
- }\r
-\r
- return $this->CACHE->delete_all();\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Initialize the Cache Class\r
- *\r
- * @access private\r
- * @return void\r
- */ \r
- function _cache_init()\r
- {\r
- if (is_object($this->CACHE) AND class_exists('CI_DB_Cache'))\r
- {\r
- return TRUE;\r
- }\r
- \r
- if ( ! @include(BASEPATH.'database/DB_cache'.EXT))\r
- {\r
- return $this->cache_off();\r
- }\r
- \r
- $this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Close DB Connection\r
- *\r
- * @access public\r
- * @return void \r
- */ \r
- function close()\r
- {\r
- if (is_resource($this->conn_id) OR is_object($this->conn_id))\r
- {\r
- $this->_close($this->conn_id);\r
- }\r
- $this->conn_id = FALSE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Display an error message\r
- *\r
- * @access public\r
- * @param string the error message\r
- * @param string any "swap" values\r
- * @param boolean whether to localize the message\r
- * @return string sends the application/error_db.php template \r
- */ \r
- function display_error($error = '', $swap = '', $native = FALSE)\r
- {\r
- $LANG =& load_class('Language');\r
- $LANG->load('db');\r
-\r
- $heading = $LANG->line('db_error_heading');\r
-\r
- if ($native == TRUE)\r
- {\r
- $message = $error;\r
- }\r
- else\r
- {\r
- $message = ( ! is_array($error)) ? array(str_replace('%s', $swap, $LANG->line($error))) : $error;\r
- }\r
- \r
- $error =& load_class('Exceptions');\r
- echo $error->show_error($heading, $message, 'error_db');\r
- exit;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Protect Identifiers\r
- *\r
- * This function adds backticks if appropriate based on db type\r
- *\r
- * @access private\r
- * @param mixed the item to escape\r
- * @return mixed the item with backticks\r
- */\r
- function protect_identifiers($item, $prefix_single = FALSE)\r
- {\r
- return $this->_protect_identifiers($item, $prefix_single);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Protect Identifiers\r
- *\r
- * This function is used extensively by the Active Record class, and by\r
- * a couple functions in this class. \r
- * It takes a column or table name (optionally with an alias) and inserts\r
- * the table prefix onto it. Some logic is necessary in order to deal with\r
- * column names that include the path. Consider a query like this:\r
- *\r
- * SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table\r
- *\r
- * Or a query with aliasing:\r
- *\r
- * SELECT m.member_id, m.member_name FROM members AS m\r
- *\r
- * Since the column name can include up to four segments (host, DB, table, column)\r
- * or also have an alias prefix, we need to do a bit of work to figure this out and\r
- * insert the table prefix (if it exists) in the proper position, and escape only\r
- * the correct identifiers.\r
- *\r
- * @access private\r
- * @param string\r
- * @param bool\r
- * @param mixed\r
- * @param bool\r
- * @return string\r
- */ \r
- function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE)\r
- {\r
- if ( ! is_bool($protect_identifiers))\r
- {\r
- $protect_identifiers = $this->_protect_identifiers;\r
- }\r
- \r
- // Convert tabs or multiple spaces into single spaces\r
- $item = preg_replace('/[\t| ]+/', ' ', $item);\r
- \r
- // If the item has an alias declaration we remove it and set it aside.\r
- // Basically we remove everything to the right of the first space\r
- $alias = '';\r
- if (strpos($item, ' ') !== FALSE)\r
- { \r
- $alias = strstr($item, " ");\r
- $item = substr($item, 0, - strlen($alias));\r
- }\r
-\r
- // Break the string apart if it contains periods, then insert the table prefix\r
- // in the correct location, assuming the period doesn't indicate that we're dealing\r
- // with an alias. While we're at it, we will escape the components\r
- if (strpos($item, '.') !== FALSE)\r
- {\r
- $parts = explode('.', $item);\r
- \r
- // Does the first segment of the exploded item match\r
- // one of the aliases previously identified? If so,\r
- // we have nothing more to do other then escape the item\r
- if (in_array($parts[0], $this->ar_aliased_tables))\r
- { \r
- if ($protect_identifiers === TRUE)\r
- {\r
- foreach ($parts as $key => $val)\r
- {\r
- if ( ! in_array($val, $this->_reserved_identifiers))\r
- {\r
- $parts[$key] = $this->_escape_identifiers($val);\r
- }\r
- }\r
- \r
- $item = implode('.', $parts);\r
- } \r
- return $item.$alias;\r
- }\r
- \r
- // Is there a table prefix defined in the config file? If not, no need to do anything\r
- if ($this->dbprefix != '')\r
- {\r
- // We now add the table prefix based on some logic.\r
- // Do we have 4 segments (hostname.database.table.column)?\r
- // If so, we add the table prefix to the column name in the 3rd segment.\r
- if (isset($parts[3]))\r
- {\r
- $i = 2;\r
- }\r
- // Do we have 3 segments (database.table.column)?\r
- // If so, we add the table prefix to the column name in 2nd position\r
- elseif (isset($parts[2]))\r
- {\r
- $i = 1;\r
- }\r
- // Do we have 2 segments (table.column)?\r
- // If so, we add the table prefix to the column name in 1st segment\r
- else\r
- {\r
- $i = 0;\r
- }\r
- \r
- // This flag is set when the supplied $item does not contain a field name.\r
- // This can happen when this function is being called from a JOIN.\r
- if ($field_exists == FALSE)\r
- {\r
- $i++;\r
- }\r
- \r
- // We only add the table prefix if it does not already exist\r
- if (substr($parts[$i], 0, strlen($this->dbprefix)) != $this->dbprefix)\r
- {\r
- $parts[$i] = $this->dbprefix.$parts[$i];\r
- }\r
- \r
- // Put the parts back together\r
- $item = implode('.', $parts);\r
- }\r
- \r
- if ($protect_identifiers === TRUE)\r
- {\r
- $item = $this->_escape_identifiers($item);\r
- }\r
- \r
- return $item.$alias;\r
- }\r
-\r
- // This is basically a bug fix for queries that use MAX, MIN, etc.\r
- // If a parenthesis is found we know that we do not need to \r
- // escape the data or add a prefix. There's probably a more graceful\r
- // way to deal with this, but I'm not thinking of it -- Rick\r
- if (strpos($item, '(') !== FALSE)\r
- {\r
- return $item.$alias;\r
- }\r
- \r
- // Is there a table prefix? If not, no need to insert it\r
- if ($this->dbprefix != '')\r
- {\r
- // Do we prefix an item with no segments?\r
- if ($prefix_single == TRUE AND substr($item, 0, strlen($this->dbprefix)) != $this->dbprefix)\r
- {\r
- $item = $this->dbprefix.$item;\r
- } \r
- }\r
- \r
- if ($protect_identifiers === TRUE AND ! in_array($item, $this->_reserved_identifiers))\r
- {\r
- $item = $this->_escape_identifiers($item);\r
- }\r
- \r
- return $item.$alias;\r
- }\r
-\r
-\r
-}\r
-\r
-\r
-/* End of file DB_driver.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Database Driver Class
+ *
+ * This is the platform-independent base DB implementation class.
+ * This class will not be called directly. Rather, the adapter
+ * class for the specific database will extend and instantiate it.
+ *
+ * @package CodeIgniter
+ * @subpackage Drivers
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_driver {
+
+ var $username;
+ var $password;
+ var $hostname;
+ var $database;
+ var $dbdriver = 'mysql';
+ var $dbprefix = '';
+ var $char_set = 'utf8';
+ var $dbcollat = 'utf8_general_ci';
+ var $autoinit = TRUE; // Whether to automatically initialize the DB
+ var $swap_pre = '';
+ var $port = '';
+ var $pconnect = FALSE;
+ var $conn_id = FALSE;
+ var $result_id = FALSE;
+ var $db_debug = FALSE;
+ var $benchmark = 0;
+ var $query_count = 0;
+ var $bind_marker = '?';
+ var $save_queries = TRUE;
+ var $queries = array();
+ var $query_times = array();
+ var $data_cache = array();
+ var $trans_enabled = TRUE;
+ var $trans_strict = TRUE;
+ var $_trans_depth = 0;
+ var $_trans_status = TRUE; // Used with transactions to determine if a rollback should occur
+ var $cache_on = FALSE;
+ var $cachedir = '';
+ var $cache_autodel = FALSE;
+ var $CACHE; // The cache class object
+
+ // Private variables
+ var $_protect_identifiers = TRUE;
+ var $_reserved_identifiers = array('*'); // Identifiers that should NOT be escaped
+
+ // These are use with Oracle
+ var $stmt_id;
+ var $curs_id;
+ var $limit_used;
+
+
+
+ /**
+ * Constructor. Accepts one parameter containing the database
+ * connection settings.
+ *
+ * @param array
+ */
+ function CI_DB_driver($params)
+ {
+ if (is_array($params))
+ {
+ foreach ($params as $key => $val)
+ {
+ $this->$key = $val;
+ }
+ }
+
+ log_message('debug', 'Database Driver Class Initialized');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize Database Settings
+ *
+ * @access private Called by the constructor
+ * @param mixed
+ * @return void
+ */
+ function initialize()
+ {
+ // If an existing connection resource is available
+ // there is no need to connect and select the database
+ if (is_resource($this->conn_id) OR is_object($this->conn_id))
+ {
+ return TRUE;
+ }
+
+ // ----------------------------------------------------------------
+
+ // Connect to the database and set the connection ID
+ $this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();
+
+ // No connection resource? Throw an error
+ if ( ! $this->conn_id)
+ {
+ log_message('error', 'Unable to connect to the database');
+
+ if ($this->db_debug)
+ {
+ $this->display_error('db_unable_to_connect');
+ }
+ return FALSE;
+ }
+
+ // ----------------------------------------------------------------
+
+ // Select the DB... assuming a database name is specified in the config file
+ if ($this->database != '')
+ {
+ if ( ! $this->db_select())
+ {
+ log_message('error', 'Unable to select database: '.$this->database);
+
+ if ($this->db_debug)
+ {
+ $this->display_error('db_unable_to_select', $this->database);
+ }
+ return FALSE;
+ }
+ else
+ {
+ // We've selected the DB. Now we set the character set
+ if ( ! $this->db_set_charset($this->char_set, $this->dbcollat))
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set client character set
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return resource
+ */
+ function db_set_charset($charset, $collation)
+ {
+ if ( ! $this->_db_set_charset($this->char_set, $this->dbcollat))
+ {
+ log_message('error', 'Unable to set database connection charset: '.$this->char_set);
+
+ if ($this->db_debug)
+ {
+ $this->display_error('db_unable_to_set_charset', $this->char_set);
+ }
+
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The name of the platform in use (mysql, mssql, etc...)
+ *
+ * @access public
+ * @return string
+ */
+ function platform()
+ {
+ return $this->dbdriver;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Database Version Number. Returns a string containing the
+ * version of the database being used
+ *
+ * @access public
+ * @return string
+ */
+ function version()
+ {
+ if (FALSE === ($sql = $this->_version()))
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_unsupported_function');
+ }
+ return FALSE;
+ }
+
+ if ($this->dbdriver == 'oci8')
+ {
+ return $sql;
+ }
+
+ $query = $this->query($sql);
+ return $query->row('ver');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Execute the query
+ *
+ * Accepts an SQL string as input and returns a result object upon
+ * successful execution of a "read" type query. Returns boolean TRUE
+ * upon successful execution of a "write" type query. Returns boolean
+ * FALSE upon failure, and if the $db_debug variable is set to TRUE
+ * will raise an error.
+ *
+ * @access public
+ * @param string An SQL query string
+ * @param array An array of binding data
+ * @return mixed
+ */
+ function query($sql, $binds = FALSE, $return_object = TRUE)
+ {
+ if ($sql == '')
+ {
+ if ($this->db_debug)
+ {
+ log_message('error', 'Invalid query: '.$sql);
+ return $this->display_error('db_invalid_query');
+ }
+ return FALSE;
+ }
+
+ // Verify table prefix and replace if necessary
+ if ( ($this->dbprefix != '' AND $this->swap_pre != '') AND ($this->dbprefix != $this->swap_pre) )
+ {
+ $sql = preg_replace("/(\W)".$this->swap_pre."(\S+?)/", "\\1".$this->dbprefix."\\2", $sql);
+ }
+
+ // Is query caching enabled? If the query is a "read type"
+ // we will load the caching class and return the previously
+ // cached query if it exists
+ if ($this->cache_on == TRUE AND stristr($sql, 'SELECT'))
+ {
+ if ($this->_cache_init())
+ {
+ $this->load_rdriver();
+ if (FALSE !== ($cache = $this->CACHE->read($sql)))
+ {
+ return $cache;
+ }
+ }
+ }
+
+ // Compile binds if needed
+ if ($binds !== FALSE)
+ {
+ $sql = $this->compile_binds($sql, $binds);
+ }
+
+ // Save the query for debugging
+ if ($this->save_queries == TRUE)
+ {
+ $this->queries[] = $sql;
+ }
+
+ // Start the Query Timer
+ $time_start = list($sm, $ss) = explode(' ', microtime());
+
+ // Run the Query
+ if (FALSE === ($this->result_id = $this->simple_query($sql)))
+ {
+ if ($this->save_queries == TRUE)
+ {
+ $this->query_times[] = 0;
+ }
+
+ // This will trigger a rollback if transactions are being used
+ $this->_trans_status = FALSE;
+
+ if ($this->db_debug)
+ {
+ // grab the error number and message now, as we might run some
+ // additional queries before displaying the error
+ $error_no = $this->_error_number();
+ $error_msg = $this->_error_message();
+
+ // We call this function in order to roll-back queries
+ // if transactions are enabled. If we don't call this here
+ // the error message will trigger an exit, causing the
+ // transactions to remain in limbo.
+ $this->trans_complete();
+
+ // Log and display errors
+ log_message('error', 'Query error: '.$error_msg);
+ return $this->display_error(
+ array(
+ 'Error Number: '.$error_no,
+ $error_msg,
+ $sql
+ )
+ );
+ }
+
+ return FALSE;
+ }
+
+ // Stop and aggregate the query time results
+ $time_end = list($em, $es) = explode(' ', microtime());
+ $this->benchmark += ($em + $es) - ($sm + $ss);
+
+ if ($this->save_queries == TRUE)
+ {
+ $this->query_times[] = ($em + $es) - ($sm + $ss);
+ }
+
+ // Increment the query counter
+ $this->query_count++;
+
+ // Was the query a "write" type?
+ // If so we'll simply return true
+ if ($this->is_write_type($sql) === TRUE)
+ {
+ // If caching is enabled we'll auto-cleanup any
+ // existing files related to this particular URI
+ if ($this->cache_on == TRUE AND $this->cache_autodel == TRUE AND $this->_cache_init())
+ {
+ $this->CACHE->delete();
+ }
+
+ return TRUE;
+ }
+
+ // Return TRUE if we don't need to create a result object
+ // Currently only the Oracle driver uses this when stored
+ // procedures are used
+ if ($return_object !== TRUE)
+ {
+ return TRUE;
+ }
+
+ // Load and instantiate the result driver
+
+ $driver = $this->load_rdriver();
+ $RES = new $driver();
+ $RES->conn_id = $this->conn_id;
+ $RES->result_id = $this->result_id;
+
+ if ($this->dbdriver == 'oci8')
+ {
+ $RES->stmt_id = $this->stmt_id;
+ $RES->curs_id = NULL;
+ $RES->limit_used = $this->limit_used;
+ $this->stmt_id = FALSE;
+ }
+
+ // oci8 vars must be set before calling this
+ $RES->num_rows = $RES->num_rows();
+
+ // Is query caching enabled? If so, we'll serialize the
+ // result object and save it to a cache file.
+ if ($this->cache_on == TRUE AND $this->_cache_init())
+ {
+ // We'll create a new instance of the result object
+ // only without the platform specific driver since
+ // we can't use it with cached data (the query result
+ // resource ID won't be any good once we've cached the
+ // result object, so we'll have to compile the data
+ // and save it)
+ $CR = new CI_DB_result();
+ $CR->num_rows = $RES->num_rows();
+ $CR->result_object = $RES->result_object();
+ $CR->result_array = $RES->result_array();
+
+ // Reset these since cached objects can not utilize resource IDs.
+ $CR->conn_id = NULL;
+ $CR->result_id = NULL;
+
+ $this->CACHE->write($sql, $CR);
+ }
+
+ return $RES;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load the result drivers
+ *
+ * @access public
+ * @return string the name of the result class
+ */
+ function load_rdriver()
+ {
+ $driver = 'CI_DB_'.$this->dbdriver.'_result';
+
+ if ( ! class_exists($driver))
+ {
+ include_once(BASEPATH.'database/DB_result'.EXT);
+ include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result'.EXT);
+ }
+
+ return $driver;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Simple Query
+ * This is a simplified version of the query() function. Internally
+ * we only use it when running transaction commands since they do
+ * not require all the features of the main query() function.
+ *
+ * @access public
+ * @param string the sql query
+ * @return mixed
+ */
+ function simple_query($sql)
+ {
+ if ( ! $this->conn_id)
+ {
+ $this->initialize();
+ }
+
+ return $this->_execute($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Disable Transactions
+ * This permits transactions to be disabled at run-time.
+ *
+ * @access public
+ * @return void
+ */
+ function trans_off()
+ {
+ $this->trans_enabled = FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Enable/disable Transaction Strict Mode
+ * When strict mode is enabled, if you are running multiple groups of
+ * transactions, if one group fails all groups will be rolled back.
+ * If strict mode is disabled, each group is treated autonomously, meaning
+ * a failure of one group will not affect any others
+ *
+ * @access public
+ * @return void
+ */
+ function trans_strict($mode = TRUE)
+ {
+ $this->trans_strict = is_bool($mode) ? $mode : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Start Transaction
+ *
+ * @access public
+ * @return void
+ */
+ function trans_start($test_mode = FALSE)
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return FALSE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ $this->_trans_depth += 1;
+ return;
+ }
+
+ $this->trans_begin($test_mode);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Complete Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_complete()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ 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;
+ }
+
+ // The query() function will set this flag to FALSE in the event that a query failed
+ if ($this->_trans_status === FALSE)
+ {
+ $this->trans_rollback();
+
+ // If we are NOT running in strict mode, we will reset
+ // the _trans_status flag so that subsequent groups of transactions
+ // will be permitted.
+ if ($this->trans_strict === FALSE)
+ {
+ $this->_trans_status = TRUE;
+ }
+
+ log_message('debug', 'DB Transaction Failure');
+ return FALSE;
+ }
+
+ $this->trans_commit();
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Lets you retrieve the transaction flag to determine if it has failed
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_status()
+ {
+ return $this->_trans_status;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Compile Bindings
+ *
+ * @access public
+ * @param string the sql statement
+ * @param array an array of bind data
+ * @return string
+ */
+ function compile_binds($sql, $binds)
+ {
+ if (strpos($sql, $this->bind_marker) === FALSE)
+ {
+ return $sql;
+ }
+
+ if ( ! is_array($binds))
+ {
+ $binds = array($binds);
+ }
+
+ // Get the sql segments around the bind markers
+ $segments = explode($this->bind_marker, $sql);
+
+ // The count of bind should be 1 less then the count of segments
+ // If there are more bind arguments trim it down
+ if (count($binds) >= count($segments)) {
+ $binds = array_slice($binds, 0, count($segments)-1);
+ }
+
+ // Construct the binded query
+ $result = $segments[0];
+ $i = 0;
+ foreach ($binds as $bind)
+ {
+ $result .= $this->escape($bind);
+ $result .= $segments[++$i];
+ }
+
+ return $result;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Determines if a query is a "write" type.
+ *
+ * @access public
+ * @param string An SQL query string
+ * @return boolean
+ */
+ function is_write_type($sql)
+ {
+ if ( ! preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i', $sql))
+ {
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Calculate the aggregate query elapsed time
+ *
+ * @access public
+ * @param integer The number of decimal places
+ * @return integer
+ */
+ function elapsed_time($decimals = 6)
+ {
+ return number_format($this->benchmark, $decimals);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Returns the total number of queries
+ *
+ * @access public
+ * @return integer
+ */
+ function total_queries()
+ {
+ return $this->query_count;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Returns the last query that was executed
+ *
+ * @access public
+ * @return void
+ */
+ function last_query()
+ {
+ return end($this->queries);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * "Smart" Escape String
+ *
+ * Escapes data based on type
+ * Sets boolean and null types
+ *
+ * @access public
+ * @param string
+ * @return integer
+ */
+ function escape($str)
+ {
+ switch (gettype($str))
+ {
+ case 'string' : $str = "'".$this->escape_str($str)."'";
+ break;
+ case 'boolean' : $str = ($str === FALSE) ? 0 : 1;
+ break;
+ default : $str = ($str === NULL) ? 'NULL' : $str;
+ break;
+ }
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Primary
+ *
+ * Retrieves the primary key. It assumes that the row in the first
+ * position is the primary key
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function primary($table = '')
+ {
+ $fields = $this->list_fields($table);
+
+ if ( ! is_array($fields))
+ {
+ return FALSE;
+ }
+
+ return current($fields);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Returns an array of table names
+ *
+ * @access public
+ * @return array
+ */
+ function list_tables($constrain_by_prefix = FALSE)
+ {
+ // Is there a cached result?
+ if (isset($this->data_cache['table_names']))
+ {
+ return $this->data_cache['table_names'];
+ }
+
+ if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix)))
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_unsupported_function');
+ }
+ return FALSE;
+ }
+
+ $retval = array();
+ $query = $this->query($sql);
+
+ if ($query->num_rows() > 0)
+ {
+ foreach($query->result_array() as $row)
+ {
+ if (isset($row['TABLE_NAME']))
+ {
+ $retval[] = $row['TABLE_NAME'];
+ }
+ else
+ {
+ $retval[] = array_shift($row);
+ }
+ }
+ }
+
+ $this->data_cache['table_names'] = $retval;
+ return $this->data_cache['table_names'];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Determine if a particular table exists
+ * @access public
+ * @return boolean
+ */
+ function table_exists($table_name)
+ {
+ return ( ! in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables())) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch MySQL Field Names
+ *
+ * @access public
+ * @param string the table name
+ * @return array
+ */
+ 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 == '')
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_field_param_missing');
+ }
+ return FALSE;
+ }
+
+ if (FALSE === ($sql = $this->_list_columns($this->_protect_identifiers($table, TRUE, NULL, FALSE))))
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_unsupported_function');
+ }
+ return FALSE;
+ }
+
+ $query = $this->query($sql);
+
+ $retval = array();
+ foreach($query->result_array() as $row)
+ {
+ if (isset($row['COLUMN_NAME']))
+ {
+ $retval[] = $row['COLUMN_NAME'];
+ }
+ else
+ {
+ $retval[] = current($row);
+ }
+ }
+
+ $this->data_cache['field_names'][$table] = $retval;
+ return $this->data_cache['field_names'][$table];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Determine if a particular field exists
+ * @access public
+ * @param string
+ * @param string
+ * @return boolean
+ */
+ function field_exists($field_name, $table_name)
+ {
+ return ( ! in_array($field_name, $this->list_fields($table_name))) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Returns an object with field data
+ *
+ * @access public
+ * @param string the table name
+ * @return object
+ */
+ function field_data($table = '')
+ {
+ if ($table == '')
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_field_param_missing');
+ }
+ return FALSE;
+ }
+
+ $query = $this->query($this->_field_data($this->_protect_identifiers($table, TRUE, NULL, FALSE)));
+
+ return $query->field_data();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate an insert string
+ *
+ * @access public
+ * @param string the table upon which the query will be performed
+ * @param array an associative array data of key/values
+ * @return string
+ */
+ function insert_string($table, $data)
+ {
+ $fields = array();
+ $values = array();
+
+ foreach($data as $key => $val)
+ {
+ $fields[] = $this->_escape_identifiers($key);
+ $values[] = $this->escape($val);
+ }
+
+ return $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate an update string
+ *
+ * @access public
+ * @param string the table upon which the query will be performed
+ * @param array an associative array data of key/values
+ * @param mixed the "where" statement
+ * @return string
+ */
+ function update_string($table, $data, $where)
+ {
+ if ($where == '')
+ {
+ return false;
+ }
+
+ $fields = array();
+ foreach($data as $key => $val)
+ {
+ $fields[$this->_protect_identifiers($key)] = $this->escape($val);
+ }
+
+ if ( ! is_array($where))
+ {
+ $dest = array($where);
+ }
+ else
+ {
+ $dest = array();
+ foreach ($where as $key => $val)
+ {
+ $prefix = (count($dest) == 0) ? '' : ' AND ';
+
+ if ($val !== '')
+ {
+ if ( ! $this->_has_operator($key))
+ {
+ $key .= ' =';
+ }
+
+ $val = ' '.$this->escape($val);
+ }
+
+ $dest[] = $prefix.$key.$val;
+ }
+ }
+
+ return $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $dest);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Tests whether the string has an SQL operator
+ *
+ * @access private
+ * @param string
+ * @return bool
+ */
+ function _has_operator($str)
+ {
+ $str = trim($str);
+ if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str))
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Enables a native PHP function to be run, using a platform agnostic wrapper.
+ *
+ * @access public
+ * @param string the function name
+ * @param mixed any parameters needed by the function
+ * @return mixed
+ */
+ function call_function($function)
+ {
+ $driver = ($this->dbdriver == 'postgre') ? 'pg_' : $this->dbdriver.'_';
+
+ if (FALSE === strpos($driver, $function))
+ {
+ $function = $driver.$function;
+ }
+
+ if ( ! function_exists($function))
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_unsupported_function');
+ }
+ return FALSE;
+ }
+ else
+ {
+ $args = (func_num_args() > 1) ? array_splice(func_get_args(), 1) : null;
+
+ return call_user_func_array($function, $args);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Cache Directory Path
+ *
+ * @access public
+ * @param string the path to the cache directory
+ * @return void
+ */
+ function cache_set_path($path = '')
+ {
+ $this->cachedir = $path;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Enable Query Caching
+ *
+ * @access public
+ * @return void
+ */
+ function cache_on()
+ {
+ $this->cache_on = TRUE;
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Disable Query Caching
+ *
+ * @access public
+ * @return void
+ */
+ function cache_off()
+ {
+ $this->cache_on = FALSE;
+ return FALSE;
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete the cache files associated with a particular URI
+ *
+ * @access public
+ * @return void
+ */
+ function cache_delete($segment_one = '', $segment_two = '')
+ {
+ if ( ! $this->_cache_init())
+ {
+ return FALSE;
+ }
+ return $this->CACHE->delete($segment_one, $segment_two);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete All cache files
+ *
+ * @access public
+ * @return void
+ */
+ function cache_delete_all()
+ {
+ if ( ! $this->_cache_init())
+ {
+ return FALSE;
+ }
+
+ return $this->CACHE->delete_all();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize the Cache Class
+ *
+ * @access private
+ * @return void
+ */
+ function _cache_init()
+ {
+ if (is_object($this->CACHE) AND class_exists('CI_DB_Cache'))
+ {
+ return TRUE;
+ }
+
+ if ( ! @include(BASEPATH.'database/DB_cache'.EXT))
+ {
+ return $this->cache_off();
+ }
+
+ $this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Close DB Connection
+ *
+ * @access public
+ * @return void
+ */
+ function close()
+ {
+ if (is_resource($this->conn_id) OR is_object($this->conn_id))
+ {
+ $this->_close($this->conn_id);
+ }
+ $this->conn_id = FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Display an error message
+ *
+ * @access public
+ * @param string the error message
+ * @param string any "swap" values
+ * @param boolean whether to localize the message
+ * @return string sends the application/error_db.php template
+ */
+ function display_error($error = '', $swap = '', $native = FALSE)
+ {
+ $LANG =& load_class('Language');
+ $LANG->load('db');
+
+ $heading = $LANG->line('db_error_heading');
+
+ if ($native == TRUE)
+ {
+ $message = $error;
+ }
+ else
+ {
+ $message = ( ! is_array($error)) ? array(str_replace('%s', $swap, $LANG->line($error))) : $error;
+ }
+
+ $error =& load_class('Exceptions');
+ echo $error->show_error($heading, $message, 'error_db');
+ exit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Protect Identifiers
+ *
+ * This function adds backticks if appropriate based on db type
+ *
+ * @access private
+ * @param mixed the item to escape
+ * @return mixed the item with backticks
+ */
+ function protect_identifiers($item, $prefix_single = FALSE)
+ {
+ return $this->_protect_identifiers($item, $prefix_single);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Protect Identifiers
+ *
+ * This function is used extensively by the Active Record class, and by
+ * a couple functions in this class.
+ * It takes a column or table name (optionally with an alias) and inserts
+ * 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:
+ *
+ * SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table
+ *
+ * Or a query with aliasing:
+ *
+ * SELECT m.member_id, m.member_name FROM members AS m
+ *
+ * Since the column name can include up to four segments (host, DB, table, column)
+ * or also have an alias prefix, we need to do a bit of work to figure this out and
+ * insert the table prefix (if it exists) in the proper position, and escape only
+ * the correct identifiers.
+ *
+ * @access private
+ * @param string
+ * @param bool
+ * @param mixed
+ * @param bool
+ * @return string
+ */
+ function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE)
+ {
+ if ( ! is_bool($protect_identifiers))
+ {
+ $protect_identifiers = $this->_protect_identifiers;
+ }
+
+ // Convert tabs or multiple spaces into single spaces
+ $item = preg_replace('/[\t| ]+/', ' ', $item);
+
+ // If the item has an alias declaration we remove it and set it aside.
+ // Basically we remove everything to the right of the first space
+ $alias = '';
+ if (strpos($item, ' ') !== FALSE)
+ {
+ $alias = strstr($item, " ");
+ $item = substr($item, 0, - strlen($alias));
+ }
+
+ // Break the string apart if it contains periods, then insert the table prefix
+ // in the correct location, assuming the period doesn't indicate that we're dealing
+ // with an alias. While we're at it, we will escape the components
+ if (strpos($item, '.') !== FALSE)
+ {
+ $parts = explode('.', $item);
+
+ // Does the first segment of the exploded item match
+ // one of the aliases previously identified? If so,
+ // we have nothing more to do other then escape the item
+ if (in_array($parts[0], $this->ar_aliased_tables))
+ {
+ if ($protect_identifiers === TRUE)
+ {
+ foreach ($parts as $key => $val)
+ {
+ if ( ! in_array($val, $this->_reserved_identifiers))
+ {
+ $parts[$key] = $this->_escape_identifiers($val);
+ }
+ }
+
+ $item = implode('.', $parts);
+ }
+ return $item.$alias;
+ }
+
+ // Is there a table prefix defined in the config file? If not, no need to do anything
+ if ($this->dbprefix != '')
+ {
+ // We now add the table prefix based on some logic.
+ // Do we have 4 segments (hostname.database.table.column)?
+ // If so, we add the table prefix to the column name in the 3rd segment.
+ if (isset($parts[3]))
+ {
+ $i = 2;
+ }
+ // Do we have 3 segments (database.table.column)?
+ // If so, we add the table prefix to the column name in 2nd position
+ elseif (isset($parts[2]))
+ {
+ $i = 1;
+ }
+ // Do we have 2 segments (table.column)?
+ // If so, we add the table prefix to the column name in 1st segment
+ else
+ {
+ $i = 0;
+ }
+
+ // This flag is set when the supplied $item does not contain a field name.
+ // This can happen when this function is being called from a JOIN.
+ if ($field_exists == FALSE)
+ {
+ $i++;
+ }
+
+ // We only add the table prefix if it does not already exist
+ if (substr($parts[$i], 0, strlen($this->dbprefix)) != $this->dbprefix)
+ {
+ $parts[$i] = $this->dbprefix.$parts[$i];
+ }
+
+ // Put the parts back together
+ $item = implode('.', $parts);
+ }
+
+ if ($protect_identifiers === TRUE)
+ {
+ $item = $this->_escape_identifiers($item);
+ }
+
+ return $item.$alias;
+ }
+
+ // This is basically a bug fix for queries that use MAX, MIN, etc.
+ // If a parenthesis is found we know that we do not need to
+ // escape the data or add a prefix. There's probably a more graceful
+ // way to deal with this, but I'm not thinking of it -- Rick
+ if (strpos($item, '(') !== FALSE)
+ {
+ return $item.$alias;
+ }
+
+ // Is there a table prefix? If not, no need to insert it
+ if ($this->dbprefix != '')
+ {
+ // Do we prefix an item with no segments?
+ if ($prefix_single == TRUE AND substr($item, 0, strlen($this->dbprefix)) != $this->dbprefix)
+ {
+ $item = $this->dbprefix.$item;
+ }
+ }
+
+ if ($protect_identifiers === TRUE AND ! in_array($item, $this->_reserved_identifiers))
+ {
+ $item = $this->_escape_identifiers($item);
+ }
+
+ return $item.$alias;
+ }
+
+
+}
+
+
+/* End of file DB_driver.php */
/* Location: ./system/database/DB_driver.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * Code Igniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Database Utility Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_forge {\r
-\r
- var $fields = array();\r
- var $keys = array();\r
- var $primary_keys = array();\r
- var $db_char_set = '';\r
-\r
- /**\r
- * Constructor\r
- *\r
- * Grabs the CI super object instance so we can access it.\r
- *\r
- */ \r
- function CI_DB_forge()\r
- {\r
- // Assign the main database object to $this->db\r
- $CI =& get_instance();\r
- $this->db =& $CI->db;\r
- log_message('debug', "Database Forge Class Initialized");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access public\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function create_database($db_name)\r
- {\r
- $sql = $this->_create_database($db_name);\r
- \r
- if (is_bool($sql))\r
- {\r
- return $sql;\r
- }\r
- \r
- return $this->db->query($sql);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access public\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function drop_database($db_name)\r
- {\r
- $sql = $this->_drop_database($db_name);\r
- \r
- if (is_bool($sql))\r
- {\r
- return $sql;\r
- }\r
- \r
- return $this->db->query($sql);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Add Key\r
- *\r
- * @access public\r
- * @param string key\r
- * @param string type\r
- * @return void\r
- */\r
- function add_key($key = '', $primary = FALSE)\r
- {\r
- if (is_array($key))\r
- {\r
- foreach($key as $one)\r
- {\r
- $this->add_key($one, $primary);\r
- }\r
- \r
- return;\r
- }\r
- \r
- if ($key == '')\r
- {\r
- show_error('Key information is required for that operation.');\r
- }\r
- \r
- if ($primary === TRUE)\r
- {\r
- $this->primary_keys[] = $key;\r
- }\r
- else\r
- {\r
- $this->keys[] = $key;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Add Field\r
- *\r
- * @access public\r
- * @param string collation\r
- * @return void\r
- */\r
- function add_field($field = '')\r
- {\r
- if ($field == '')\r
- {\r
- show_error('Field information is required.');\r
- }\r
- \r
- if (is_string($field))\r
- {\r
- if ($field == 'id')\r
- {\r
- $this->add_field(array(\r
- 'id' => array(\r
- 'type' => 'INT',\r
- 'constraint' => 9,\r
- 'auto_increment' => TRUE\r
- )\r
- ));\r
- $this->add_key('id', TRUE);\r
- }\r
- else\r
- {\r
- if (strpos($field, ' ') === FALSE)\r
- {\r
- show_error('Field information is required for that operation.');\r
- }\r
- \r
- $this->fields[] = $field;\r
- }\r
- }\r
- \r
- if (is_array($field))\r
- {\r
- $this->fields = array_merge($this->fields, $field);\r
- }\r
- \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Create Table\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return bool\r
- */\r
- function create_table($table = '', $if_not_exists = FALSE)\r
- { \r
- if ($table == '')\r
- {\r
- show_error('A table name is required for that operation.');\r
- }\r
- \r
- if (count($this->fields) == 0)\r
- { \r
- show_error('Field information is required.');\r
- }\r
-\r
- $sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists);\r
- \r
- $this->_reset();\r
- return $this->db->query($sql);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop Table\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return bool\r
- */\r
- function drop_table($table_name)\r
- {\r
- $sql = $this->_drop_table($this->db->dbprefix.$table_name);\r
- \r
- if (is_bool($sql))\r
- {\r
- return $sql;\r
- }\r
- \r
- return $this->db->query($sql);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rename Table\r
- *\r
- * @access public\r
- * @param string the old table name\r
- * @param string the new table name\r
- * @return bool\r
- */\r
- function rename_table($table_name, $new_table_name)\r
- {\r
- if ($table_name == '' OR $new_table_name == '')\r
- {\r
- show_error('A table name is required for that operation.');\r
- }\r
- \r
- $sql = $this->_rename_table($table_name, $new_table_name);\r
- return $this->db->query($sql);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Column Add\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param string the column name\r
- * @param string the column definition\r
- * @return bool\r
- */\r
- function add_column($table = '', $field = array(), $after_field = '')\r
- {\r
- if ($table == '')\r
- {\r
- show_error('A table name is required for that operation.');\r
- }\r
-\r
- // add field info into field array, but we can only do one at a time\r
- // so only grab the first field in the event there are more then one\r
- $this->add_field(array_slice($field, 0, 1));\r
-\r
- if (count($this->fields) == 0)\r
- { \r
- show_error('Field information is required.');\r
- }\r
-\r
- $sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field);\r
-\r
- $this->_reset();\r
- return $this->db->query($sql);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Column Drop\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param string the column name\r
- * @return bool\r
- */\r
- function drop_column($table = '', $column_name = '')\r
- {\r
- \r
- if ($table == '')\r
- {\r
- show_error('A table name is required for that operation.');\r
- }\r
-\r
- if ($column_name == '')\r
- {\r
- show_error('A column name is required for that operation.');\r
- }\r
-\r
- $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);\r
- \r
- return $this->db->query($sql);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Column Modify\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param string the column name\r
- * @param string the column definition\r
- * @return bool\r
- */\r
- function modify_column($table = '', $field = array())\r
- {\r
- if ($table == '')\r
- {\r
- show_error('A table name is required for that operation.');\r
- }\r
-\r
- // add field info into field array, but we can only do one at a time\r
- // so only grab the first field in the event there are more then one\r
- $this->add_field(array_slice($field, 0, 1));\r
-\r
- if (count($this->fields) == 0)\r
- { \r
- show_error('Field information is required.');\r
- }\r
-\r
- $sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields);\r
-\r
- $this->_reset();\r
- return $this->db->query($sql);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Reset\r
- *\r
- * Resets table creation vars\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _reset()\r
- {\r
- $this->fields = array();\r
- $this->keys = array();\r
- $this->primary_keys = array();\r
- }\r
-\r
-}\r
-\r
-/* End of file DB_forge.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Database Utility Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_forge {
+
+ var $fields = array();
+ var $keys = array();
+ var $primary_keys = array();
+ var $db_char_set = '';
+
+ /**
+ * Constructor
+ *
+ * Grabs the CI super object instance so we can access it.
+ *
+ */
+ function CI_DB_forge()
+ {
+ // Assign the main database object to $this->db
+ $CI =& get_instance();
+ $this->db =& $CI->db;
+ log_message('debug', "Database Forge Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create database
+ *
+ * @access public
+ * @param string the database name
+ * @return bool
+ */
+ function create_database($db_name)
+ {
+ $sql = $this->_create_database($db_name);
+
+ if (is_bool($sql))
+ {
+ return $sql;
+ }
+
+ return $this->db->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access public
+ * @param string the database name
+ * @return bool
+ */
+ function drop_database($db_name)
+ {
+ $sql = $this->_drop_database($db_name);
+
+ if (is_bool($sql))
+ {
+ return $sql;
+ }
+
+ return $this->db->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add Key
+ *
+ * @access public
+ * @param string key
+ * @param string type
+ * @return void
+ */
+ function add_key($key = '', $primary = FALSE)
+ {
+ if (is_array($key))
+ {
+ foreach($key as $one)
+ {
+ $this->add_key($one, $primary);
+ }
+
+ return;
+ }
+
+ if ($key == '')
+ {
+ show_error('Key information is required for that operation.');
+ }
+
+ if ($primary === TRUE)
+ {
+ $this->primary_keys[] = $key;
+ }
+ else
+ {
+ $this->keys[] = $key;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add Field
+ *
+ * @access public
+ * @param string collation
+ * @return void
+ */
+ function add_field($field = '')
+ {
+ if ($field == '')
+ {
+ show_error('Field information is required.');
+ }
+
+ if (is_string($field))
+ {
+ if ($field == 'id')
+ {
+ $this->add_field(array(
+ 'id' => array(
+ 'type' => 'INT',
+ 'constraint' => 9,
+ 'auto_increment' => TRUE
+ )
+ ));
+ $this->add_key('id', TRUE);
+ }
+ else
+ {
+ if (strpos($field, ' ') === FALSE)
+ {
+ show_error('Field information is required for that operation.');
+ }
+
+ $this->fields[] = $field;
+ }
+ }
+
+ if (is_array($field))
+ {
+ $this->fields = array_merge($this->fields, $field);
+ }
+
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create Table
+ *
+ * @access public
+ * @param string the table name
+ * @return bool
+ */
+ function create_table($table = '', $if_not_exists = FALSE)
+ {
+ if ($table == '')
+ {
+ show_error('A table name is required for that operation.');
+ }
+
+ if (count($this->fields) == 0)
+ {
+ show_error('Field information is required.');
+ }
+
+ $sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists);
+
+ $this->_reset();
+ return $this->db->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop Table
+ *
+ * @access public
+ * @param string the table name
+ * @return bool
+ */
+ function drop_table($table_name)
+ {
+ $sql = $this->_drop_table($this->db->dbprefix.$table_name);
+
+ if (is_bool($sql))
+ {
+ return $sql;
+ }
+
+ return $this->db->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rename Table
+ *
+ * @access public
+ * @param string the old table name
+ * @param string the new table name
+ * @return bool
+ */
+ function rename_table($table_name, $new_table_name)
+ {
+ if ($table_name == '' OR $new_table_name == '')
+ {
+ show_error('A table name is required for that operation.');
+ }
+
+ $sql = $this->_rename_table($table_name, $new_table_name);
+ return $this->db->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Column Add
+ *
+ * @access public
+ * @param string the table name
+ * @param string the column name
+ * @param string the column definition
+ * @return bool
+ */
+ function add_column($table = '', $field = array(), $after_field = '')
+ {
+ if ($table == '')
+ {
+ show_error('A table name is required for that operation.');
+ }
+
+ // add field info into field array, but we can only do one at a time
+ // so only grab the first field in the event there are more then one
+ $this->add_field(array_slice($field, 0, 1));
+
+ if (count($this->fields) == 0)
+ {
+ show_error('Field information is required.');
+ }
+
+ $sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field);
+
+ $this->_reset();
+ return $this->db->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Column Drop
+ *
+ * @access public
+ * @param string the table name
+ * @param string the column name
+ * @return bool
+ */
+ function drop_column($table = '', $column_name = '')
+ {
+
+ if ($table == '')
+ {
+ show_error('A table name is required for that operation.');
+ }
+
+ if ($column_name == '')
+ {
+ show_error('A column name is required for that operation.');
+ }
+
+ $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name);
+
+ return $this->db->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Column Modify
+ *
+ * @access public
+ * @param string the table name
+ * @param string the column name
+ * @param string the column definition
+ * @return bool
+ */
+ function modify_column($table = '', $field = array())
+ {
+ if ($table == '')
+ {
+ show_error('A table name is required for that operation.');
+ }
+
+ // add field info into field array, but we can only do one at a time
+ // so only grab the first field in the event there are more then one
+ $this->add_field(array_slice($field, 0, 1));
+
+ if (count($this->fields) == 0)
+ {
+ show_error('Field information is required.');
+ }
+
+ $sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields);
+
+ $this->_reset();
+ return $this->db->query($sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Reset
+ *
+ * Resets table creation vars
+ *
+ * @access private
+ * @return void
+ */
+ function _reset()
+ {
+ $this->fields = array();
+ $this->keys = array();
+ $this->primary_keys = array();
+ }
+
+}
+
+/* End of file DB_forge.php */
/* Location: ./system/database/DB_forge.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Database Result Class\r
- *\r
- * This is the platform-independent result class.\r
- * This class will not be called directly. Rather, the adapter\r
- * class for the specific database will extend and instantiate it.\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_result {\r
-\r
- var $conn_id = NULL;\r
- var $result_id = NULL;\r
- var $result_array = array();\r
- var $result_object = array();\r
- var $current_row = 0;\r
- var $num_rows = 0;\r
- var $row_data = NULL;\r
-\r
-\r
- /**\r
- * Query result. Acts as a wrapper function for the following functions.\r
- *\r
- * @access public\r
- * @param string can be "object" or "array"\r
- * @return mixed either a result object or array \r
- */ \r
- function result($type = 'object')\r
- { \r
- return ($type == 'object') ? $this->result_object() : $this->result_array();\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Query result. "object" version.\r
- *\r
- * @access public\r
- * @return object\r
- */ \r
- function result_object()\r
- {\r
- if (count($this->result_object) > 0)\r
- {\r
- return $this->result_object;\r
- }\r
- \r
- // In the event that query caching is on the result_id variable \r
- // will return FALSE since there isn't a valid SQL resource so \r
- // we'll simply return an empty array.\r
- if ($this->result_id === FALSE OR $this->num_rows() == 0)\r
- {\r
- return array();\r
- }\r
-\r
- $this->_data_seek(0);\r
- while ($row = $this->_fetch_object())\r
- {\r
- $this->result_object[] = $row;\r
- }\r
- \r
- return $this->result_object;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Query result. "array" version.\r
- *\r
- * @access public\r
- * @return array\r
- */ \r
- function result_array()\r
- {\r
- if (count($this->result_array) > 0)\r
- {\r
- return $this->result_array;\r
- }\r
-\r
- // In the event that query caching is on the result_id variable \r
- // will return FALSE since there isn't a valid SQL resource so \r
- // we'll simply return an empty array.\r
- if ($this->result_id === FALSE OR $this->num_rows() == 0)\r
- {\r
- return array();\r
- }\r
-\r
- $this->_data_seek(0);\r
- while ($row = $this->_fetch_assoc())\r
- {\r
- $this->result_array[] = $row;\r
- }\r
- \r
- return $this->result_array;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Query result. Acts as a wrapper function for the following functions.\r
- *\r
- * @access public\r
- * @param string\r
- * @param string can be "object" or "array"\r
- * @return mixed either a result object or array \r
- */ \r
- function row($n = 0, $type = 'object')\r
- {\r
- if ( ! is_numeric($n))\r
- {\r
- // We cache the row data for subsequent uses\r
- if ( ! is_array($this->row_data))\r
- {\r
- $this->row_data = $this->row_array(0);\r
- }\r
- \r
- // array_key_exists() instead of isset() to allow for MySQL NULL values\r
- if (array_key_exists($n, $this->row_data))\r
- {\r
- return $this->row_data[$n];\r
- }\r
- // reset the $n variable if the result was not achieved \r
- $n = 0;\r
- }\r
- \r
- return ($type == 'object') ? $this->row_object($n) : $this->row_array($n);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Assigns an item into a particular column slot\r
- *\r
- * @access public\r
- * @return object\r
- */ \r
- function set_row($key, $value = NULL)\r
- {\r
- // We cache the row data for subsequent uses\r
- if ( ! is_array($this->row_data))\r
- {\r
- $this->row_data = $this->row_array(0);\r
- }\r
- \r
- if (is_array($key))\r
- {\r
- foreach ($key as $k => $v)\r
- {\r
- $this->row_data[$k] = $v;\r
- }\r
- \r
- return;\r
- }\r
- \r
- if ($key != '' AND ! is_null($value))\r
- {\r
- $this->row_data[$key] = $value;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Returns a single result row - object version\r
- *\r
- * @access public\r
- * @return object\r
- */ \r
- function row_object($n = 0)\r
- {\r
- $result = $this->result_object();\r
- \r
- if (count($result) == 0)\r
- {\r
- return $result;\r
- }\r
-\r
- if ($n != $this->current_row AND isset($result[$n]))\r
- {\r
- $this->current_row = $n;\r
- }\r
-\r
- return $result[$this->current_row];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Returns a single result row - array version\r
- *\r
- * @access public\r
- * @return array\r
- */ \r
- function row_array($n = 0)\r
- {\r
- $result = $this->result_array();\r
-\r
- if (count($result) == 0)\r
- {\r
- return $result;\r
- }\r
- \r
- if ($n != $this->current_row AND isset($result[$n]))\r
- {\r
- $this->current_row = $n;\r
- }\r
- \r
- return $result[$this->current_row];\r
- }\r
-\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Returns the "first" row\r
- *\r
- * @access public\r
- * @return object\r
- */ \r
- function first_row($type = 'object')\r
- {\r
- $result = $this->result($type);\r
-\r
- if (count($result) == 0)\r
- {\r
- return $result;\r
- }\r
- return $result[0];\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Returns the "last" row\r
- *\r
- * @access public\r
- * @return object\r
- */ \r
- function last_row($type = 'object')\r
- {\r
- $result = $this->result($type);\r
-\r
- if (count($result) == 0)\r
- {\r
- return $result;\r
- }\r
- return $result[count($result) -1];\r
- } \r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Returns the "next" row\r
- *\r
- * @access public\r
- * @return object\r
- */ \r
- function next_row($type = 'object')\r
- {\r
- $result = $this->result($type);\r
-\r
- if (count($result) == 0)\r
- {\r
- return $result;\r
- }\r
-\r
- if (isset($result[$this->current_row + 1]))\r
- {\r
- ++$this->current_row;\r
- }\r
- \r
- return $result[$this->current_row];\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Returns the "previous" row\r
- *\r
- * @access public\r
- * @return object\r
- */ \r
- function previous_row($type = 'object')\r
- {\r
- $result = $this->result($type);\r
-\r
- if (count($result) == 0)\r
- {\r
- return $result;\r
- }\r
-\r
- if (isset($result[$this->current_row - 1]))\r
- {\r
- --$this->current_row;\r
- }\r
- return $result[$this->current_row];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The following functions are normally overloaded by the identically named\r
- * methods in the platform-specific driver -- except when query caching\r
- * is used. When caching is enabled we do not load the other driver.\r
- * These functions are primarily here to prevent undefined function errors\r
- * when a cached result object is in use. They are not otherwise fully\r
- * operational due to the unavailability of the database resource IDs with\r
- * cached results.\r
- */\r
- function num_rows() { return $this->num_rows; }\r
- function num_fields() { return 0; }\r
- function list_fields() { return array(); }\r
- function field_data() { return array(); } \r
- function free_result() { return TRUE; }\r
- function _data_seek() { return TRUE; }\r
- function _fetch_assoc() { return array(); } \r
- function _fetch_object() { return array(); }\r
- \r
-}\r
-// END DB_result class\r
-\r
-/* End of file DB_result.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Database Result Class
+ *
+ * This is the platform-independent result class.
+ * This class will not be called directly. Rather, the adapter
+ * class for the specific database will extend and instantiate it.
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_result {
+
+ var $conn_id = NULL;
+ var $result_id = NULL;
+ var $result_array = array();
+ var $result_object = array();
+ var $current_row = 0;
+ var $num_rows = 0;
+ var $row_data = NULL;
+
+
+ /**
+ * Query result. Acts as a wrapper function for the following functions.
+ *
+ * @access public
+ * @param string can be "object" or "array"
+ * @return mixed either a result object or array
+ */
+ function result($type = 'object')
+ {
+ return ($type == 'object') ? $this->result_object() : $this->result_array();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Query result. "object" version.
+ *
+ * @access public
+ * @return object
+ */
+ function result_object()
+ {
+ if (count($this->result_object) > 0)
+ {
+ return $this->result_object;
+ }
+
+ // In the event that query caching is on the result_id variable
+ // will return FALSE since there isn't a valid SQL resource so
+ // we'll simply return an empty array.
+ if ($this->result_id === FALSE OR $this->num_rows() == 0)
+ {
+ return array();
+ }
+
+ $this->_data_seek(0);
+ while ($row = $this->_fetch_object())
+ {
+ $this->result_object[] = $row;
+ }
+
+ return $this->result_object;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Query result. "array" version.
+ *
+ * @access public
+ * @return array
+ */
+ function result_array()
+ {
+ if (count($this->result_array) > 0)
+ {
+ return $this->result_array;
+ }
+
+ // In the event that query caching is on the result_id variable
+ // will return FALSE since there isn't a valid SQL resource so
+ // we'll simply return an empty array.
+ if ($this->result_id === FALSE OR $this->num_rows() == 0)
+ {
+ return array();
+ }
+
+ $this->_data_seek(0);
+ while ($row = $this->_fetch_assoc())
+ {
+ $this->result_array[] = $row;
+ }
+
+ return $this->result_array;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Query result. Acts as a wrapper function for the following functions.
+ *
+ * @access public
+ * @param string
+ * @param string can be "object" or "array"
+ * @return mixed either a result object or array
+ */
+ function row($n = 0, $type = 'object')
+ {
+ if ( ! is_numeric($n))
+ {
+ // We cache the row data for subsequent uses
+ if ( ! is_array($this->row_data))
+ {
+ $this->row_data = $this->row_array(0);
+ }
+
+ // array_key_exists() instead of isset() to allow for MySQL NULL values
+ if (array_key_exists($n, $this->row_data))
+ {
+ return $this->row_data[$n];
+ }
+ // reset the $n variable if the result was not achieved
+ $n = 0;
+ }
+
+ return ($type == 'object') ? $this->row_object($n) : $this->row_array($n);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Assigns an item into a particular column slot
+ *
+ * @access public
+ * @return object
+ */
+ function set_row($key, $value = NULL)
+ {
+ // We cache the row data for subsequent uses
+ if ( ! is_array($this->row_data))
+ {
+ $this->row_data = $this->row_array(0);
+ }
+
+ if (is_array($key))
+ {
+ foreach ($key as $k => $v)
+ {
+ $this->row_data[$k] = $v;
+ }
+
+ return;
+ }
+
+ if ($key != '' AND ! is_null($value))
+ {
+ $this->row_data[$key] = $value;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Returns a single result row - object version
+ *
+ * @access public
+ * @return object
+ */
+ function row_object($n = 0)
+ {
+ $result = $this->result_object();
+
+ if (count($result) == 0)
+ {
+ return $result;
+ }
+
+ if ($n != $this->current_row AND isset($result[$n]))
+ {
+ $this->current_row = $n;
+ }
+
+ return $result[$this->current_row];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Returns a single result row - array version
+ *
+ * @access public
+ * @return array
+ */
+ function row_array($n = 0)
+ {
+ $result = $this->result_array();
+
+ if (count($result) == 0)
+ {
+ return $result;
+ }
+
+ if ($n != $this->current_row AND isset($result[$n]))
+ {
+ $this->current_row = $n;
+ }
+
+ return $result[$this->current_row];
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Returns the "first" row
+ *
+ * @access public
+ * @return object
+ */
+ function first_row($type = 'object')
+ {
+ $result = $this->result($type);
+
+ if (count($result) == 0)
+ {
+ return $result;
+ }
+ return $result[0];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Returns the "last" row
+ *
+ * @access public
+ * @return object
+ */
+ function last_row($type = 'object')
+ {
+ $result = $this->result($type);
+
+ if (count($result) == 0)
+ {
+ return $result;
+ }
+ return $result[count($result) -1];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Returns the "next" row
+ *
+ * @access public
+ * @return object
+ */
+ function next_row($type = 'object')
+ {
+ $result = $this->result($type);
+
+ if (count($result) == 0)
+ {
+ return $result;
+ }
+
+ if (isset($result[$this->current_row + 1]))
+ {
+ ++$this->current_row;
+ }
+
+ return $result[$this->current_row];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Returns the "previous" row
+ *
+ * @access public
+ * @return object
+ */
+ function previous_row($type = 'object')
+ {
+ $result = $this->result($type);
+
+ if (count($result) == 0)
+ {
+ return $result;
+ }
+
+ if (isset($result[$this->current_row - 1]))
+ {
+ --$this->current_row;
+ }
+ return $result[$this->current_row];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The following functions are normally overloaded by the identically named
+ * methods in the platform-specific driver -- except when query caching
+ * is used. When caching is enabled we do not load the other driver.
+ * These functions are primarily here to prevent undefined function errors
+ * when a cached result object is in use. They are not otherwise fully
+ * operational due to the unavailability of the database resource IDs with
+ * cached results.
+ */
+ function num_rows() { return $this->num_rows; }
+ function num_fields() { return 0; }
+ function list_fields() { return array(); }
+ function field_data() { return array(); }
+ function free_result() { return TRUE; }
+ function _data_seek() { return TRUE; }
+ function _fetch_assoc() { return array(); }
+ function _fetch_object() { return array(); }
+
+}
+// END DB_result class
+
+/* End of file DB_result.php */
/* Location: ./system/database/DB_result.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * Code Igniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Database Utility Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_utility extends CI_DB_forge {\r
-\r
- var $db;\r
- var $data_cache = array();\r
-\r
- /**\r
- * Constructor\r
- *\r
- * Grabs the CI super object instance so we can access it.\r
- *\r
- */ \r
- function CI_DB_utility()\r
- {\r
- // Assign the main database object to $this->db\r
- $CI =& get_instance();\r
- $this->db =& $CI->db;\r
- \r
- log_message('debug', "Database Utility Class Initialized");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * List databases\r
- *\r
- * @access public\r
- * @return bool\r
- */\r
- function list_databases()\r
- { \r
- // Is there a cached result?\r
- if (isset($this->data_cache['db_names']))\r
- {\r
- return $this->data_cache['db_names'];\r
- }\r
- \r
- $query = $this->db->query($this->_list_databases());\r
- $dbs = array();\r
- if ($query->num_rows() > 0)\r
- {\r
- foreach ($query->result_array() as $row)\r
- {\r
- $dbs[] = current($row);\r
- }\r
- }\r
- \r
- $this->data_cache['db_names'] = $dbs;\r
- return $this->data_cache['db_names'];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Optimize Table\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return bool\r
- */\r
- function optimize_table($table_name)\r
- {\r
- $sql = $this->_optimize_table($table_name);\r
- \r
- if (is_bool($sql))\r
- {\r
- show_error('db_must_use_set');\r
- }\r
- \r
- $query = $this->db->query($sql);\r
- $res = $query->result_array();\r
- \r
- // Note: Due to a bug in current() that affects some versions\r
- // of PHP we can not pass function call directly into it\r
- return current($res);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Optimize Database\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function optimize_database()\r
- {\r
- $result = array();\r
- foreach ($this->db->list_tables() as $table_name)\r
- {\r
- $sql = $this->_optimize_table($table_name);\r
- \r
- if (is_bool($sql))\r
- {\r
- return $sql;\r
- }\r
- \r
- $query = $this->db->query($sql);\r
- \r
- // Build the result array...\r
- // Note: Due to a bug in current() that affects some versions\r
- // of PHP we can not pass function call directly into it\r
- $res = $query->result_array();\r
- $res = current($res);\r
- $key = str_replace($this->db->database.'.', '', current($res));\r
- $keys = array_keys($res);\r
- unset($res[$keys[0]]);\r
- \r
- $result[$key] = $res;\r
- }\r
-\r
- return $result;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Repair Table\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return bool\r
- */\r
- function repair_table($table_name)\r
- {\r
- $sql = $this->_repair_table($table_name);\r
- \r
- if (is_bool($sql))\r
- {\r
- return $sql;\r
- }\r
- \r
- $query = $this->db->query($sql);\r
- \r
- // Note: Due to a bug in current() that affects some versions\r
- // of PHP we can not pass function call directly into it\r
- $res = $query->result_array();\r
- return current($res);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Generate CSV from a query result object\r
- *\r
- * @access public\r
- * @param object The query result object\r
- * @param string The delimiter - comma by default\r
- * @param string The newline character - \n by default\r
- * @param string The enclosure - double quote by default\r
- * @return string\r
- */\r
- function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')\r
- {\r
- if ( ! is_object($query) OR ! method_exists($query, 'field_names'))\r
- {\r
- show_error('You must submit a valid result object');\r
- } \r
- \r
- $out = '';\r
- \r
- // First generate the headings from the table column names\r
- foreach ($query->list_fields() as $name)\r
- {\r
- $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;\r
- }\r
- \r
- $out = rtrim($out);\r
- $out .= $newline;\r
- \r
- // Next blast through the result array and build out the rows\r
- foreach ($query->result_array() as $row)\r
- {\r
- foreach ($row as $item)\r
- {\r
- $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim; \r
- }\r
- $out = rtrim($out);\r
- $out .= $newline;\r
- }\r
-\r
- return $out;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Generate XML data from a query result object\r
- *\r
- * @access public\r
- * @param object The query result object\r
- * @param array Any preferences\r
- * @return string\r
- */\r
- function xml_from_result($query, $params = array())\r
- {\r
- if ( ! is_object($query) OR ! method_exists($query, 'field_names'))\r
- {\r
- show_error('You must submit a valid result object');\r
- }\r
- \r
- // Set our default values\r
- foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val)\r
- {\r
- if ( ! isset($params[$key]))\r
- {\r
- $params[$key] = $val;\r
- }\r
- }\r
- \r
- // Create variables for convenience\r
- extract($params);\r
- \r
- // Load the xml helper\r
- $CI =& get_instance();\r
- $CI->load->helper('xml');\r
-\r
- // Generate the result\r
- $xml = "<{$root}>".$newline;\r
- foreach ($query->result_array() as $row)\r
- {\r
- $xml .= $tab."<{$element}>".$newline;\r
- \r
- foreach ($row as $key => $val)\r
- {\r
- $xml .= $tab.$tab."<{$key}>".xml_convert($val)."</{$key}>".$newline;\r
- }\r
- $xml .= $tab."</{$element}>".$newline;\r
- }\r
- $xml .= "</$root>".$newline;\r
- \r
- return $xml;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Database Backup\r
- *\r
- * @access public\r
- * @return void\r
- */\r
- function backup($params = array())\r
- {\r
- // If the parameters have not been submitted as an\r
- // array then we know that it is simply the table\r
- // name, which is a valid short cut.\r
- if (is_string($params))\r
- {\r
- $params = array('tables' => $params);\r
- }\r
- \r
- // ------------------------------------------------------\r
- \r
- // Set up our default preferences\r
- $prefs = array(\r
- 'tables' => array(),\r
- 'ignore' => array(),\r
- 'filename' => '',\r
- 'format' => 'gzip', // gzip, zip, txt\r
- 'add_drop' => TRUE,\r
- 'add_insert' => TRUE,\r
- 'newline' => "\n"\r
- );\r
-\r
- // Did the user submit any preferences? If so set them....\r
- if (count($params) > 0)\r
- {\r
- foreach ($prefs as $key => $val)\r
- {\r
- if (isset($params[$key]))\r
- {\r
- $prefs[$key] = $params[$key];\r
- }\r
- }\r
- }\r
-\r
- // ------------------------------------------------------\r
-\r
- // Are we backing up a complete database or individual tables? \r
- // If no table names were submitted we'll fetch the entire table list\r
- if (count($prefs['tables']) == 0)\r
- {\r
- $prefs['tables'] = $this->db->list_tables();\r
- }\r
- \r
- // ------------------------------------------------------\r
-\r
- // Validate the format\r
- if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE))\r
- {\r
- $prefs['format'] = 'txt';\r
- }\r
-\r
- // ------------------------------------------------------\r
-\r
- // Is the encoder supported? If not, we'll either issue an\r
- // error or use plain text depending on the debug settings\r
- if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode'))\r
- OR ($prefs['format'] == 'zip' AND ! @function_exists('gzcompress')))\r
- {\r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unsuported_compression');\r
- }\r
- \r
- $prefs['format'] = 'txt';\r
- }\r
-\r
- // ------------------------------------------------------\r
-\r
- // Set the filename if not provided - Only needed with Zip files\r
- if ($prefs['filename'] == '' AND $prefs['format'] == 'zip')\r
- {\r
- $prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database;\r
- $prefs['filename'] .= '_'.date('Y-m-d_H-i', time());\r
- }\r
-\r
- // ------------------------------------------------------\r
- \r
- // Was a Gzip file requested?\r
- if ($prefs['format'] == 'gzip')\r
- {\r
- return gzencode($this->_backup($prefs));\r
- }\r
-\r
- // ------------------------------------------------------\r
- \r
- // Was a text file requested?\r
- if ($prefs['format'] == 'txt')\r
- {\r
- return $this->_backup($prefs);\r
- }\r
-\r
- // ------------------------------------------------------\r
-\r
- // Was a Zip file requested? \r
- if ($prefs['format'] == 'zip')\r
- {\r
- // If they included the .zip file extension we'll remove it\r
- if (preg_match("|.+?\.zip$|", $prefs['filename']))\r
- {\r
- $prefs['filename'] = str_replace('.zip', '', $prefs['filename']);\r
- }\r
- \r
- // Tack on the ".sql" file extension if needed\r
- if ( ! preg_match("|.+?\.sql$|", $prefs['filename']))\r
- {\r
- $prefs['filename'] .= '.sql';\r
- }\r
-\r
- // Load the Zip class and output it\r
- \r
- $CI =& get_instance();\r
- $CI->load->library('zip');\r
- $CI->zip->add_data($prefs['filename'], $this->_backup($prefs)); \r
- return $CI->zip->get_zip();\r
- }\r
- \r
- }\r
-\r
-}\r
-\r
-\r
-/* End of file DB_utility.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Database Utility Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_utility extends CI_DB_forge {
+
+ var $db;
+ var $data_cache = array();
+
+ /**
+ * Constructor
+ *
+ * Grabs the CI super object instance so we can access it.
+ *
+ */
+ function CI_DB_utility()
+ {
+ // Assign the main database object to $this->db
+ $CI =& get_instance();
+ $this->db =& $CI->db;
+
+ log_message('debug', "Database Utility Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * List databases
+ *
+ * @access public
+ * @return bool
+ */
+ function list_databases()
+ {
+ // Is there a cached result?
+ if (isset($this->data_cache['db_names']))
+ {
+ return $this->data_cache['db_names'];
+ }
+
+ $query = $this->db->query($this->_list_databases());
+ $dbs = array();
+ if ($query->num_rows() > 0)
+ {
+ foreach ($query->result_array() as $row)
+ {
+ $dbs[] = current($row);
+ }
+ }
+
+ $this->data_cache['db_names'] = $dbs;
+ return $this->data_cache['db_names'];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Optimize Table
+ *
+ * @access public
+ * @param string the table name
+ * @return bool
+ */
+ function optimize_table($table_name)
+ {
+ $sql = $this->_optimize_table($table_name);
+
+ if (is_bool($sql))
+ {
+ show_error('db_must_use_set');
+ }
+
+ $query = $this->db->query($sql);
+ $res = $query->result_array();
+
+ // Note: Due to a bug in current() that affects some versions
+ // of PHP we can not pass function call directly into it
+ return current($res);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Optimize Database
+ *
+ * @access public
+ * @return array
+ */
+ function optimize_database()
+ {
+ $result = array();
+ foreach ($this->db->list_tables() as $table_name)
+ {
+ $sql = $this->_optimize_table($table_name);
+
+ if (is_bool($sql))
+ {
+ return $sql;
+ }
+
+ $query = $this->db->query($sql);
+
+ // Build the result array...
+ // Note: Due to a bug in current() that affects some versions
+ // of PHP we can not pass function call directly into it
+ $res = $query->result_array();
+ $res = current($res);
+ $key = str_replace($this->db->database.'.', '', current($res));
+ $keys = array_keys($res);
+ unset($res[$keys[0]]);
+
+ $result[$key] = $res;
+ }
+
+ return $result;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Repair Table
+ *
+ * @access public
+ * @param string the table name
+ * @return bool
+ */
+ function repair_table($table_name)
+ {
+ $sql = $this->_repair_table($table_name);
+
+ if (is_bool($sql))
+ {
+ return $sql;
+ }
+
+ $query = $this->db->query($sql);
+
+ // Note: Due to a bug in current() that affects some versions
+ // of PHP we can not pass function call directly into it
+ $res = $query->result_array();
+ return current($res);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate CSV from a query result object
+ *
+ * @access public
+ * @param object The query result object
+ * @param string The delimiter - comma by default
+ * @param string The newline character - \n by default
+ * @param string The enclosure - double quote by default
+ * @return string
+ */
+ function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')
+ {
+ if ( ! is_object($query) OR ! method_exists($query, 'field_names'))
+ {
+ show_error('You must submit a valid result object');
+ }
+
+ $out = '';
+
+ // First generate the headings from the table column names
+ foreach ($query->list_fields() as $name)
+ {
+ $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
+ }
+
+ $out = rtrim($out);
+ $out .= $newline;
+
+ // Next blast through the result array and build out the rows
+ foreach ($query->result_array() as $row)
+ {
+ foreach ($row as $item)
+ {
+ $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;
+ }
+ $out = rtrim($out);
+ $out .= $newline;
+ }
+
+ return $out;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate XML data from a query result object
+ *
+ * @access public
+ * @param object The query result object
+ * @param array Any preferences
+ * @return string
+ */
+ function xml_from_result($query, $params = array())
+ {
+ if ( ! is_object($query) OR ! method_exists($query, 'field_names'))
+ {
+ show_error('You must submit a valid result object');
+ }
+
+ // Set our default values
+ foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val)
+ {
+ if ( ! isset($params[$key]))
+ {
+ $params[$key] = $val;
+ }
+ }
+
+ // Create variables for convenience
+ extract($params);
+
+ // Load the xml helper
+ $CI =& get_instance();
+ $CI->load->helper('xml');
+
+ // Generate the result
+ $xml = "<{$root}>".$newline;
+ foreach ($query->result_array() as $row)
+ {
+ $xml .= $tab."<{$element}>".$newline;
+
+ foreach ($row as $key => $val)
+ {
+ $xml .= $tab.$tab."<{$key}>".xml_convert($val)."</{$key}>".$newline;
+ }
+ $xml .= $tab."</{$element}>".$newline;
+ }
+ $xml .= "</$root>".$newline;
+
+ return $xml;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Database Backup
+ *
+ * @access public
+ * @return void
+ */
+ function backup($params = array())
+ {
+ // If the parameters have not been submitted as an
+ // array then we know that it is simply the table
+ // name, which is a valid short cut.
+ if (is_string($params))
+ {
+ $params = array('tables' => $params);
+ }
+
+ // ------------------------------------------------------
+
+ // Set up our default preferences
+ $prefs = array(
+ 'tables' => array(),
+ 'ignore' => array(),
+ 'filename' => '',
+ 'format' => 'gzip', // gzip, zip, txt
+ 'add_drop' => TRUE,
+ 'add_insert' => TRUE,
+ 'newline' => "\n"
+ );
+
+ // Did the user submit any preferences? If so set them....
+ if (count($params) > 0)
+ {
+ foreach ($prefs as $key => $val)
+ {
+ if (isset($params[$key]))
+ {
+ $prefs[$key] = $params[$key];
+ }
+ }
+ }
+
+ // ------------------------------------------------------
+
+ // Are we backing up a complete database or individual tables?
+ // If no table names were submitted we'll fetch the entire table list
+ if (count($prefs['tables']) == 0)
+ {
+ $prefs['tables'] = $this->db->list_tables();
+ }
+
+ // ------------------------------------------------------
+
+ // Validate the format
+ if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE))
+ {
+ $prefs['format'] = 'txt';
+ }
+
+ // ------------------------------------------------------
+
+ // Is the encoder supported? If not, we'll either issue an
+ // error or use plain text depending on the debug settings
+ if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode'))
+ OR ($prefs['format'] == 'zip' AND ! @function_exists('gzcompress')))
+ {
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unsuported_compression');
+ }
+
+ $prefs['format'] = 'txt';
+ }
+
+ // ------------------------------------------------------
+
+ // Set the filename if not provided - Only needed with Zip files
+ if ($prefs['filename'] == '' AND $prefs['format'] == 'zip')
+ {
+ $prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database;
+ $prefs['filename'] .= '_'.date('Y-m-d_H-i', time());
+ }
+
+ // ------------------------------------------------------
+
+ // Was a Gzip file requested?
+ if ($prefs['format'] == 'gzip')
+ {
+ return gzencode($this->_backup($prefs));
+ }
+
+ // ------------------------------------------------------
+
+ // Was a text file requested?
+ if ($prefs['format'] == 'txt')
+ {
+ return $this->_backup($prefs);
+ }
+
+ // ------------------------------------------------------
+
+ // Was a Zip file requested?
+ if ($prefs['format'] == 'zip')
+ {
+ // If they included the .zip file extension we'll remove it
+ if (preg_match("|.+?\.zip$|", $prefs['filename']))
+ {
+ $prefs['filename'] = str_replace('.zip', '', $prefs['filename']);
+ }
+
+ // Tack on the ".sql" file extension if needed
+ if ( ! preg_match("|.+?\.sql$|", $prefs['filename']))
+ {
+ $prefs['filename'] .= '.sql';
+ }
+
+ // Load the Zip class and output it
+
+ $CI =& get_instance();
+ $CI->load->library('zip');
+ $CI->zip->add_data($prefs['filename'], $this->_backup($prefs));
+ return $CI->zip->get_zip();
+ }
+
+ }
+
+}
+
+
+/* End of file DB_utility.php */
/* Location: ./system/database/DB_utility.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * MS SQL Database Adapter Class\r
- *\r
- * Note: _DB is an extender class that the app controller\r
- * creates dynamically based on whether the active record\r
- * class is being used or not.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Drivers\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mssql_driver extends CI_DB {\r
-\r
- var $dbdriver = 'mssql';\r
- \r
- // The character used for escaping\r
- var $_escape_char = '';\r
- /**\r
- * The syntax to count rows is slightly different across different\r
- * database engines, so this string appears in each driver and is\r
- * used for the count_all() and count_all_results() functions.\r
- */\r
- var $_count_string = "SELECT COUNT(*) AS ";\r
- var $_random_keyword = ' ASC'; // not currently supported\r
-\r
- /**\r
- * Non-persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_connect()\r
- {\r
- if ($this->port != '')\r
- {\r
- $this->hostname .= ','.$this->port;\r
- }\r
-\r
- return @mssql_connect($this->hostname, $this->username, $this->password);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_pconnect()\r
- {\r
- if ($this->port != '')\r
- {\r
- $this->hostname .= ','.$this->port;\r
- }\r
-\r
- return @mssql_pconnect($this->hostname, $this->username, $this->password);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select the database\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_select()\r
- {\r
- // Note: The brackets are required in the event that the DB name\r
- // contains reserved characters\r
- return @mssql_select_db('['.$this->database.']', $this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set client character set\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return resource\r
- */\r
- function db_set_charset($charset, $collation)\r
- {\r
- // @todo - add support if needed\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Execute the query\r
- *\r
- * @access private called by the base class\r
- * @param string an SQL query\r
- * @return resource\r
- */ \r
- function _execute($sql)\r
- {\r
- $sql = $this->_prep_query($sql);\r
- return @mssql_query($sql, $this->conn_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Prep the query\r
- *\r
- * If needed, each database adapter can prep the query string\r
- *\r
- * @access private called by execute()\r
- * @param string an SQL query\r
- * @return string\r
- */ \r
- function _prep_query($sql)\r
- {\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Begin Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_begin($test_mode = FALSE)\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
- \r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // Reset the transaction failure flag.\r
- // If the $test_mode flag is set to TRUE transactions will be rolled back\r
- // even if the queries produce a successful result.\r
- $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;\r
-\r
- $this->simple_query('BEGIN TRAN');\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Commit Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_commit()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $this->simple_query('COMMIT TRAN');\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rollback Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_rollback()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $this->simple_query('ROLLBACK TRAN');\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape String\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function escape_str($str) \r
- {\r
- // Access the CI object\r
- $CI =& get_instance();\r
- \r
- // Escape single quotes\r
- return str_replace("'", "''", $CI->input->_remove_invisible_characters($str));\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Affected Rows\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function affected_rows()\r
- {\r
- return @mssql_rows_affected($this->conn_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Insert ID\r
- *\r
- * Returns the last id created in the Identity column.\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function insert_id()\r
- {\r
- $ver = self::_parse_major_version($this->version());\r
- $sql = ($ver >= 8 ? "SELECT SCOPE_IDENTITY() AS last_id" : "SELECT @@IDENTITY AS last_id");\r
- $query = $this->query($sql);\r
- $row = $query->row();\r
- return $row->last_id;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Parse major version\r
- *\r
- * Grabs the major version number from the \r
- * database server version string passed in.\r
- *\r
- * @access private\r
- * @param string $version\r
- * @return int16 major version number\r
- */\r
- function _parse_major_version($version)\r
- {\r
- preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info);\r
- return $ver_info[1]; // return the major version b/c that's all we're interested in.\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Version number query string\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function _version()\r
- {\r
- return "SELECT @@VERSION AS ver";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * "Count All" query\r
- *\r
- * Generates a platform-specific query string that counts all records in\r
- * the specified database\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function count_all($table = '')\r
- {\r
- if ($table == '')\r
- return '0';\r
- \r
- $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));\r
-\r
- if ($query->num_rows() == 0)\r
- return '0';\r
-\r
- $row = $query->row();\r
- return $row->numrows;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * List table query\r
- *\r
- * Generates a platform-specific query string so that the table names can be fetched\r
- *\r
- * @access private\r
- * @param boolean\r
- * @return string\r
- */\r
- function _list_tables($prefix_limit = FALSE)\r
- {\r
- $sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name";\r
- \r
- // for future compatibility\r
- if ($prefix_limit !== FALSE AND $this->dbprefix != '')\r
- {\r
- //$sql .= " LIKE '".$this->dbprefix."%'";\r
- return FALSE; // not currently supported\r
- }\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * List column query\r
- *\r
- * Generates a platform-specific query string so that the column names can be fetched\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return string\r
- */\r
- function _list_columns($table = '')\r
- {\r
- return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$table."'"; \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data query\r
- *\r
- * Generates a platform-specific query so that the column data can be retrieved\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _field_data($table)\r
- {\r
- return "SELECT TOP 1 * FROM ".$table; \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message string\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _error_message()\r
- {\r
- // Are errros even supported in MS SQL?\r
- return '';\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message number\r
- *\r
- * @access private\r
- * @return integer\r
- */\r
- function _error_number()\r
- {\r
- // Are error numbers supported?\r
- return '';\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape the SQL Identifiers\r
- *\r
- * This function escapes column and table names\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _escape_identifiers($item)\r
- {\r
- if ($this->_escape_char == '')\r
- {\r
- return $item;\r
- }\r
- \r
- if (strpos($item, '.') !== FALSE)\r
- {\r
- $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; \r
- }\r
- else\r
- {\r
- $str = $this->_escape_char.$item.$this->_escape_char;\r
- }\r
- \r
- // remove duplicates if the user already included the escape\r
- return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * From Tables\r
- *\r
- * This function implicitly groups FROM tables so there is no confusion\r
- * about operator precedence in harmony with SQL standards\r
- *\r
- * @access public\r
- * @param type\r
- * @return type\r
- */\r
- function _from_tables($tables)\r
- {\r
- if ( ! is_array($tables))\r
- {\r
- $tables = array($tables);\r
- }\r
- \r
- return implode(', ', $tables);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Insert statement\r
- *\r
- * Generates a platform-specific insert string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the insert keys\r
- * @param array the insert values\r
- * @return string\r
- */\r
- function _insert($table, $keys, $values)\r
- { \r
- return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Update statement\r
- *\r
- * Generates a platform-specific update string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the update data\r
- * @param array the where clause\r
- * @param array the orderby clause\r
- * @param array the limit clause\r
- * @return string\r
- */\r
- function _update($table, $values, $where, $orderby = array(), $limit = FALSE)\r
- {\r
- foreach($values as $key => $val)\r
- {\r
- $valstr[] = $key." = ".$val;\r
- }\r
- \r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';\r
- \r
- $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);\r
-\r
- $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';\r
-\r
- $sql .= $orderby.$limit;\r
- \r
- return $sql;\r
- }\r
-\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Truncate statement\r
- *\r
- * Generates a platform-specific truncate string from the supplied data\r
- * If the database does not support the truncate() command\r
- * This function maps to "DELETE FROM table"\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */ \r
- function _truncate($table)\r
- {\r
- return "TRUNCATE ".$table;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete statement\r
- *\r
- * Generates a platform-specific delete string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the where clause\r
- * @param string the limit clause\r
- * @return string\r
- */ \r
- function _delete($table, $where = array(), $like = array(), $limit = FALSE)\r
- {\r
- $conditions = '';\r
-\r
- if (count($where) > 0 OR count($like) > 0)\r
- {\r
- $conditions = "\nWHERE ";\r
- $conditions .= implode("\n", $this->ar_where);\r
-\r
- if (count($where) > 0 && count($like) > 0)\r
- {\r
- $conditions .= " AND ";\r
- }\r
- $conditions .= implode("\n", $like);\r
- }\r
-\r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- return "DELETE FROM ".$table.$conditions.$limit;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Limit string\r
- *\r
- * Generates a platform-specific LIMIT clause\r
- *\r
- * @access public\r
- * @param string the sql query string\r
- * @param integer the number of rows to limit the query to\r
- * @param integer the offset value\r
- * @return string\r
- */\r
- function _limit($sql, $limit, $offset)\r
- {\r
- $i = $limit + $offset;\r
- \r
- return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql); \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Close DB Connection\r
- *\r
- * @access public\r
- * @param resource\r
- * @return void\r
- */\r
- function _close($conn_id)\r
- {\r
- @mssql_close($conn_id);\r
- } \r
-\r
-}\r
-\r
-\r
-\r
-/* End of file mssql_driver.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MS SQL Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package CodeIgniter
+ * @subpackage Drivers
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mssql_driver extends CI_DB {
+
+ var $dbdriver = 'mssql';
+
+ // The character used for escaping
+ var $_escape_char = '';
+ /**
+ * The syntax to count rows is slightly different across different
+ * database engines, so this string appears in each driver and is
+ * used for the count_all() and count_all_results() functions.
+ */
+ var $_count_string = "SELECT COUNT(*) AS ";
+ var $_random_keyword = ' ASC'; // not currently supported
+
+ /**
+ * Non-persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_connect()
+ {
+ if ($this->port != '')
+ {
+ $this->hostname .= ','.$this->port;
+ }
+
+ return @mssql_connect($this->hostname, $this->username, $this->password);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_pconnect()
+ {
+ if ($this->port != '')
+ {
+ $this->hostname .= ','.$this->port;
+ }
+
+ return @mssql_pconnect($this->hostname, $this->username, $this->password);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select the database
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_select()
+ {
+ // Note: The brackets are required in the event that the DB name
+ // contains reserved characters
+ return @mssql_select_db('['.$this->database.']', $this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set client character set
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return resource
+ */
+ function db_set_charset($charset, $collation)
+ {
+ // @todo - add support if needed
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Execute the query
+ *
+ * @access private called by the base class
+ * @param string an SQL query
+ * @return resource
+ */
+ function _execute($sql)
+ {
+ $sql = $this->_prep_query($sql);
+ return @mssql_query($sql, $this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep the query
+ *
+ * If needed, each database adapter can prep the query string
+ *
+ * @access private called by execute()
+ * @param string an SQL query
+ * @return string
+ */
+ function _prep_query($sql)
+ {
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Begin Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_begin($test_mode = FALSE)
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ // Reset the transaction failure flag.
+ // If the $test_mode flag is set to TRUE transactions will be rolled back
+ // even if the queries produce a successful result.
+ $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+ $this->simple_query('BEGIN TRAN');
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Commit Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_commit()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $this->simple_query('COMMIT TRAN');
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rollback Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_rollback()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $this->simple_query('ROLLBACK TRAN');
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape String
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function escape_str($str)
+ {
+ // Access the CI object
+ $CI =& get_instance();
+
+ // Escape single quotes
+ return str_replace("'", "''", $CI->input->_remove_invisible_characters($str));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Affected Rows
+ *
+ * @access public
+ * @return integer
+ */
+ function affected_rows()
+ {
+ return @mssql_rows_affected($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert ID
+ *
+ * Returns the last id created in the Identity column.
+ *
+ * @access public
+ * @return integer
+ */
+ function insert_id()
+ {
+ $ver = self::_parse_major_version($this->version());
+ $sql = ($ver >= 8 ? "SELECT SCOPE_IDENTITY() AS last_id" : "SELECT @@IDENTITY AS last_id");
+ $query = $this->query($sql);
+ $row = $query->row();
+ return $row->last_id;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Parse major version
+ *
+ * Grabs the major version number from the
+ * database server version string passed in.
+ *
+ * @access private
+ * @param string $version
+ * @return int16 major version number
+ */
+ function _parse_major_version($version)
+ {
+ preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info);
+ return $ver_info[1]; // return the major version b/c that's all we're interested in.
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Version number query string
+ *
+ * @access public
+ * @return string
+ */
+ function _version()
+ {
+ return "SELECT @@VERSION AS ver";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * "Count All" query
+ *
+ * Generates a platform-specific query string that counts all records in
+ * the specified database
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function count_all($table = '')
+ {
+ if ($table == '')
+ return '0';
+
+ $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+
+ if ($query->num_rows() == 0)
+ return '0';
+
+ $row = $query->row();
+ return $row->numrows;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * List table query
+ *
+ * Generates a platform-specific query string so that the table names can be fetched
+ *
+ * @access private
+ * @param boolean
+ * @return string
+ */
+ function _list_tables($prefix_limit = FALSE)
+ {
+ $sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name";
+
+ // for future compatibility
+ if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+ {
+ //$sql .= " LIKE '".$this->dbprefix."%'";
+ return FALSE; // not currently supported
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * List column query
+ *
+ * Generates a platform-specific query string so that the column names can be fetched
+ *
+ * @access private
+ * @param string the table name
+ * @return string
+ */
+ function _list_columns($table = '')
+ {
+ return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$table."'";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data query
+ *
+ * Generates a platform-specific query so that the column data can be retrieved
+ *
+ * @access public
+ * @param string the table name
+ * @return object
+ */
+ function _field_data($table)
+ {
+ return "SELECT TOP 1 * FROM ".$table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message string
+ *
+ * @access private
+ * @return string
+ */
+ function _error_message()
+ {
+ // Are errros even supported in MS SQL?
+ return '';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message number
+ *
+ * @access private
+ * @return integer
+ */
+ function _error_number()
+ {
+ // Are error numbers supported?
+ return '';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape the SQL Identifiers
+ *
+ * This function escapes column and table names
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _escape_identifiers($item)
+ {
+ if ($this->_escape_char == '')
+ {
+ return $item;
+ }
+
+ if (strpos($item, '.') !== FALSE)
+ {
+ $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
+ }
+ else
+ {
+ $str = $this->_escape_char.$item.$this->_escape_char;
+ }
+
+ // remove duplicates if the user already included the escape
+ return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * From Tables
+ *
+ * This function implicitly groups FROM tables so there is no confusion
+ * about operator precedence in harmony with SQL standards
+ *
+ * @access public
+ * @param type
+ * @return type
+ */
+ function _from_tables($tables)
+ {
+ if ( ! is_array($tables))
+ {
+ $tables = array($tables);
+ }
+
+ return implode(', ', $tables);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert statement
+ *
+ * Generates a platform-specific insert string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the insert keys
+ * @param array the insert values
+ * @return string
+ */
+ function _insert($table, $keys, $values)
+ {
+ return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Update statement
+ *
+ * Generates a platform-specific update string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the update data
+ * @param array the where clause
+ * @param array the orderby clause
+ * @param array the limit clause
+ * @return string
+ */
+ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+ {
+ foreach($values as $key => $val)
+ {
+ $valstr[] = $key." = ".$val;
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+
+ $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+ $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+ $sql .= $orderby.$limit;
+
+ return $sql;
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Truncate statement
+ *
+ * Generates a platform-specific truncate string from the supplied data
+ * If the database does not support the truncate() command
+ * This function maps to "DELETE FROM table"
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _truncate($table)
+ {
+ return "TRUNCATE ".$table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete statement
+ *
+ * Generates a platform-specific delete string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the where clause
+ * @param string the limit clause
+ * @return string
+ */
+ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+ {
+ $conditions = '';
+
+ if (count($where) > 0 OR count($like) > 0)
+ {
+ $conditions = "\nWHERE ";
+ $conditions .= implode("\n", $this->ar_where);
+
+ if (count($where) > 0 && count($like) > 0)
+ {
+ $conditions .= " AND ";
+ }
+ $conditions .= implode("\n", $like);
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ return "DELETE FROM ".$table.$conditions.$limit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Limit string
+ *
+ * Generates a platform-specific LIMIT clause
+ *
+ * @access public
+ * @param string the sql query string
+ * @param integer the number of rows to limit the query to
+ * @param integer the offset value
+ * @return string
+ */
+ function _limit($sql, $limit, $offset)
+ {
+ $i = $limit + $offset;
+
+ return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Close DB Connection
+ *
+ * @access public
+ * @param resource
+ * @return void
+ */
+ function _close($conn_id)
+ {
+ @mssql_close($conn_id);
+ }
+
+}
+
+
+
+/* End of file mssql_driver.php */
/* Location: ./system/database/drivers/mssql/mssql_driver.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * MS SQL Forge Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mssql_forge extends CI_DB_forge {\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database($name)\r
- {\r
- return "CREATE DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- return "DROP DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop Table\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _drop_table($table)\r
- {\r
- return "DROP TABLE ".$this->db->_escape_identifiers($table);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Create Table\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @param array the fields\r
- * @param mixed primary key(s)\r
- * @param mixed key(s)\r
- * @param boolean should 'IF NOT EXISTS' be added to the SQL\r
- * @return bool\r
- */\r
- function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)\r
- {\r
- $sql = 'CREATE TABLE ';\r
- \r
- if ($if_not_exists === TRUE)\r
- {\r
- $sql .= 'IF NOT EXISTS ';\r
- }\r
- \r
- $sql .= $this->db->_escape_identifiers($table)." (";\r
- $current_field_count = 0;\r
-\r
- foreach ($fields as $field=>$attributes)\r
- {\r
- // Numeric field names aren't allowed in databases, so if the key is\r
- // numeric, we know it was assigned by PHP and the developer manually\r
- // entered the field information, so we'll simply add it to the list\r
- if (is_numeric($field))\r
- {\r
- $sql .= "\n\t$attributes";\r
- }\r
- else\r
- {\r
- $attributes = array_change_key_case($attributes, CASE_UPPER);\r
- \r
- $sql .= "\n\t".$this->db->_protect_identifiers($field);\r
- \r
- $sql .= ' '.$attributes['TYPE'];\r
- \r
- if (array_key_exists('CONSTRAINT', $attributes))\r
- {\r
- $sql .= '('.$attributes['CONSTRAINT'].')';\r
- }\r
- \r
- if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)\r
- {\r
- $sql .= ' UNSIGNED';\r
- }\r
- \r
- if (array_key_exists('DEFAULT', $attributes))\r
- {\r
- $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';\r
- }\r
- \r
- if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)\r
- {\r
- $sql .= ' NULL';\r
- }\r
- else\r
- {\r
- $sql .= ' NOT NULL'; \r
- }\r
- \r
- if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)\r
- {\r
- $sql .= ' AUTO_INCREMENT';\r
- }\r
- }\r
- \r
- // don't add a comma on the end of the last field\r
- if (++$current_field_count < count($fields))\r
- {\r
- $sql .= ',';\r
- }\r
- }\r
-\r
- if (count($primary_keys) > 0)\r
- {\r
- $primary_keys = $this->db->_protect_identifiers($primary_keys);\r
- $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";\r
- }\r
- \r
- if (is_array($keys) && count($keys) > 0)\r
- {\r
- foreach ($keys as $key)\r
- {\r
- if (is_array($key))\r
- {\r
- $key = $this->db->_protect_identifiers($key); \r
- }\r
- else\r
- {\r
- $key = array($this->db->_protect_identifiers($key));\r
- }\r
- \r
- $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";\r
- }\r
- }\r
- \r
- $sql .= "\n)";\r
-\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Alter table query\r
- *\r
- * Generates a platform-specific query so that a table can be altered\r
- * Called by add_column(), drop_column(), and column_alter(),\r
- *\r
- * @access private\r
- * @param string the ALTER type (ADD, DROP, CHANGE)\r
- * @param string the column name\r
- * @param string the table name\r
- * @param string the column definition\r
- * @param string the default value\r
- * @param boolean should 'NOT NULL' be added\r
- * @param string the field after which we should add the new field\r
- * @return object\r
- */\r
- function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);\r
-\r
- // DROP has everything it needs now.\r
- if ($alter_type == 'DROP')\r
- {\r
- return $sql;\r
- }\r
-\r
- $sql .= " $column_definition";\r
-\r
- if ($default_value != '')\r
- {\r
- $sql .= " DEFAULT \"$default_value\"";\r
- }\r
-\r
- if ($null === NULL)\r
- {\r
- $sql .= ' NULL';\r
- }\r
- else\r
- {\r
- $sql .= ' NOT NULL';\r
- }\r
-\r
- if ($after_field != '')\r
- {\r
- $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);\r
- }\r
- \r
- return $sql;\r
- \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rename a table\r
- *\r
- * Generates a platform-specific query so that a table can be renamed\r
- *\r
- * @access private\r
- * @param string the old table name\r
- * @param string the new table name\r
- * @return string\r
- */\r
- function _rename_table($table_name, $new_table_name)\r
- {\r
- // I think this syntax will work, but can find little documentation on renaming tables in MSSQL\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);\r
- return $sql;\r
- }\r
-\r
-}\r
-\r
-/* End of file mssql_forge.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MS SQL Forge Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mssql_forge extends CI_DB_forge {
+
+ /**
+ * Create database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database($name)
+ {
+ return "CREATE DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ return "DROP DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop Table
+ *
+ * @access private
+ * @return bool
+ */
+ function _drop_table($table)
+ {
+ return "DROP TABLE ".$this->db->_escape_identifiers($table);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create Table
+ *
+ * @access private
+ * @param string the table name
+ * @param array the fields
+ * @param mixed primary key(s)
+ * @param mixed key(s)
+ * @param boolean should 'IF NOT EXISTS' be added to the SQL
+ * @return bool
+ */
+ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+ {
+ $sql = 'CREATE TABLE ';
+
+ if ($if_not_exists === TRUE)
+ {
+ $sql .= 'IF NOT EXISTS ';
+ }
+
+ $sql .= $this->db->_escape_identifiers($table)." (";
+ $current_field_count = 0;
+
+ foreach ($fields as $field=>$attributes)
+ {
+ // Numeric field names aren't allowed in databases, so if the key is
+ // numeric, we know it was assigned by PHP and the developer manually
+ // entered the field information, so we'll simply add it to the list
+ if (is_numeric($field))
+ {
+ $sql .= "\n\t$attributes";
+ }
+ else
+ {
+ $attributes = array_change_key_case($attributes, CASE_UPPER);
+
+ $sql .= "\n\t".$this->db->_protect_identifiers($field);
+
+ $sql .= ' '.$attributes['TYPE'];
+
+ if (array_key_exists('CONSTRAINT', $attributes))
+ {
+ $sql .= '('.$attributes['CONSTRAINT'].')';
+ }
+
+ if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+ {
+ $sql .= ' UNSIGNED';
+ }
+
+ if (array_key_exists('DEFAULT', $attributes))
+ {
+ $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+ }
+
+ if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
+ {
+ $sql .= ' NULL';
+ }
+ else
+ {
+ $sql .= ' NOT NULL';
+ }
+
+ if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+ {
+ $sql .= ' AUTO_INCREMENT';
+ }
+ }
+
+ // don't add a comma on the end of the last field
+ if (++$current_field_count < count($fields))
+ {
+ $sql .= ',';
+ }
+ }
+
+ if (count($primary_keys) > 0)
+ {
+ $primary_keys = $this->db->_protect_identifiers($primary_keys);
+ $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
+ }
+
+ if (is_array($keys) && count($keys) > 0)
+ {
+ foreach ($keys as $key)
+ {
+ if (is_array($key))
+ {
+ $key = $this->db->_protect_identifiers($key);
+ }
+ else
+ {
+ $key = array($this->db->_protect_identifiers($key));
+ }
+
+ $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";
+ }
+ }
+
+ $sql .= "\n)";
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alter table query
+ *
+ * Generates a platform-specific query so that a table can be altered
+ * Called by add_column(), drop_column(), and column_alter(),
+ *
+ * @access private
+ * @param string the ALTER type (ADD, DROP, CHANGE)
+ * @param string the column name
+ * @param string the table name
+ * @param string the column definition
+ * @param string the default value
+ * @param boolean should 'NOT NULL' be added
+ * @param string the field after which we should add the new field
+ * @return object
+ */
+ function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
+
+ // DROP has everything it needs now.
+ if ($alter_type == 'DROP')
+ {
+ return $sql;
+ }
+
+ $sql .= " $column_definition";
+
+ if ($default_value != '')
+ {
+ $sql .= " DEFAULT \"$default_value\"";
+ }
+
+ if ($null === NULL)
+ {
+ $sql .= ' NULL';
+ }
+ else
+ {
+ $sql .= ' NOT NULL';
+ }
+
+ if ($after_field != '')
+ {
+ $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+ }
+
+ return $sql;
+
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rename a table
+ *
+ * Generates a platform-specific query so that a table can be renamed
+ *
+ * @access private
+ * @param string the old table name
+ * @param string the new table name
+ * @return string
+ */
+ function _rename_table($table_name, $new_table_name)
+ {
+ // I think this syntax will work, but can find little documentation on renaming tables in MSSQL
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+ return $sql;
+ }
+
+}
+
+/* End of file mssql_forge.php */
/* Location: ./system/database/drivers/mssql/mssql_forge.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * MS SQL Result Class\r
- *\r
- * This class extends the parent result class: CI_DB_result\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mssql_result extends CI_DB_result {\r
- \r
- /**\r
- * Number of rows in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_rows()\r
- {\r
- return @mssql_num_rows($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Number of fields in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_fields()\r
- {\r
- return @mssql_num_fields($this->result_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch Field Names\r
- *\r
- * Generates an array of column names\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function list_fields()\r
- {\r
- $field_names = array();\r
- while ($field = mssql_fetch_field($this->result_id))\r
- {\r
- $field_names[] = $field->name;\r
- }\r
- \r
- return $field_names;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data\r
- *\r
- * Generates an array of objects containing field meta-data\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function field_data()\r
- {\r
- $retval = array();\r
- while ($field = mssql_fetch_field($this->result_id))\r
- { \r
- $F = new stdClass();\r
- $F->name = $field->name;\r
- $F->type = $field->type;\r
- $F->max_length = $field->max_length;\r
- $F->primary_key = 0;\r
- $F->default = '';\r
- \r
- $retval[] = $F;\r
- }\r
- \r
- return $retval;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Free the result\r
- *\r
- * @return null\r
- */ \r
- function free_result()\r
- {\r
- if (is_resource($this->result_id))\r
- {\r
- mssql_free_result($this->result_id);\r
- $this->result_id = FALSE;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Data Seek\r
- *\r
- * Moves the internal pointer to the desired offset. We call\r
- * this internally before fetching results to make sure the\r
- * result set starts at zero\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _data_seek($n = 0)\r
- {\r
- return mssql_data_seek($this->result_id, $n);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - associative array\r
- *\r
- * Returns the result set as an array\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _fetch_assoc()\r
- {\r
- return mssql_fetch_assoc($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - object\r
- *\r
- * Returns the result set as an object\r
- *\r
- * @access private\r
- * @return object\r
- */\r
- function _fetch_object()\r
- {\r
- return mssql_fetch_object($this->result_id);\r
- }\r
-\r
-}\r
-\r
-\r
-/* End of file mssql_result.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MS SQL Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mssql_result extends CI_DB_result {
+
+ /**
+ * Number of rows in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_rows()
+ {
+ return @mssql_num_rows($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Number of fields in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_fields()
+ {
+ return @mssql_num_fields($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch Field Names
+ *
+ * Generates an array of column names
+ *
+ * @access public
+ * @return array
+ */
+ function list_fields()
+ {
+ $field_names = array();
+ while ($field = mssql_fetch_field($this->result_id))
+ {
+ $field_names[] = $field->name;
+ }
+
+ return $field_names;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data
+ *
+ * Generates an array of objects containing field meta-data
+ *
+ * @access public
+ * @return array
+ */
+ function field_data()
+ {
+ $retval = array();
+ while ($field = mssql_fetch_field($this->result_id))
+ {
+ $F = new stdClass();
+ $F->name = $field->name;
+ $F->type = $field->type;
+ $F->max_length = $field->max_length;
+ $F->primary_key = 0;
+ $F->default = '';
+
+ $retval[] = $F;
+ }
+
+ return $retval;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Free the result
+ *
+ * @return null
+ */
+ function free_result()
+ {
+ if (is_resource($this->result_id))
+ {
+ mssql_free_result($this->result_id);
+ $this->result_id = FALSE;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Data Seek
+ *
+ * Moves the internal pointer to the desired offset. We call
+ * this internally before fetching results to make sure the
+ * result set starts at zero
+ *
+ * @access private
+ * @return array
+ */
+ function _data_seek($n = 0)
+ {
+ return mssql_data_seek($this->result_id, $n);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - associative array
+ *
+ * Returns the result set as an array
+ *
+ * @access private
+ * @return array
+ */
+ function _fetch_assoc()
+ {
+ return mssql_fetch_assoc($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - object
+ *
+ * Returns the result set as an object
+ *
+ * @access private
+ * @return object
+ */
+ function _fetch_object()
+ {
+ return mssql_fetch_object($this->result_id);
+ }
+
+}
+
+
+/* End of file mssql_result.php */
/* Location: ./system/database/drivers/mssql/mssql_result.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * MS SQL Utility Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mssql_utility extends CI_DB_utility {\r
-\r
- /**\r
- * List databases\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _list_databases()\r
- {\r
- return "EXEC sp_helpdb"; // Can also be: EXEC sp_databases\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Optimize table query\r
- *\r
- * Generates a platform-specific query so that a table can be optimized\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _optimize_table($table)\r
- {\r
- return FALSE; // Is this supported in MS SQL?\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Repair table query\r
- *\r
- * Generates a platform-specific query so that a table can be repaired\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _repair_table($table)\r
- {\r
- return FALSE; // Is this supported in MS SQL?\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * MSSQL Export\r
- *\r
- * @access private\r
- * @param array Preferences\r
- * @return mixed\r
- */\r
- function _backup($params = array())\r
- {\r
- // Currently unsupported\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
-\r
- /**\r
- *\r
- * The functions below have been deprecated as of 1.6, and are only here for backwards\r
- * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation\r
- * is STRONGLY discouraged in favour if using dbforge.\r
- *\r
- */\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database($name)\r
- {\r
- return "CREATE DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- return "DROP DATABASE ".$name;\r
- }\r
-\r
-}\r
-\r
-\r
-/* End of file mssql_utility.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MS SQL Utility Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mssql_utility extends CI_DB_utility {
+
+ /**
+ * List databases
+ *
+ * @access private
+ * @return bool
+ */
+ function _list_databases()
+ {
+ return "EXEC sp_helpdb"; // Can also be: EXEC sp_databases
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Optimize table query
+ *
+ * Generates a platform-specific query so that a table can be optimized
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _optimize_table($table)
+ {
+ return FALSE; // Is this supported in MS SQL?
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Repair table query
+ *
+ * Generates a platform-specific query so that a table can be repaired
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _repair_table($table)
+ {
+ return FALSE; // Is this supported in MS SQL?
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * MSSQL Export
+ *
+ * @access private
+ * @param array Preferences
+ * @return mixed
+ */
+ function _backup($params = array())
+ {
+ // Currently unsupported
+ return $this->db->display_error('db_unsuported_feature');
+ }
+
+ /**
+ *
+ * The functions below have been deprecated as of 1.6, and are only here for backwards
+ * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation
+ * is STRONGLY discouraged in favour if using dbforge.
+ *
+ */
+
+ /**
+ * Create database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database($name)
+ {
+ return "CREATE DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ return "DROP DATABASE ".$name;
+ }
+
+}
+
+
+/* End of file mssql_utility.php */
/* Location: ./system/database/drivers/mssql/mssql_utility.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * MySQL Database Adapter Class\r
- *\r
- * Note: _DB is an extender class that the app controller\r
- * creates dynamically based on whether the active record\r
- * class is being used or not.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Drivers\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mysql_driver extends CI_DB {\r
-\r
- var $dbdriver = 'mysql';\r
-\r
- // The character used for escaping\r
- var $_escape_char = '`';\r
- \r
- /**\r
- * Whether to use the MySQL "delete hack" which allows the number\r
- * of affected rows to be shown. Uses a preg_replace when enabled,\r
- * adding a bit more processing to all queries.\r
- */ \r
- var $delete_hack = TRUE;\r
- \r
- /**\r
- * The syntax to count rows is slightly different across different\r
- * database engines, so this string appears in each driver and is\r
- * used for the count_all() and count_all_results() functions.\r
- */\r
- var $_count_string = 'SELECT COUNT(*) AS ';\r
- var $_random_keyword = ' RAND()'; // database specific random keyword\r
-\r
- /**\r
- * Non-persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_connect()\r
- {\r
- if ($this->port != '')\r
- {\r
- $this->hostname .= ':'.$this->port;\r
- }\r
- \r
- return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_pconnect()\r
- {\r
- if ($this->port != '')\r
- {\r
- $this->hostname .= ':'.$this->port;\r
- }\r
-\r
- return @mysql_pconnect($this->hostname, $this->username, $this->password);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select the database\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_select()\r
- {\r
- return @mysql_select_db($this->database, $this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set client character set\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return resource\r
- */\r
- function db_set_charset($charset, $collation)\r
- {\r
- return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Version number query string\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function _version()\r
- {\r
- return "SELECT version() AS ver";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Execute the query\r
- *\r
- * @access private called by the base class\r
- * @param string an SQL query\r
- * @return resource\r
- */ \r
- function _execute($sql)\r
- {\r
- $sql = $this->_prep_query($sql);\r
- return @mysql_query($sql, $this->conn_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Prep the query\r
- *\r
- * If needed, each database adapter can prep the query string\r
- *\r
- * @access private called by execute()\r
- * @param string an SQL query\r
- * @return string\r
- */ \r
- function _prep_query($sql)\r
- {\r
- // "DELETE FROM TABLE" returns 0 affected rows This hack modifies\r
- // the query so that it returns the number of affected rows\r
- if ($this->delete_hack === TRUE)\r
- {\r
- if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))\r
- {\r
- $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);\r
- }\r
- }\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Begin Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_begin($test_mode = FALSE)\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
- \r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // Reset the transaction failure flag.\r
- // If the $test_mode flag is set to TRUE transactions will be rolled back\r
- // even if the queries produce a successful result.\r
- $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;\r
- \r
- $this->simple_query('SET AUTOCOMMIT=0');\r
- $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Commit Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_commit()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $this->simple_query('COMMIT');\r
- $this->simple_query('SET AUTOCOMMIT=1');\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rollback Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_rollback()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $this->simple_query('ROLLBACK');\r
- $this->simple_query('SET AUTOCOMMIT=1');\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape String\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function escape_str($str) \r
- { \r
- if (is_array($str))\r
- {\r
- foreach($str as $key => $val)\r
- {\r
- $str[$key] = $this->escape_str($val);\r
- }\r
- \r
- return $str;\r
- }\r
-\r
- if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))\r
- {\r
- return mysql_real_escape_string($str, $this->conn_id);\r
- }\r
- elseif (function_exists('mysql_escape_string'))\r
- {\r
- return mysql_escape_string($str);\r
- }\r
- else\r
- {\r
- return addslashes($str);\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Affected Rows\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function affected_rows()\r
- {\r
- return @mysql_affected_rows($this->conn_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Insert ID\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function insert_id()\r
- {\r
- return @mysql_insert_id($this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * "Count All" query\r
- *\r
- * Generates a platform-specific query string that counts all records in\r
- * the specified database\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function count_all($table = '')\r
- {\r
- if ($table == '')\r
- return '0';\r
- \r
- $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));\r
- \r
- if ($query->num_rows() == 0)\r
- return '0';\r
-\r
- $row = $query->row();\r
- return (int)$row->numrows;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * List table query\r
- *\r
- * Generates a platform-specific query string so that the table names can be fetched\r
- *\r
- * @access private\r
- * @param boolean\r
- * @return string\r
- */\r
- function _list_tables($prefix_limit = FALSE)\r
- {\r
- $sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char; \r
-\r
- if ($prefix_limit !== FALSE AND $this->dbprefix != '')\r
- {\r
- $sql .= " LIKE '".$this->dbprefix."%'";\r
- }\r
-\r
- return $sql;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Show column query\r
- *\r
- * Generates a platform-specific query string so that the column names can be fetched\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */\r
- function _list_columns($table = '')\r
- {\r
- return "SHOW COLUMNS FROM ".$table;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data query\r
- *\r
- * Generates a platform-specific query so that the column data can be retrieved\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _field_data($table)\r
- {\r
- return "SELECT * FROM ".$table." LIMIT 1";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message string\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _error_message()\r
- {\r
- return mysql_error($this->conn_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message number\r
- *\r
- * @access private\r
- * @return integer\r
- */\r
- function _error_number()\r
- {\r
- return mysql_errno($this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape the SQL Identifiers\r
- *\r
- * This function escapes column and table names\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _escape_identifiers($item)\r
- {\r
- if ($this->_escape_char == '')\r
- {\r
- return $item;\r
- }\r
- \r
- if (strpos($item, '.') !== FALSE)\r
- {\r
- $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; \r
- }\r
- else\r
- {\r
- $str = $this->_escape_char.$item.$this->_escape_char;\r
- }\r
- \r
- // remove duplicates if the user already included the escape\r
- return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * From Tables\r
- *\r
- * This function implicitly groups FROM tables so there is no confusion\r
- * about operator precedence in harmony with SQL standards\r
- *\r
- * @access public\r
- * @param type\r
- * @return type\r
- */\r
- function _from_tables($tables)\r
- {\r
- if ( ! is_array($tables))\r
- {\r
- $tables = array($tables);\r
- }\r
- \r
- return '('.implode(', ', $tables).')';\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Insert statement\r
- *\r
- * Generates a platform-specific insert string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the insert keys\r
- * @param array the insert values\r
- * @return string\r
- */\r
- function _insert($table, $keys, $values)\r
- { \r
- return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Update statement\r
- *\r
- * Generates a platform-specific update string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the update data\r
- * @param array the where clause\r
- * @param array the orderby clause\r
- * @param array the limit clause\r
- * @return string\r
- */\r
- function _update($table, $values, $where, $orderby = array(), $limit = FALSE)\r
- {\r
- foreach($values as $key => $val)\r
- {\r
- $valstr[] = $key." = ".$val;\r
- }\r
- \r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';\r
- \r
- $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);\r
-\r
- $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';\r
-\r
- $sql .= $orderby.$limit;\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Truncate statement\r
- *\r
- * Generates a platform-specific truncate string from the supplied data\r
- * If the database does not support the truncate() command\r
- * This function maps to "DELETE FROM table"\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */ \r
- function _truncate($table)\r
- {\r
- return "TRUNCATE ".$table;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete statement\r
- *\r
- * Generates a platform-specific delete string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the where clause\r
- * @param string the limit clause\r
- * @return string\r
- */ \r
- function _delete($table, $where = array(), $like = array(), $limit = FALSE)\r
- {\r
- $conditions = '';\r
-\r
- if (count($where) > 0 OR count($like) > 0)\r
- {\r
- $conditions = "\nWHERE ";\r
- $conditions .= implode("\n", $this->ar_where);\r
-\r
- if (count($where) > 0 && count($like) > 0)\r
- {\r
- $conditions .= " AND ";\r
- }\r
- $conditions .= implode("\n", $like);\r
- }\r
-\r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- return "DELETE FROM ".$table.$conditions.$limit;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Limit string\r
- *\r
- * Generates a platform-specific LIMIT clause\r
- *\r
- * @access public\r
- * @param string the sql query string\r
- * @param integer the number of rows to limit the query to\r
- * @param integer the offset value\r
- * @return string\r
- */\r
- function _limit($sql, $limit, $offset)\r
- { \r
- if ($offset == 0)\r
- {\r
- $offset = '';\r
- }\r
- else\r
- {\r
- $offset .= ", ";\r
- }\r
- \r
- return $sql."LIMIT ".$offset.$limit;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Close DB Connection\r
- *\r
- * @access public\r
- * @param resource\r
- * @return void\r
- */\r
- function _close($conn_id)\r
- {\r
- @mysql_close($conn_id);\r
- }\r
- \r
-}\r
-\r
-\r
-/* End of file mysql_driver.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQL Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package CodeIgniter
+ * @subpackage Drivers
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysql_driver extends CI_DB {
+
+ var $dbdriver = 'mysql';
+
+ // The character used for escaping
+ var $_escape_char = '`';
+
+ /**
+ * Whether to use the MySQL "delete hack" which allows the number
+ * of affected rows to be shown. Uses a preg_replace when enabled,
+ * adding a bit more processing to all queries.
+ */
+ var $delete_hack = TRUE;
+
+ /**
+ * The syntax to count rows is slightly different across different
+ * database engines, so this string appears in each driver and is
+ * used for the count_all() and count_all_results() functions.
+ */
+ var $_count_string = 'SELECT COUNT(*) AS ';
+ var $_random_keyword = ' RAND()'; // database specific random keyword
+
+ /**
+ * Non-persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_connect()
+ {
+ if ($this->port != '')
+ {
+ $this->hostname .= ':'.$this->port;
+ }
+
+ return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_pconnect()
+ {
+ if ($this->port != '')
+ {
+ $this->hostname .= ':'.$this->port;
+ }
+
+ return @mysql_pconnect($this->hostname, $this->username, $this->password);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select the database
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_select()
+ {
+ return @mysql_select_db($this->database, $this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set client character set
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return resource
+ */
+ function db_set_charset($charset, $collation)
+ {
+ return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Version number query string
+ *
+ * @access public
+ * @return string
+ */
+ function _version()
+ {
+ return "SELECT version() AS ver";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Execute the query
+ *
+ * @access private called by the base class
+ * @param string an SQL query
+ * @return resource
+ */
+ function _execute($sql)
+ {
+ $sql = $this->_prep_query($sql);
+ return @mysql_query($sql, $this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep the query
+ *
+ * If needed, each database adapter can prep the query string
+ *
+ * @access private called by execute()
+ * @param string an SQL query
+ * @return string
+ */
+ function _prep_query($sql)
+ {
+ // "DELETE FROM TABLE" returns 0 affected rows This hack modifies
+ // the query so that it returns the number of affected rows
+ if ($this->delete_hack === TRUE)
+ {
+ if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
+ {
+ $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);
+ }
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Begin Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_begin($test_mode = FALSE)
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ // Reset the transaction failure flag.
+ // If the $test_mode flag is set to TRUE transactions will be rolled back
+ // even if the queries produce a successful result.
+ $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+ $this->simple_query('SET AUTOCOMMIT=0');
+ $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Commit Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_commit()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $this->simple_query('COMMIT');
+ $this->simple_query('SET AUTOCOMMIT=1');
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rollback Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_rollback()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $this->simple_query('ROLLBACK');
+ $this->simple_query('SET AUTOCOMMIT=1');
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape String
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function escape_str($str)
+ {
+ if (is_array($str))
+ {
+ foreach($str as $key => $val)
+ {
+ $str[$key] = $this->escape_str($val);
+ }
+
+ return $str;
+ }
+
+ if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))
+ {
+ return mysql_real_escape_string($str, $this->conn_id);
+ }
+ elseif (function_exists('mysql_escape_string'))
+ {
+ return mysql_escape_string($str);
+ }
+ else
+ {
+ return addslashes($str);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Affected Rows
+ *
+ * @access public
+ * @return integer
+ */
+ function affected_rows()
+ {
+ return @mysql_affected_rows($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert ID
+ *
+ * @access public
+ * @return integer
+ */
+ function insert_id()
+ {
+ return @mysql_insert_id($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * "Count All" query
+ *
+ * Generates a platform-specific query string that counts all records in
+ * the specified database
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function count_all($table = '')
+ {
+ if ($table == '')
+ return '0';
+
+ $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+
+ if ($query->num_rows() == 0)
+ return '0';
+
+ $row = $query->row();
+ return (int)$row->numrows;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * List table query
+ *
+ * Generates a platform-specific query string so that the table names can be fetched
+ *
+ * @access private
+ * @param boolean
+ * @return string
+ */
+ function _list_tables($prefix_limit = FALSE)
+ {
+ $sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;
+
+ if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+ {
+ $sql .= " LIKE '".$this->dbprefix."%'";
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show column query
+ *
+ * Generates a platform-specific query string so that the column names can be fetched
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _list_columns($table = '')
+ {
+ return "SHOW COLUMNS FROM ".$table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data query
+ *
+ * Generates a platform-specific query so that the column data can be retrieved
+ *
+ * @access public
+ * @param string the table name
+ * @return object
+ */
+ function _field_data($table)
+ {
+ return "SELECT * FROM ".$table." LIMIT 1";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message string
+ *
+ * @access private
+ * @return string
+ */
+ function _error_message()
+ {
+ return mysql_error($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message number
+ *
+ * @access private
+ * @return integer
+ */
+ function _error_number()
+ {
+ return mysql_errno($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape the SQL Identifiers
+ *
+ * This function escapes column and table names
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _escape_identifiers($item)
+ {
+ if ($this->_escape_char == '')
+ {
+ return $item;
+ }
+
+ if (strpos($item, '.') !== FALSE)
+ {
+ $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
+ }
+ else
+ {
+ $str = $this->_escape_char.$item.$this->_escape_char;
+ }
+
+ // remove duplicates if the user already included the escape
+ return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * From Tables
+ *
+ * This function implicitly groups FROM tables so there is no confusion
+ * about operator precedence in harmony with SQL standards
+ *
+ * @access public
+ * @param type
+ * @return type
+ */
+ function _from_tables($tables)
+ {
+ if ( ! is_array($tables))
+ {
+ $tables = array($tables);
+ }
+
+ return '('.implode(', ', $tables).')';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert statement
+ *
+ * Generates a platform-specific insert string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the insert keys
+ * @param array the insert values
+ * @return string
+ */
+ function _insert($table, $keys, $values)
+ {
+ return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Update statement
+ *
+ * Generates a platform-specific update string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the update data
+ * @param array the where clause
+ * @param array the orderby clause
+ * @param array the limit clause
+ * @return string
+ */
+ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+ {
+ foreach($values as $key => $val)
+ {
+ $valstr[] = $key." = ".$val;
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+
+ $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+ $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+ $sql .= $orderby.$limit;
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Truncate statement
+ *
+ * Generates a platform-specific truncate string from the supplied data
+ * If the database does not support the truncate() command
+ * This function maps to "DELETE FROM table"
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _truncate($table)
+ {
+ return "TRUNCATE ".$table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete statement
+ *
+ * Generates a platform-specific delete string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the where clause
+ * @param string the limit clause
+ * @return string
+ */
+ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+ {
+ $conditions = '';
+
+ if (count($where) > 0 OR count($like) > 0)
+ {
+ $conditions = "\nWHERE ";
+ $conditions .= implode("\n", $this->ar_where);
+
+ if (count($where) > 0 && count($like) > 0)
+ {
+ $conditions .= " AND ";
+ }
+ $conditions .= implode("\n", $like);
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ return "DELETE FROM ".$table.$conditions.$limit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Limit string
+ *
+ * Generates a platform-specific LIMIT clause
+ *
+ * @access public
+ * @param string the sql query string
+ * @param integer the number of rows to limit the query to
+ * @param integer the offset value
+ * @return string
+ */
+ function _limit($sql, $limit, $offset)
+ {
+ if ($offset == 0)
+ {
+ $offset = '';
+ }
+ else
+ {
+ $offset .= ", ";
+ }
+
+ return $sql."LIMIT ".$offset.$limit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Close DB Connection
+ *
+ * @access public
+ * @param resource
+ * @return void
+ */
+ function _close($conn_id)
+ {
+ @mysql_close($conn_id);
+ }
+
+}
+
+
+/* End of file mysql_driver.php */
/* Location: ./system/database/drivers/mysql/mysql_driver.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * MySQL Forge Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mysql_forge extends CI_DB_forge {\r
- \r
- /**\r
- * Create database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database($name)\r
- {\r
- return "CREATE DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- return "DROP DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Process Fields\r
- *\r
- * @access private\r
- * @param mixed the fields\r
- * @return string\r
- */\r
- function _process_fields($fields)\r
- {\r
- $current_field_count = 0;\r
- $sql = '';\r
-\r
- foreach ($fields as $field=>$attributes)\r
- {\r
- // Numeric field names aren't allowed in databases, so if the key is\r
- // numeric, we know it was assigned by PHP and the developer manually\r
- // entered the field information, so we'll simply add it to the list\r
- if (is_numeric($field))\r
- {\r
- $sql .= "\n\t$attributes";\r
- }\r
- else\r
- {\r
- $attributes = array_change_key_case($attributes, CASE_UPPER);\r
- \r
- $sql .= "\n\t".$this->db->_protect_identifiers($field);\r
-\r
- if (array_key_exists('NAME', $attributes))\r
- {\r
- $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';\r
- }\r
- \r
- if (array_key_exists('TYPE', $attributes))\r
- {\r
- $sql .= ' '.$attributes['TYPE'];\r
- }\r
- \r
- if (array_key_exists('CONSTRAINT', $attributes))\r
- {\r
- $sql .= '('.$attributes['CONSTRAINT'].')';\r
- }\r
- \r
- if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)\r
- {\r
- $sql .= ' UNSIGNED';\r
- }\r
- \r
- if (array_key_exists('DEFAULT', $attributes))\r
- {\r
- $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';\r
- }\r
- \r
- if (array_key_exists('NULL', $attributes))\r
- {\r
- $sql .= ($attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL';\r
- }\r
- \r
- if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)\r
- {\r
- $sql .= ' AUTO_INCREMENT';\r
- }\r
- }\r
- \r
- // don't add a comma on the end of the last field\r
- if (++$current_field_count < count($fields))\r
- {\r
- $sql .= ',';\r
- }\r
- }\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Create Table\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @param mixed the fields\r
- * @param mixed primary key(s)\r
- * @param mixed key(s)\r
- * @param boolean should 'IF NOT EXISTS' be added to the SQL\r
- * @return bool\r
- */\r
- function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)\r
- {\r
- $sql = 'CREATE TABLE ';\r
- \r
- if ($if_not_exists === TRUE)\r
- {\r
- $sql .= 'IF NOT EXISTS ';\r
- }\r
- \r
- $sql .= $this->db->_escape_identifiers($table)." (";\r
-\r
- $sql .= $this->_process_fields($fields);\r
-\r
- if (count($primary_keys) > 0)\r
- {\r
- $key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));\r
- $primary_keys = $this->db->_protect_identifiers($primary_keys);\r
- $sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";\r
- }\r
-\r
- if (is_array($keys) && count($keys) > 0)\r
- {\r
- foreach ($keys as $key)\r
- {\r
- if (is_array($key))\r
- {\r
- $key_name = $this->db->_protect_identifiers(implode('_', $key));\r
- $key = $this->db->_protect_identifiers($key); \r
- }\r
- else\r
- {\r
- $key_name = $this->db->_protect_identifiers($key);\r
- $key = array($key_name);\r
- }\r
- \r
- $sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";\r
- }\r
- }\r
-\r
- $sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";\r
-\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop Table\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _drop_table($table)\r
- {\r
- return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Alter table query\r
- *\r
- * Generates a platform-specific query so that a table can be altered\r
- * Called by add_column(), drop_column(), and column_alter(),\r
- *\r
- * @access private\r
- * @param string the ALTER type (ADD, DROP, CHANGE)\r
- * @param string the column name\r
- * @param array fields\r
- * @param string the field after which we should add the new field\r
- * @return object\r
- */\r
- function _alter_table($alter_type, $table, $fields, $after_field = '')\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";\r
-\r
- // DROP has everything it needs now.\r
- if ($alter_type == 'DROP')\r
- {\r
- return $sql.$this->db->_protect_identifiers($fields);\r
- }\r
-\r
- $sql .= $this->_process_fields($fields);\r
-\r
- if ($after_field != '')\r
- {\r
- $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);\r
- }\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rename a table\r
- *\r
- * Generates a platform-specific query so that a table can be renamed\r
- *\r
- * @access private\r
- * @param string the old table name\r
- * @param string the new table name\r
- * @return string\r
- */\r
- function _rename_table($table_name, $new_table_name)\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);\r
- return $sql;\r
- }\r
-\r
-}\r
-\r
-/* End of file mysql_forge.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQL Forge Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysql_forge extends CI_DB_forge {
+
+ /**
+ * Create database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database($name)
+ {
+ return "CREATE DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ return "DROP DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Process Fields
+ *
+ * @access private
+ * @param mixed the fields
+ * @return string
+ */
+ function _process_fields($fields)
+ {
+ $current_field_count = 0;
+ $sql = '';
+
+ foreach ($fields as $field=>$attributes)
+ {
+ // Numeric field names aren't allowed in databases, so if the key is
+ // numeric, we know it was assigned by PHP and the developer manually
+ // entered the field information, so we'll simply add it to the list
+ if (is_numeric($field))
+ {
+ $sql .= "\n\t$attributes";
+ }
+ else
+ {
+ $attributes = array_change_key_case($attributes, CASE_UPPER);
+
+ $sql .= "\n\t".$this->db->_protect_identifiers($field);
+
+ if (array_key_exists('NAME', $attributes))
+ {
+ $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';
+ }
+
+ if (array_key_exists('TYPE', $attributes))
+ {
+ $sql .= ' '.$attributes['TYPE'];
+ }
+
+ if (array_key_exists('CONSTRAINT', $attributes))
+ {
+ $sql .= '('.$attributes['CONSTRAINT'].')';
+ }
+
+ if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+ {
+ $sql .= ' UNSIGNED';
+ }
+
+ if (array_key_exists('DEFAULT', $attributes))
+ {
+ $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+ }
+
+ if (array_key_exists('NULL', $attributes))
+ {
+ $sql .= ($attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL';
+ }
+
+ if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+ {
+ $sql .= ' AUTO_INCREMENT';
+ }
+ }
+
+ // don't add a comma on the end of the last field
+ if (++$current_field_count < count($fields))
+ {
+ $sql .= ',';
+ }
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create Table
+ *
+ * @access private
+ * @param string the table name
+ * @param mixed the fields
+ * @param mixed primary key(s)
+ * @param mixed key(s)
+ * @param boolean should 'IF NOT EXISTS' be added to the SQL
+ * @return bool
+ */
+ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+ {
+ $sql = 'CREATE TABLE ';
+
+ if ($if_not_exists === TRUE)
+ {
+ $sql .= 'IF NOT EXISTS ';
+ }
+
+ $sql .= $this->db->_escape_identifiers($table)." (";
+
+ $sql .= $this->_process_fields($fields);
+
+ if (count($primary_keys) > 0)
+ {
+ $key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));
+ $primary_keys = $this->db->_protect_identifiers($primary_keys);
+ $sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";
+ }
+
+ if (is_array($keys) && count($keys) > 0)
+ {
+ foreach ($keys as $key)
+ {
+ if (is_array($key))
+ {
+ $key_name = $this->db->_protect_identifiers(implode('_', $key));
+ $key = $this->db->_protect_identifiers($key);
+ }
+ else
+ {
+ $key_name = $this->db->_protect_identifiers($key);
+ $key = array($key_name);
+ }
+
+ $sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";
+ }
+ }
+
+ $sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop Table
+ *
+ * @access private
+ * @return string
+ */
+ function _drop_table($table)
+ {
+ return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alter table query
+ *
+ * Generates a platform-specific query so that a table can be altered
+ * Called by add_column(), drop_column(), and column_alter(),
+ *
+ * @access private
+ * @param string the ALTER type (ADD, DROP, CHANGE)
+ * @param string the column name
+ * @param array fields
+ * @param string the field after which we should add the new field
+ * @return object
+ */
+ function _alter_table($alter_type, $table, $fields, $after_field = '')
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
+
+ // DROP has everything it needs now.
+ if ($alter_type == 'DROP')
+ {
+ return $sql.$this->db->_protect_identifiers($fields);
+ }
+
+ $sql .= $this->_process_fields($fields);
+
+ if ($after_field != '')
+ {
+ $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rename a table
+ *
+ * Generates a platform-specific query so that a table can be renamed
+ *
+ * @access private
+ * @param string the old table name
+ * @param string the new table name
+ * @return string
+ */
+ function _rename_table($table_name, $new_table_name)
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+ return $sql;
+ }
+
+}
+
+/* End of file mysql_forge.php */
/* Location: ./system/database/drivers/mysql/mysql_forge.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * MySQL Result Class\r
- *\r
- * This class extends the parent result class: CI_DB_result\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mysql_result extends CI_DB_result {\r
-\r
- /**\r
- * Number of rows in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_rows()\r
- {\r
- return @mysql_num_rows($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Number of fields in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_fields()\r
- {\r
- return @mysql_num_fields($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch Field Names\r
- *\r
- * Generates an array of column names\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function list_fields()\r
- {\r
- $field_names = array();\r
- while ($field = mysql_fetch_field($this->result_id))\r
- {\r
- $field_names[] = $field->name;\r
- }\r
- \r
- return $field_names;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data\r
- *\r
- * Generates an array of objects containing field meta-data\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function field_data()\r
- {\r
- $retval = array();\r
- while ($field = mysql_fetch_field($this->result_id))\r
- { \r
- $F = new stdClass();\r
- $F->name = $field->name;\r
- $F->type = $field->type;\r
- $F->default = $field->def;\r
- $F->max_length = $field->max_length;\r
- $F->primary_key = $field->primary_key;\r
- \r
- $retval[] = $F;\r
- }\r
- \r
- return $retval;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Free the result\r
- *\r
- * @return null\r
- */ \r
- function free_result()\r
- {\r
- if (is_resource($this->result_id))\r
- {\r
- mysql_free_result($this->result_id);\r
- $this->result_id = FALSE;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Data Seek\r
- *\r
- * Moves the internal pointer to the desired offset. We call\r
- * this internally before fetching results to make sure the\r
- * result set starts at zero\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _data_seek($n = 0)\r
- {\r
- return mysql_data_seek($this->result_id, $n);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - associative array\r
- *\r
- * Returns the result set as an array\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _fetch_assoc()\r
- {\r
- return mysql_fetch_assoc($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - object\r
- *\r
- * Returns the result set as an object\r
- *\r
- * @access private\r
- * @return object\r
- */\r
- function _fetch_object()\r
- {\r
- return mysql_fetch_object($this->result_id);\r
- }\r
- \r
-}\r
-\r
-\r
-/* End of file mysql_result.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// --------------------------------------------------------------------
+
+/**
+ * MySQL Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysql_result extends CI_DB_result {
+
+ /**
+ * Number of rows in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_rows()
+ {
+ return @mysql_num_rows($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Number of fields in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_fields()
+ {
+ return @mysql_num_fields($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch Field Names
+ *
+ * Generates an array of column names
+ *
+ * @access public
+ * @return array
+ */
+ function list_fields()
+ {
+ $field_names = array();
+ while ($field = mysql_fetch_field($this->result_id))
+ {
+ $field_names[] = $field->name;
+ }
+
+ return $field_names;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data
+ *
+ * Generates an array of objects containing field meta-data
+ *
+ * @access public
+ * @return array
+ */
+ function field_data()
+ {
+ $retval = array();
+ while ($field = mysql_fetch_field($this->result_id))
+ {
+ $F = new stdClass();
+ $F->name = $field->name;
+ $F->type = $field->type;
+ $F->default = $field->def;
+ $F->max_length = $field->max_length;
+ $F->primary_key = $field->primary_key;
+
+ $retval[] = $F;
+ }
+
+ return $retval;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Free the result
+ *
+ * @return null
+ */
+ function free_result()
+ {
+ if (is_resource($this->result_id))
+ {
+ mysql_free_result($this->result_id);
+ $this->result_id = FALSE;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Data Seek
+ *
+ * Moves the internal pointer to the desired offset. We call
+ * this internally before fetching results to make sure the
+ * result set starts at zero
+ *
+ * @access private
+ * @return array
+ */
+ function _data_seek($n = 0)
+ {
+ return mysql_data_seek($this->result_id, $n);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - associative array
+ *
+ * Returns the result set as an array
+ *
+ * @access private
+ * @return array
+ */
+ function _fetch_assoc()
+ {
+ return mysql_fetch_assoc($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - object
+ *
+ * Returns the result set as an object
+ *
+ * @access private
+ * @return object
+ */
+ function _fetch_object()
+ {
+ return mysql_fetch_object($this->result_id);
+ }
+
+}
+
+
+/* End of file mysql_result.php */
/* Location: ./system/database/drivers/mysql/mysql_result.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * MySQL Utility Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mysql_utility extends CI_DB_utility {\r
-\r
- /**\r
- * List databases\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _list_databases()\r
- {\r
- return "SHOW DATABASES";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Optimize table query\r
- *\r
- * Generates a platform-specific query so that a table can be optimized\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _optimize_table($table)\r
- {\r
- return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Repair table query\r
- *\r
- * Generates a platform-specific query so that a table can be repaired\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _repair_table($table)\r
- {\r
- return "REPAIR TABLE ".$this->db->_escape_identifiers($table);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- /**\r
- * MySQL Export\r
- *\r
- * @access private\r
- * @param array Preferences\r
- * @return mixed\r
- */\r
- function _backup($params = array())\r
- {\r
- if (count($params) == 0)\r
- {\r
- return FALSE;\r
- }\r
-\r
- // Extract the prefs for simplicity\r
- extract($params);\r
- \r
- // Build the output\r
- $output = '';\r
- foreach ((array)$tables as $table)\r
- {\r
- // Is the table in the "ignore" list?\r
- if (in_array($table, (array)$ignore, TRUE))\r
- {\r
- continue;\r
- }\r
-\r
- // Get the table schema\r
- $query = $this->db->query("SHOW CREATE TABLE `".$this->db->database.'`.'.$table);\r
- \r
- // No result means the table name was invalid\r
- if ($query === FALSE)\r
- {\r
- continue;\r
- }\r
- \r
- // Write out the table schema\r
- $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline;\r
-\r
- if ($add_drop == TRUE)\r
- {\r
- $output .= 'DROP TABLE IF EXISTS '.$table.';'.$newline.$newline;\r
- }\r
- \r
- $i = 0;\r
- $result = $query->result_array();\r
- foreach ($result[0] as $val)\r
- {\r
- if ($i++ % 2)\r
- { \r
- $output .= $val.';'.$newline.$newline;\r
- }\r
- }\r
- \r
- // If inserts are not needed we're done...\r
- if ($add_insert == FALSE)\r
- {\r
- continue;\r
- }\r
-\r
- // Grab all the data from the current table\r
- $query = $this->db->query("SELECT * FROM $table");\r
- \r
- if ($query->num_rows() == 0)\r
- {\r
- continue;\r
- }\r
- \r
- // Fetch the field names and determine if the field is an\r
- // integer type. We use this info to decide whether to\r
- // surround the data with quotes or not\r
- \r
- $i = 0;\r
- $field_str = '';\r
- $is_int = array();\r
- while ($field = mysql_fetch_field($query->result_id))\r
- {\r
- // Most versions of MySQL store timestamp as a string\r
- $is_int[$i] = (in_array(\r
- strtolower(mysql_field_type($query->result_id, $i)),\r
- array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), \r
- TRUE)\r
- ) ? TRUE : FALSE;\r
- \r
- // Create a string of field names\r
- $field_str .= '`'.$field->name.'`, ';\r
- $i++;\r
- }\r
- \r
- // Trim off the end comma\r
- $field_str = preg_replace( "/, $/" , "" , $field_str);\r
- \r
- \r
- // Build the insert string\r
- foreach ($query->result_array() as $row)\r
- {\r
- $val_str = '';\r
- \r
- $i = 0;\r
- foreach ($row as $v)\r
- {\r
- // Is the value NULL?\r
- if ($v === NULL)\r
- {\r
- $val_str .= 'NULL';\r
- }\r
- else\r
- {\r
- // Escape the data if it's not an integer\r
- if ($is_int[$i] == FALSE)\r
- {\r
- $val_str .= $this->db->escape($v);\r
- }\r
- else\r
- {\r
- $val_str .= $v;\r
- } \r
- } \r
- \r
- // Append a comma\r
- $val_str .= ', ';\r
- $i++;\r
- }\r
- \r
- // Remove the comma at the end of the string\r
- $val_str = preg_replace( "/, $/" , "" , $val_str);\r
- \r
- // Build the INSERT string\r
- $output .= 'INSERT INTO '.$table.' ('.$field_str.') VALUES ('.$val_str.');'.$newline;\r
- }\r
- \r
- $output .= $newline.$newline;\r
- }\r
-\r
- return $output;\r
- }\r
-\r
- /**\r
- *\r
- * The functions below have been deprecated as of 1.6, and are only here for backwards\r
- * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation\r
- * is STRONGLY discouraged in favour if using dbforge.\r
- *\r
- */\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database($name)\r
- {\r
- return "CREATE DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- return "DROP DATABASE ".$name;\r
- }\r
-\r
-}\r
-\r
-/* End of file mysql_utility.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQL Utility Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysql_utility extends CI_DB_utility {
+
+ /**
+ * List databases
+ *
+ * @access private
+ * @return bool
+ */
+ function _list_databases()
+ {
+ return "SHOW DATABASES";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Optimize table query
+ *
+ * Generates a platform-specific query so that a table can be optimized
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _optimize_table($table)
+ {
+ return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Repair table query
+ *
+ * Generates a platform-specific query so that a table can be repaired
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _repair_table($table)
+ {
+ return "REPAIR TABLE ".$this->db->_escape_identifiers($table);
+ }
+
+ // --------------------------------------------------------------------
+ /**
+ * MySQL Export
+ *
+ * @access private
+ * @param array Preferences
+ * @return mixed
+ */
+ function _backup($params = array())
+ {
+ if (count($params) == 0)
+ {
+ return FALSE;
+ }
+
+ // Extract the prefs for simplicity
+ extract($params);
+
+ // Build the output
+ $output = '';
+ foreach ((array)$tables as $table)
+ {
+ // Is the table in the "ignore" list?
+ if (in_array($table, (array)$ignore, TRUE))
+ {
+ continue;
+ }
+
+ // Get the table schema
+ $query = $this->db->query("SHOW CREATE TABLE `".$this->db->database.'`.'.$table);
+
+ // No result means the table name was invalid
+ if ($query === FALSE)
+ {
+ continue;
+ }
+
+ // Write out the table schema
+ $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline;
+
+ if ($add_drop == TRUE)
+ {
+ $output .= 'DROP TABLE IF EXISTS '.$table.';'.$newline.$newline;
+ }
+
+ $i = 0;
+ $result = $query->result_array();
+ foreach ($result[0] as $val)
+ {
+ if ($i++ % 2)
+ {
+ $output .= $val.';'.$newline.$newline;
+ }
+ }
+
+ // If inserts are not needed we're done...
+ if ($add_insert == FALSE)
+ {
+ continue;
+ }
+
+ // Grab all the data from the current table
+ $query = $this->db->query("SELECT * FROM $table");
+
+ if ($query->num_rows() == 0)
+ {
+ continue;
+ }
+
+ // Fetch the field names and determine if the field is an
+ // integer type. We use this info to decide whether to
+ // surround the data with quotes or not
+
+ $i = 0;
+ $field_str = '';
+ $is_int = array();
+ while ($field = mysql_fetch_field($query->result_id))
+ {
+ // Most versions of MySQL store timestamp as a string
+ $is_int[$i] = (in_array(
+ strtolower(mysql_field_type($query->result_id, $i)),
+ array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'),
+ TRUE)
+ ) ? TRUE : FALSE;
+
+ // Create a string of field names
+ $field_str .= '`'.$field->name.'`, ';
+ $i++;
+ }
+
+ // Trim off the end comma
+ $field_str = preg_replace( "/, $/" , "" , $field_str);
+
+
+ // Build the insert string
+ foreach ($query->result_array() as $row)
+ {
+ $val_str = '';
+
+ $i = 0;
+ foreach ($row as $v)
+ {
+ // Is the value NULL?
+ if ($v === NULL)
+ {
+ $val_str .= 'NULL';
+ }
+ else
+ {
+ // Escape the data if it's not an integer
+ if ($is_int[$i] == FALSE)
+ {
+ $val_str .= $this->db->escape($v);
+ }
+ else
+ {
+ $val_str .= $v;
+ }
+ }
+
+ // Append a comma
+ $val_str .= ', ';
+ $i++;
+ }
+
+ // Remove the comma at the end of the string
+ $val_str = preg_replace( "/, $/" , "" , $val_str);
+
+ // Build the INSERT string
+ $output .= 'INSERT INTO '.$table.' ('.$field_str.') VALUES ('.$val_str.');'.$newline;
+ }
+
+ $output .= $newline.$newline;
+ }
+
+ return $output;
+ }
+
+ /**
+ *
+ * The functions below have been deprecated as of 1.6, and are only here for backwards
+ * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation
+ * is STRONGLY discouraged in favour if using dbforge.
+ *
+ */
+
+ /**
+ * Create database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database($name)
+ {
+ return "CREATE DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ return "DROP DATABASE ".$name;
+ }
+
+}
+
+/* End of file mysql_utility.php */
/* Location: ./system/database/drivers/mysql/mysql_utility.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * MySQLi Database Adapter Class - MySQLi only works with PHP 5\r
- *\r
- * Note: _DB is an extender class that the app controller\r
- * creates dynamically based on whether the active record\r
- * class is being used or not.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Drivers\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mysqli_driver extends CI_DB {\r
-\r
- var $dbdriver = 'mysqli';\r
- \r
- // The character used for escaping\r
- var $_escape_char = '`';\r
-\r
- /**\r
- * The syntax to count rows is slightly different across different\r
- * database engines, so this string appears in each driver and is\r
- * used for the count_all() and count_all_results() functions.\r
- */\r
- var $_count_string = "SELECT COUNT(*) AS ";\r
- var $_random_keyword = ' RAND()'; // database specific random keyword\r
-\r
- /**\r
- * Whether to use the MySQL "delete hack" which allows the number\r
- * of affected rows to be shown. Uses a preg_replace when enabled,\r
- * adding a bit more processing to all queries.\r
- */ \r
- var $delete_hack = TRUE;\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Non-persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_connect()\r
- {\r
- return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_pconnect()\r
- {\r
- return $this->db_connect();\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select the database\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_select()\r
- {\r
- return @mysqli_select_db($this->conn_id, $this->database);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set client character set\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @return resource\r
- */\r
- function _db_set_charset($charset, $collation)\r
- {\r
- return @mysqli_query($this->conn_id, "SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Version number query string\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function _version()\r
- {\r
- return "SELECT version() AS ver";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Execute the query\r
- *\r
- * @access private called by the base class\r
- * @param string an SQL query\r
- * @return resource\r
- */ \r
- function _execute($sql)\r
- {\r
- $sql = $this->_prep_query($sql); \r
- $result = @mysqli_query($this->conn_id, $sql);\r
- return $result;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Prep the query\r
- *\r
- * If needed, each database adapter can prep the query string\r
- *\r
- * @access private called by execute()\r
- * @param string an SQL query\r
- * @return string\r
- */ \r
- function _prep_query($sql)\r
- {\r
- // "DELETE FROM TABLE" returns 0 affected rows This hack modifies\r
- // the query so that it returns the number of affected rows\r
- if ($this->delete_hack === TRUE)\r
- {\r
- if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))\r
- {\r
- $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);\r
- }\r
- }\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Begin Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_begin($test_mode = FALSE)\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
- \r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // Reset the transaction failure flag.\r
- // If the $test_mode flag is set to TRUE transactions will be rolled back\r
- // even if the queries produce a successful result.\r
- $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;\r
-\r
- $this->simple_query('SET AUTOCOMMIT=0');\r
- $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Commit Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_commit()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $this->simple_query('COMMIT');\r
- $this->simple_query('SET AUTOCOMMIT=1');\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rollback Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_rollback()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $this->simple_query('ROLLBACK');\r
- $this->simple_query('SET AUTOCOMMIT=1');\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape String\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function escape_str($str) \r
- {\r
- if (function_exists('mysqli_real_escape_string') AND is_object($this->conn_id))\r
- {\r
- return mysqli_real_escape_string($this->conn_id, $str);\r
- }\r
- elseif (function_exists('mysql_escape_string'))\r
- {\r
- return mysql_escape_string($str);\r
- }\r
- else\r
- {\r
- return addslashes($str);\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Affected Rows\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function affected_rows()\r
- {\r
- return @mysqli_affected_rows($this->conn_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Insert ID\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function insert_id()\r
- {\r
- return @mysqli_insert_id($this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * "Count All" query\r
- *\r
- * Generates a platform-specific query string that counts all records in\r
- * the specified database\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function count_all($table = '')\r
- {\r
- if ($table == '')\r
- return '0';\r
- \r
- $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));\r
- \r
- if ($query->num_rows() == 0)\r
- return '0';\r
-\r
- $row = $query->row();\r
- return $row->numrows;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * List table query\r
- *\r
- * Generates a platform-specific query string so that the table names can be fetched\r
- *\r
- * @access private\r
- * @param boolean\r
- * @return string\r
- */\r
- function _list_tables($prefix_limit = FALSE)\r
- {\r
- $sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char; \r
- \r
- if ($prefix_limit !== FALSE AND $this->dbprefix != '')\r
- {\r
- $sql .= " LIKE '".$this->dbprefix."%'";\r
- }\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Show column query\r
- *\r
- * Generates a platform-specific query string so that the column names can be fetched\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */\r
- function _list_columns($table = '')\r
- {\r
- return "SHOW COLUMNS FROM ".$table;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data query\r
- *\r
- * Generates a platform-specific query so that the column data can be retrieved\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _field_data($table)\r
- {\r
- return "SELECT * FROM ".$table." LIMIT 1";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message string\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _error_message()\r
- {\r
- return mysqli_error($this->conn_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message number\r
- *\r
- * @access private\r
- * @return integer\r
- */\r
- function _error_number()\r
- {\r
- return mysqli_errno($this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape the SQL Identifiers\r
- *\r
- * This function escapes column and table names\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _escape_identifiers($item)\r
- {\r
- if ($this->_escape_char == '')\r
- {\r
- return $item;\r
- }\r
- \r
- if (strpos($item, '.') !== FALSE)\r
- {\r
- $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; \r
- }\r
- else\r
- {\r
- $str = $this->_escape_char.$item.$this->_escape_char;\r
- }\r
- \r
- // remove duplicates if the user already included the escape\r
- return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * From Tables\r
- *\r
- * This function implicitly groups FROM tables so there is no confusion\r
- * about operator precedence in harmony with SQL standards\r
- *\r
- * @access public\r
- * @param type\r
- * @return type\r
- */\r
- function _from_tables($tables)\r
- {\r
- if ( ! is_array($tables))\r
- {\r
- $tables = array($tables);\r
- }\r
- \r
- return '('.implode(', ', $tables).')';\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Insert statement\r
- *\r
- * Generates a platform-specific insert string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the insert keys\r
- * @param array the insert values\r
- * @return string\r
- */\r
- function _insert($table, $keys, $values)\r
- { \r
- return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Update statement\r
- *\r
- * Generates a platform-specific update string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the update data\r
- * @param array the where clause\r
- * @param array the orderby clause\r
- * @param array the limit clause\r
- * @return string\r
- */\r
- function _update($table, $values, $where, $orderby = array(), $limit = FALSE)\r
- {\r
- foreach($values as $key => $val)\r
- {\r
- $valstr[] = $key." = ".$val;\r
- }\r
- \r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';\r
- \r
- $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);\r
- \r
- $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';\r
- \r
- $sql .= $orderby.$limit;\r
- \r
- return $sql;\r
- }\r
-\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Truncate statement\r
- *\r
- * Generates a platform-specific truncate string from the supplied data\r
- * If the database does not support the truncate() command\r
- * This function maps to "DELETE FROM table"\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */ \r
- function _truncate($table)\r
- {\r
- return "TRUNCATE ".$table;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete statement\r
- *\r
- * Generates a platform-specific delete string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the where clause\r
- * @param string the limit clause\r
- * @return string\r
- */ \r
- function _delete($table, $where = array(), $like = array(), $limit = FALSE)\r
- {\r
- $conditions = '';\r
-\r
- if (count($where) > 0 OR count($like) > 0)\r
- {\r
- $conditions = "\nWHERE ";\r
- $conditions .= implode("\n", $this->ar_where);\r
-\r
- if (count($where) > 0 && count($like) > 0)\r
- {\r
- $conditions .= " AND ";\r
- }\r
- $conditions .= implode("\n", $like);\r
- }\r
-\r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- return "DELETE FROM ".$table.$conditions.$limit;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Limit string\r
- *\r
- * Generates a platform-specific LIMIT clause\r
- *\r
- * @access public\r
- * @param string the sql query string\r
- * @param integer the number of rows to limit the query to\r
- * @param integer the offset value\r
- * @return string\r
- */\r
- function _limit($sql, $limit, $offset)\r
- { \r
- $sql .= "LIMIT ".$limit;\r
- \r
- if ($offset > 0)\r
- {\r
- $sql .= " OFFSET ".$offset;\r
- }\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Close DB Connection\r
- *\r
- * @access public\r
- * @param resource\r
- * @return void\r
- */\r
- function _close($conn_id)\r
- {\r
- @mysqli_close($conn_id);\r
- }\r
-\r
-\r
-}\r
-\r
-\r
-/* End of file mysqli_driver.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQLi Database Adapter Class - MySQLi only works with PHP 5
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package CodeIgniter
+ * @subpackage Drivers
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysqli_driver extends CI_DB {
+
+ var $dbdriver = 'mysqli';
+
+ // The character used for escaping
+ var $_escape_char = '`';
+
+ /**
+ * The syntax to count rows is slightly different across different
+ * database engines, so this string appears in each driver and is
+ * used for the count_all() and count_all_results() functions.
+ */
+ var $_count_string = "SELECT COUNT(*) AS ";
+ var $_random_keyword = ' RAND()'; // database specific random keyword
+
+ /**
+ * Whether to use the MySQL "delete hack" which allows the number
+ * of affected rows to be shown. Uses a preg_replace when enabled,
+ * adding a bit more processing to all queries.
+ */
+ var $delete_hack = TRUE;
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Non-persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_connect()
+ {
+ return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_pconnect()
+ {
+ return $this->db_connect();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select the database
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_select()
+ {
+ return @mysqli_select_db($this->conn_id, $this->database);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set client character set
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @return resource
+ */
+ function _db_set_charset($charset, $collation)
+ {
+ return @mysqli_query($this->conn_id, "SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Version number query string
+ *
+ * @access public
+ * @return string
+ */
+ function _version()
+ {
+ return "SELECT version() AS ver";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Execute the query
+ *
+ * @access private called by the base class
+ * @param string an SQL query
+ * @return resource
+ */
+ function _execute($sql)
+ {
+ $sql = $this->_prep_query($sql);
+ $result = @mysqli_query($this->conn_id, $sql);
+ return $result;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep the query
+ *
+ * If needed, each database adapter can prep the query string
+ *
+ * @access private called by execute()
+ * @param string an SQL query
+ * @return string
+ */
+ function _prep_query($sql)
+ {
+ // "DELETE FROM TABLE" returns 0 affected rows This hack modifies
+ // the query so that it returns the number of affected rows
+ if ($this->delete_hack === TRUE)
+ {
+ if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
+ {
+ $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);
+ }
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Begin Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_begin($test_mode = FALSE)
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ // Reset the transaction failure flag.
+ // If the $test_mode flag is set to TRUE transactions will be rolled back
+ // even if the queries produce a successful result.
+ $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+ $this->simple_query('SET AUTOCOMMIT=0');
+ $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Commit Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_commit()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $this->simple_query('COMMIT');
+ $this->simple_query('SET AUTOCOMMIT=1');
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rollback Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_rollback()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $this->simple_query('ROLLBACK');
+ $this->simple_query('SET AUTOCOMMIT=1');
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape String
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function escape_str($str)
+ {
+ if (function_exists('mysqli_real_escape_string') AND is_object($this->conn_id))
+ {
+ return mysqli_real_escape_string($this->conn_id, $str);
+ }
+ elseif (function_exists('mysql_escape_string'))
+ {
+ return mysql_escape_string($str);
+ }
+ else
+ {
+ return addslashes($str);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Affected Rows
+ *
+ * @access public
+ * @return integer
+ */
+ function affected_rows()
+ {
+ return @mysqli_affected_rows($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert ID
+ *
+ * @access public
+ * @return integer
+ */
+ function insert_id()
+ {
+ return @mysqli_insert_id($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * "Count All" query
+ *
+ * Generates a platform-specific query string that counts all records in
+ * the specified database
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function count_all($table = '')
+ {
+ if ($table == '')
+ return '0';
+
+ $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+
+ if ($query->num_rows() == 0)
+ return '0';
+
+ $row = $query->row();
+ return $row->numrows;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * List table query
+ *
+ * Generates a platform-specific query string so that the table names can be fetched
+ *
+ * @access private
+ * @param boolean
+ * @return string
+ */
+ function _list_tables($prefix_limit = FALSE)
+ {
+ $sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char;
+
+ if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+ {
+ $sql .= " LIKE '".$this->dbprefix."%'";
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show column query
+ *
+ * Generates a platform-specific query string so that the column names can be fetched
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _list_columns($table = '')
+ {
+ return "SHOW COLUMNS FROM ".$table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data query
+ *
+ * Generates a platform-specific query so that the column data can be retrieved
+ *
+ * @access public
+ * @param string the table name
+ * @return object
+ */
+ function _field_data($table)
+ {
+ return "SELECT * FROM ".$table." LIMIT 1";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message string
+ *
+ * @access private
+ * @return string
+ */
+ function _error_message()
+ {
+ return mysqli_error($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message number
+ *
+ * @access private
+ * @return integer
+ */
+ function _error_number()
+ {
+ return mysqli_errno($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape the SQL Identifiers
+ *
+ * This function escapes column and table names
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _escape_identifiers($item)
+ {
+ if ($this->_escape_char == '')
+ {
+ return $item;
+ }
+
+ if (strpos($item, '.') !== FALSE)
+ {
+ $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
+ }
+ else
+ {
+ $str = $this->_escape_char.$item.$this->_escape_char;
+ }
+
+ // remove duplicates if the user already included the escape
+ return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * From Tables
+ *
+ * This function implicitly groups FROM tables so there is no confusion
+ * about operator precedence in harmony with SQL standards
+ *
+ * @access public
+ * @param type
+ * @return type
+ */
+ function _from_tables($tables)
+ {
+ if ( ! is_array($tables))
+ {
+ $tables = array($tables);
+ }
+
+ return '('.implode(', ', $tables).')';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert statement
+ *
+ * Generates a platform-specific insert string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the insert keys
+ * @param array the insert values
+ * @return string
+ */
+ function _insert($table, $keys, $values)
+ {
+ return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Update statement
+ *
+ * Generates a platform-specific update string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the update data
+ * @param array the where clause
+ * @param array the orderby clause
+ * @param array the limit clause
+ * @return string
+ */
+ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+ {
+ foreach($values as $key => $val)
+ {
+ $valstr[] = $key." = ".$val;
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+
+ $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+ $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+ $sql .= $orderby.$limit;
+
+ return $sql;
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Truncate statement
+ *
+ * Generates a platform-specific truncate string from the supplied data
+ * If the database does not support the truncate() command
+ * This function maps to "DELETE FROM table"
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _truncate($table)
+ {
+ return "TRUNCATE ".$table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete statement
+ *
+ * Generates a platform-specific delete string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the where clause
+ * @param string the limit clause
+ * @return string
+ */
+ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+ {
+ $conditions = '';
+
+ if (count($where) > 0 OR count($like) > 0)
+ {
+ $conditions = "\nWHERE ";
+ $conditions .= implode("\n", $this->ar_where);
+
+ if (count($where) > 0 && count($like) > 0)
+ {
+ $conditions .= " AND ";
+ }
+ $conditions .= implode("\n", $like);
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ return "DELETE FROM ".$table.$conditions.$limit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Limit string
+ *
+ * Generates a platform-specific LIMIT clause
+ *
+ * @access public
+ * @param string the sql query string
+ * @param integer the number of rows to limit the query to
+ * @param integer the offset value
+ * @return string
+ */
+ function _limit($sql, $limit, $offset)
+ {
+ $sql .= "LIMIT ".$limit;
+
+ if ($offset > 0)
+ {
+ $sql .= " OFFSET ".$offset;
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Close DB Connection
+ *
+ * @access public
+ * @param resource
+ * @return void
+ */
+ function _close($conn_id)
+ {
+ @mysqli_close($conn_id);
+ }
+
+
+}
+
+
+/* End of file mysqli_driver.php */
/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * MySQLi Forge Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mysqli_forge extends CI_DB_forge {\r
- \r
- /**\r
- * Create database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database($name)\r
- {\r
- return "CREATE DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- return "DROP DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Process Fields\r
- *\r
- * @access private\r
- * @param mixed the fields\r
- * @return string\r
- */\r
- function _process_fields($fields)\r
- {\r
- $current_field_count = 0;\r
- $sql = '';\r
-\r
- foreach ($fields as $field=>$attributes)\r
- {\r
- // Numeric field names aren't allowed in databases, so if the key is\r
- // numeric, we know it was assigned by PHP and the developer manually\r
- // entered the field information, so we'll simply add it to the list\r
- if (is_numeric($field))\r
- {\r
- $sql .= "\n\t$attributes";\r
- }\r
- else\r
- {\r
- $attributes = array_change_key_case($attributes, CASE_UPPER);\r
- \r
- $sql .= "\n\t".$this->db->_protect_identifiers($field);\r
-\r
- if (array_key_exists('NAME', $attributes))\r
- {\r
- $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';\r
- }\r
- \r
- if (array_key_exists('TYPE', $attributes))\r
- {\r
- $sql .= ' '.$attributes['TYPE'];\r
- }\r
- \r
- if (array_key_exists('CONSTRAINT', $attributes))\r
- {\r
- $sql .= '('.$attributes['CONSTRAINT'].')';\r
- }\r
- \r
- if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)\r
- {\r
- $sql .= ' UNSIGNED';\r
- }\r
- \r
- if (array_key_exists('DEFAULT', $attributes))\r
- {\r
- $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';\r
- }\r
- \r
- if (array_key_exists('NULL', $attributes))\r
- {\r
- $sql .= ($attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL';\r
- }\r
- \r
- if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)\r
- {\r
- $sql .= ' AUTO_INCREMENT';\r
- }\r
- }\r
- \r
- // don't add a comma on the end of the last field\r
- if (++$current_field_count < count($fields))\r
- {\r
- $sql .= ',';\r
- }\r
- }\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Create Table\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @param mixed the fields\r
- * @param mixed primary key(s)\r
- * @param mixed key(s)\r
- * @param boolean should 'IF NOT EXISTS' be added to the SQL\r
- * @return bool\r
- */\r
- function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)\r
- {\r
- $sql = 'CREATE TABLE ';\r
- \r
- if ($if_not_exists === TRUE)\r
- {\r
- $sql .= 'IF NOT EXISTS ';\r
- }\r
- \r
- $sql .= $this->db->_escape_identifiers($table)." (";\r
-\r
- $sql .= $this->_process_fields($fields);\r
-\r
- if (count($primary_keys) > 0)\r
- {\r
- $key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));\r
- $primary_keys = $this->db->_protect_identifiers($primary_keys);\r
- $sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";\r
- }\r
-\r
- if (is_array($keys) && count($keys) > 0)\r
- {\r
- foreach ($keys as $key)\r
- {\r
- if (is_array($key))\r
- {\r
- $key_name = $this->db->_protect_identifiers(implode('_', $key));\r
- $key = $this->db->_protect_identifiers($key); \r
- }\r
- else\r
- {\r
- $key_name = $this->db->_protect_identifiers($key);\r
- $key = array($key_name);\r
- }\r
- \r
- $sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";\r
- }\r
- }\r
-\r
- $sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";\r
-\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop Table\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _drop_table($table)\r
- {\r
- return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Alter table query\r
- *\r
- * Generates a platform-specific query so that a table can be altered\r
- * Called by add_column(), drop_column(), and column_alter(),\r
- *\r
- * @access private\r
- * @param string the ALTER type (ADD, DROP, CHANGE)\r
- * @param string the column name\r
- * @param array fields\r
- * @param string the field after which we should add the new field\r
- * @return object\r
- */\r
- function _alter_table($alter_type, $table, $fields, $after_field = '')\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";\r
-\r
- // DROP has everything it needs now.\r
- if ($alter_type == 'DROP')\r
- {\r
- return $sql.$this->db->_protect_identifiers($fields);\r
- }\r
-\r
- $sql .= $this->_process_fields($fields);\r
-\r
- if ($after_field != '')\r
- {\r
- $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);\r
- }\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rename a table\r
- *\r
- * Generates a platform-specific query so that a table can be renamed\r
- *\r
- * @access private\r
- * @param string the old table name\r
- * @param string the new table name\r
- * @return string\r
- */\r
- function _rename_table($table_name, $new_table_name)\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);\r
- return $sql;\r
- }\r
-\r
-}\r
-\r
-/* End of file mysqli_forge.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQLi Forge Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysqli_forge extends CI_DB_forge {
+
+ /**
+ * Create database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database($name)
+ {
+ return "CREATE DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ return "DROP DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Process Fields
+ *
+ * @access private
+ * @param mixed the fields
+ * @return string
+ */
+ function _process_fields($fields)
+ {
+ $current_field_count = 0;
+ $sql = '';
+
+ foreach ($fields as $field=>$attributes)
+ {
+ // Numeric field names aren't allowed in databases, so if the key is
+ // numeric, we know it was assigned by PHP and the developer manually
+ // entered the field information, so we'll simply add it to the list
+ if (is_numeric($field))
+ {
+ $sql .= "\n\t$attributes";
+ }
+ else
+ {
+ $attributes = array_change_key_case($attributes, CASE_UPPER);
+
+ $sql .= "\n\t".$this->db->_protect_identifiers($field);
+
+ if (array_key_exists('NAME', $attributes))
+ {
+ $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';
+ }
+
+ if (array_key_exists('TYPE', $attributes))
+ {
+ $sql .= ' '.$attributes['TYPE'];
+ }
+
+ if (array_key_exists('CONSTRAINT', $attributes))
+ {
+ $sql .= '('.$attributes['CONSTRAINT'].')';
+ }
+
+ if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+ {
+ $sql .= ' UNSIGNED';
+ }
+
+ if (array_key_exists('DEFAULT', $attributes))
+ {
+ $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+ }
+
+ if (array_key_exists('NULL', $attributes))
+ {
+ $sql .= ($attributes['NULL'] === TRUE) ? ' NULL' : ' NOT NULL';
+ }
+
+ if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+ {
+ $sql .= ' AUTO_INCREMENT';
+ }
+ }
+
+ // don't add a comma on the end of the last field
+ if (++$current_field_count < count($fields))
+ {
+ $sql .= ',';
+ }
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create Table
+ *
+ * @access private
+ * @param string the table name
+ * @param mixed the fields
+ * @param mixed primary key(s)
+ * @param mixed key(s)
+ * @param boolean should 'IF NOT EXISTS' be added to the SQL
+ * @return bool
+ */
+ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+ {
+ $sql = 'CREATE TABLE ';
+
+ if ($if_not_exists === TRUE)
+ {
+ $sql .= 'IF NOT EXISTS ';
+ }
+
+ $sql .= $this->db->_escape_identifiers($table)." (";
+
+ $sql .= $this->_process_fields($fields);
+
+ if (count($primary_keys) > 0)
+ {
+ $key_name = $this->db->_protect_identifiers(implode('_', $primary_keys));
+ $primary_keys = $this->db->_protect_identifiers($primary_keys);
+ $sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")";
+ }
+
+ if (is_array($keys) && count($keys) > 0)
+ {
+ foreach ($keys as $key)
+ {
+ if (is_array($key))
+ {
+ $key_name = $this->db->_protect_identifiers(implode('_', $key));
+ $key = $this->db->_protect_identifiers($key);
+ }
+ else
+ {
+ $key_name = $this->db->_protect_identifiers($key);
+ $key = array($key_name);
+ }
+
+ $sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")";
+ }
+ }
+
+ $sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};";
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop Table
+ *
+ * @access private
+ * @return string
+ */
+ function _drop_table($table)
+ {
+ return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alter table query
+ *
+ * Generates a platform-specific query so that a table can be altered
+ * Called by add_column(), drop_column(), and column_alter(),
+ *
+ * @access private
+ * @param string the ALTER type (ADD, DROP, CHANGE)
+ * @param string the column name
+ * @param array fields
+ * @param string the field after which we should add the new field
+ * @return object
+ */
+ function _alter_table($alter_type, $table, $fields, $after_field = '')
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ";
+
+ // DROP has everything it needs now.
+ if ($alter_type == 'DROP')
+ {
+ return $sql.$this->db->_protect_identifiers($fields);
+ }
+
+ $sql .= $this->_process_fields($fields);
+
+ if ($after_field != '')
+ {
+ $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rename a table
+ *
+ * Generates a platform-specific query so that a table can be renamed
+ *
+ * @access private
+ * @param string the old table name
+ * @param string the new table name
+ * @return string
+ */
+ function _rename_table($table_name, $new_table_name)
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+ return $sql;
+ }
+
+}
+
+/* End of file mysqli_forge.php */
/* Location: ./system/database/drivers/mysqli/mysqli_forge.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * MySQLi Result Class\r
- *\r
- * This class extends the parent result class: CI_DB_result\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mysqli_result extends CI_DB_result {\r
- \r
- /**\r
- * Number of rows in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_rows()\r
- {\r
- return @mysqli_num_rows($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Number of fields in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_fields()\r
- {\r
- return @mysqli_num_fields($this->result_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch Field Names\r
- *\r
- * Generates an array of column names\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function list_fields()\r
- {\r
- $field_names = array();\r
- while ($field = mysqli_fetch_field($this->result_id))\r
- {\r
- $field_names[] = $field->name;\r
- }\r
- \r
- return $field_names;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data\r
- *\r
- * Generates an array of objects containing field meta-data\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function field_data()\r
- {\r
- $retval = array();\r
- while ($field = mysqli_fetch_field($this->result_id))\r
- { \r
- $F = new stdClass();\r
- $F->name = $field->name;\r
- $F->type = $field->type;\r
- $F->default = $field->def;\r
- $F->max_length = $field->max_length;\r
- $F->primary_key = ($field->flags & MYSQLI_PRI_KEY_FLAG) ? 1 : 0;\r
- \r
- $retval[] = $F;\r
- }\r
- \r
- return $retval;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Free the result\r
- *\r
- * @return null\r
- */ \r
- function free_result()\r
- {\r
- if (is_object($this->result_id))\r
- {\r
- mysqli_free_result($this->result_id);\r
- $this->result_id = FALSE;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Data Seek\r
- *\r
- * Moves the internal pointer to the desired offset. We call\r
- * this internally before fetching results to make sure the\r
- * result set starts at zero\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _data_seek($n = 0)\r
- {\r
- return mysqli_data_seek($this->result_id, $n);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - associative array\r
- *\r
- * Returns the result set as an array\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _fetch_assoc()\r
- {\r
- return mysqli_fetch_assoc($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - object\r
- *\r
- * Returns the result set as an object\r
- *\r
- * @access private\r
- * @return object\r
- */\r
- function _fetch_object()\r
- {\r
- return mysqli_fetch_object($this->result_id);\r
- }\r
- \r
-}\r
-\r
-\r
-/* End of file mysqli_result.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQLi Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysqli_result extends CI_DB_result {
+
+ /**
+ * Number of rows in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_rows()
+ {
+ return @mysqli_num_rows($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Number of fields in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_fields()
+ {
+ return @mysqli_num_fields($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch Field Names
+ *
+ * Generates an array of column names
+ *
+ * @access public
+ * @return array
+ */
+ function list_fields()
+ {
+ $field_names = array();
+ while ($field = mysqli_fetch_field($this->result_id))
+ {
+ $field_names[] = $field->name;
+ }
+
+ return $field_names;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data
+ *
+ * Generates an array of objects containing field meta-data
+ *
+ * @access public
+ * @return array
+ */
+ function field_data()
+ {
+ $retval = array();
+ while ($field = mysqli_fetch_field($this->result_id))
+ {
+ $F = new stdClass();
+ $F->name = $field->name;
+ $F->type = $field->type;
+ $F->default = $field->def;
+ $F->max_length = $field->max_length;
+ $F->primary_key = ($field->flags & MYSQLI_PRI_KEY_FLAG) ? 1 : 0;
+
+ $retval[] = $F;
+ }
+
+ return $retval;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Free the result
+ *
+ * @return null
+ */
+ function free_result()
+ {
+ if (is_object($this->result_id))
+ {
+ mysqli_free_result($this->result_id);
+ $this->result_id = FALSE;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Data Seek
+ *
+ * Moves the internal pointer to the desired offset. We call
+ * this internally before fetching results to make sure the
+ * result set starts at zero
+ *
+ * @access private
+ * @return array
+ */
+ function _data_seek($n = 0)
+ {
+ return mysqli_data_seek($this->result_id, $n);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - associative array
+ *
+ * Returns the result set as an array
+ *
+ * @access private
+ * @return array
+ */
+ function _fetch_assoc()
+ {
+ return mysqli_fetch_assoc($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - object
+ *
+ * Returns the result set as an object
+ *
+ * @access private
+ * @return object
+ */
+ function _fetch_object()
+ {
+ return mysqli_fetch_object($this->result_id);
+ }
+
+}
+
+
+/* End of file mysqli_result.php */
/* Location: ./system/database/drivers/mysqli/mysqli_result.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * MySQLi Utility Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_mysqli_utility extends CI_DB_utility {\r
- \r
- /**\r
- * List databases\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _list_databases()\r
- {\r
- return "SHOW DATABASES";\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Optimize table query\r
- *\r
- * Generates a platform-specific query so that a table can be optimized\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _optimize_table($table)\r
- {\r
- return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Repair table query\r
- *\r
- * Generates a platform-specific query so that a table can be repaired\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _repair_table($table)\r
- {\r
- return "REPAIR TABLE ".$this->db->_escape_identifiers($table);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * MySQLi Export\r
- *\r
- * @access private\r
- * @param array Preferences\r
- * @return mixed\r
- */\r
- function _backup($params = array())\r
- {\r
- // Currently unsupported\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
-\r
-\r
- /**\r
- *\r
- * The functions below have been deprecated as of 1.6, and are only here for backwards\r
- * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation\r
- * is STRONGLY discouraged in favour if using dbforge.\r
- *\r
- */\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database($name)\r
- {\r
- return "CREATE DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- return "DROP DATABASE ".$name;\r
- }\r
-\r
-}\r
-\r
-/* End of file mysqli_utility.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * MySQLi Utility Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_mysqli_utility extends CI_DB_utility {
+
+ /**
+ * List databases
+ *
+ * @access private
+ * @return bool
+ */
+ function _list_databases()
+ {
+ return "SHOW DATABASES";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Optimize table query
+ *
+ * Generates a platform-specific query so that a table can be optimized
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _optimize_table($table)
+ {
+ return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Repair table query
+ *
+ * Generates a platform-specific query so that a table can be repaired
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _repair_table($table)
+ {
+ return "REPAIR TABLE ".$this->db->_escape_identifiers($table);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * MySQLi Export
+ *
+ * @access private
+ * @param array Preferences
+ * @return mixed
+ */
+ function _backup($params = array())
+ {
+ // Currently unsupported
+ return $this->db->display_error('db_unsuported_feature');
+ }
+
+
+ /**
+ *
+ * The functions below have been deprecated as of 1.6, and are only here for backwards
+ * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation
+ * is STRONGLY discouraged in favour if using dbforge.
+ *
+ */
+
+ /**
+ * Create database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database($name)
+ {
+ return "CREATE DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ return "DROP DATABASE ".$name;
+ }
+
+}
+
+/* End of file mysqli_utility.php */
/* Location: ./system/database/drivers/mysqli/mysqli_utility.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * oci8 Database Adapter Class\r
- *\r
- * Note: _DB is an extender class that the app controller\r
- * creates dynamically based on whether the active record\r
- * class is being used or not.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Drivers\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-\r
-/**\r
- * oci8 Database Adapter Class\r
- *\r
- * This is a modification of the DB_driver class to\r
- * permit access to oracle databases\r
- *\r
- * NOTE: this uses the PHP 4 oci methods\r
- *\r
- * @author Kelly McArdle\r
- *\r
- */\r
-\r
-class CI_DB_oci8_driver extends CI_DB {\r
-\r
- var $dbdriver = 'oci8';\r
- \r
- // The character used for excaping\r
- var $_escape_char = '"';\r
-\r
- /**\r
- * The syntax to count rows is slightly different across different\r
- * database engines, so this string appears in each driver and is\r
- * used for the count_all() and count_all_results() functions.\r
- */\r
- var $_count_string = "SELECT COUNT(1) AS ";\r
- var $_random_keyword = ' ASC'; // not currently supported\r
-\r
- // Set "auto commit" by default\r
- var $_commit = OCI_COMMIT_ON_SUCCESS;\r
-\r
- // need to track statement id and cursor id\r
- var $stmt_id;\r
- var $curs_id;\r
-\r
- // if we use a limit, we will add a field that will\r
- // throw off num_fields later\r
- var $limit_used;\r
-\r
- /**\r
- * Non-persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */\r
- function db_connect()\r
- {\r
- return @ocilogon($this->username, $this->password, $this->hostname);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */\r
- function db_pconnect()\r
- {\r
- return @ociplogon($this->username, $this->password, $this->hostname);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select the database\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */\r
- function db_select()\r
- {\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set client character set\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return resource\r
- */\r
- function db_set_charset($charset, $collation)\r
- {\r
- // @todo - add support if needed\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Version number query string\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function _version()\r
- {\r
- return ociserverversion($this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Execute the query\r
- *\r
- * @access private called by the base class\r
- * @param string an SQL query\r
- * @return resource\r
- */\r
- function _execute($sql)\r
- {\r
- // oracle must parse the query before it is run. All of the actions with\r
- // the query are based on the statement id returned by ociparse\r
- $this->stmt_id = FALSE;\r
- $this->_set_stmt_id($sql);\r
- ocisetprefetch($this->stmt_id, 1000);\r
- return @ociexecute($this->stmt_id, $this->_commit);\r
- }\r
-\r
- /**\r
- * Generate a statement ID\r
- *\r
- * @access private\r
- * @param string an SQL query\r
- * @return none\r
- */\r
- function _set_stmt_id($sql)\r
- {\r
- if ( ! is_resource($this->stmt_id))\r
- {\r
- $this->stmt_id = ociparse($this->conn_id, $this->_prep_query($sql));\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Prep the query\r
- *\r
- * If needed, each database adapter can prep the query string\r
- *\r
- * @access private called by execute()\r
- * @param string an SQL query\r
- * @return string\r
- */\r
- function _prep_query($sql)\r
- {\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * getCursor. Returns a cursor from the datbase\r
- *\r
- * @access public\r
- * @return cursor id\r
- */\r
- function get_cursor()\r
- {\r
- $this->curs_id = ocinewcursor($this->conn_id);\r
- return $this->curs_id;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Stored Procedure. Executes a stored procedure\r
- *\r
- * @access public\r
- * @param package package stored procedure is in\r
- * @param procedure stored procedure to execute\r
- * @param params array of parameters\r
- * @return array\r
- *\r
- * params array keys\r
- *\r
- * KEY OPTIONAL NOTES\r
- * name no the name of the parameter should be in :<param_name> format\r
- * value no the value of the parameter. If this is an OUT or IN OUT parameter,\r
- * this should be a reference to a variable\r
- * type yes the type of the parameter\r
- * length yes the max size of the parameter\r
- */\r
- function stored_procedure($package, $procedure, $params)\r
- {\r
- if ($package == '' OR $procedure == '' OR ! is_array($params))\r
- {\r
- if ($this->db_debug)\r
- {\r
- log_message('error', 'Invalid query: '.$package.'.'.$procedure);\r
- return $this->display_error('db_invalid_query');\r
- }\r
- return FALSE;\r
- }\r
- \r
- // build the query string\r
- $sql = "begin $package.$procedure(";\r
-\r
- $have_cursor = FALSE;\r
- foreach($params as $param)\r
- {\r
- $sql .= $param['name'] . ",";\r
- \r
- if (array_key_exists('type', $param) && ($param['type'] == OCI_B_CURSOR))\r
- {\r
- $have_cursor = TRUE;\r
- }\r
- }\r
- $sql = trim($sql, ",") . "); end;";\r
- \r
- $this->stmt_id = FALSE;\r
- $this->_set_stmt_id($sql);\r
- $this->_bind_params($params);\r
- $this->query($sql, FALSE, $have_cursor);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Bind parameters\r
- *\r
- * @access private\r
- * @return none\r
- */\r
- function _bind_params($params)\r
- {\r
- if ( ! is_array($params) OR ! is_resource($this->stmt_id))\r
- {\r
- return;\r
- }\r
- \r
- foreach ($params as $param)\r
- {\r
- foreach (array('name', 'value', 'type', 'length') as $val)\r
- {\r
- if ( ! isset($param[$val]))\r
- {\r
- $param[$val] = '';\r
- }\r
- }\r
-\r
- ocibindbyname($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']);\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Begin Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_begin($test_mode = FALSE)\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
- \r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
- \r
- // Reset the transaction failure flag.\r
- // If the $test_mode flag is set to TRUE transactions will be rolled back\r
- // even if the queries produce a successful result.\r
- $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;\r
- \r
- $this->_commit = OCI_DEFAULT;\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Commit Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_commit()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $ret = OCIcommit($this->conn_id);\r
- $this->_commit = OCI_COMMIT_ON_SUCCESS;\r
- return $ret;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rollback Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_rollback()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $ret = OCIrollback($this->conn_id);\r
- $this->_commit = OCI_COMMIT_ON_SUCCESS;\r
- return $ret;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape String\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function escape_str($str)\r
- {\r
- // Access the CI object\r
- $CI =& get_instance();\r
-\r
- return $CI->_remove_invisible_characters($str);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Affected Rows\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function affected_rows()\r
- {\r
- return @ocirowcount($this->stmt_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Insert ID\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function insert_id()\r
- {\r
- // not supported in oracle\r
- return $this->display_error('db_unsupported_function');\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * "Count All" query\r
- *\r
- * Generates a platform-specific query string that counts all records in\r
- * the specified database\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function count_all($table = '')\r
- {\r
- if ($table == '')\r
- return '0';\r
-\r
- $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));\r
-\r
- if ($query == FALSE)\r
- {\r
- return 0;\r
- }\r
-\r
- $row = $query->row();\r
- return $row->NUMROWS;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Show table query\r
- *\r
- * Generates a platform-specific query string so that the table names can be fetched\r
- *\r
- * @access private\r
- * @param boolean\r
- * @return string\r
- */\r
- function _list_tables($prefix_limit = FALSE)\r
- {\r
- $sql = "SELECT TABLE_NAME FROM ALL_TABLES";\r
-\r
- if ($prefix_limit !== FALSE AND $this->dbprefix != '')\r
- {\r
- $sql .= " WHERE TABLE_NAME LIKE '".$this->dbprefix."%'";\r
- }\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Show column query\r
- *\r
- * Generates a platform-specific query string so that the column names can be fetched\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */\r
- function _list_columns($table = '')\r
- {\r
- return "SELECT COLUMN_NAME FROM all_tab_columns WHERE table_name = '$table'";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data query\r
- *\r
- * Generates a platform-specific query so that the column data can be retrieved\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _field_data($table)\r
- {\r
- return "SELECT * FROM ".$table." where rownum = 1";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message string\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _error_message()\r
- {\r
- $error = ocierror($this->conn_id);\r
- return $error['message'];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message number\r
- *\r
- * @access private\r
- * @return integer\r
- */\r
- function _error_number()\r
- {\r
- $error = ocierror($this->conn_id);\r
- return $error['code'];\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape the SQL Identifiers\r
- *\r
- * This function escapes column and table names\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _escape_identifiers($item)\r
- {\r
- if ($this->_escape_char == '')\r
- {\r
- return $item;\r
- }\r
- \r
- if (strpos($item, '.') !== FALSE)\r
- {\r
- $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; \r
- }\r
- else\r
- {\r
- $str = $this->_escape_char.$item.$this->_escape_char;\r
- }\r
- \r
- // remove duplicates if the user already included the escape\r
- return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * From Tables\r
- *\r
- * This function implicitly groups FROM tables so there is no confusion\r
- * about operator precedence in harmony with SQL standards\r
- *\r
- * @access public\r
- * @param type\r
- * @return type\r
- */\r
- function _from_tables($tables)\r
- {\r
- if ( ! is_array($tables))\r
- {\r
- $tables = array($tables);\r
- }\r
- \r
- return implode(', ', $tables);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Insert statement\r
- *\r
- * Generates a platform-specific insert string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the insert keys\r
- * @param array the insert values\r
- * @return string\r
- */\r
- function _insert($table, $keys, $values)\r
- {\r
- return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Update statement\r
- *\r
- * Generates a platform-specific update string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the update data\r
- * @param array the where clause\r
- * @param array the orderby clause\r
- * @param array the limit clause\r
- * @return string\r
- */\r
- function _update($table, $values, $where, $orderby = array(), $limit = FALSE)\r
- {\r
- foreach($values as $key => $val)\r
- {\r
- $valstr[] = $key." = ".$val;\r
- }\r
- \r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';\r
- \r
- $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);\r
-\r
- $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';\r
-\r
- $sql .= $orderby.$limit;\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Truncate statement\r
- *\r
- * Generates a platform-specific truncate string from the supplied data\r
- * If the database does not support the truncate() command\r
- * This function maps to "DELETE FROM table"\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */ \r
- function _truncate($table)\r
- {\r
- return "TRUNCATE TABLE ".$table;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete statement\r
- *\r
- * Generates a platform-specific delete string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the where clause\r
- * @param string the limit clause\r
- * @return string\r
- */ \r
- function _delete($table, $where = array(), $like = array(), $limit = FALSE)\r
- {\r
- $conditions = '';\r
-\r
- if (count($where) > 0 OR count($like) > 0)\r
- {\r
- $conditions = "\nWHERE ";\r
- $conditions .= implode("\n", $this->ar_where);\r
-\r
- if (count($where) > 0 && count($like) > 0)\r
- {\r
- $conditions .= " AND ";\r
- }\r
- $conditions .= implode("\n", $like);\r
- }\r
-\r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- return "DELETE FROM ".$table.$conditions.$limit;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Limit string\r
- *\r
- * Generates a platform-specific LIMIT clause\r
- *\r
- * @access public\r
- * @param string the sql query string\r
- * @param integer the number of rows to limit the query to\r
- * @param integer the offset value\r
- * @return string\r
- */\r
- function _limit($sql, $limit, $offset)\r
- {\r
- $limit = $offset + $limit;\r
- $newsql = "SELECT * FROM (select inner_query.*, rownum rnum FROM ($sql) inner_query WHERE rownum < $limit)";\r
-\r
- if ($offset != 0)\r
- {\r
- $newsql .= " WHERE rnum >= $offset";\r
- }\r
-\r
- // remember that we used limits\r
- $this->limit_used = TRUE;\r
-\r
- return $newsql;\r
- } \r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Close DB Connection\r
- *\r
- * @access public\r
- * @param resource\r
- * @return void\r
- */\r
- function _close($conn_id)\r
- {\r
- @ocilogoff($conn_id);\r
- }\r
-\r
-\r
-}\r
-\r
-\r
-\r
-/* End of file oci8_driver.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * oci8 Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package CodeIgniter
+ * @subpackage Drivers
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+
+/**
+ * oci8 Database Adapter Class
+ *
+ * This is a modification of the DB_driver class to
+ * permit access to oracle databases
+ *
+ * NOTE: this uses the PHP 4 oci methods
+ *
+ * @author Kelly McArdle
+ *
+ */
+
+class CI_DB_oci8_driver extends CI_DB {
+
+ var $dbdriver = 'oci8';
+
+ // The character used for excaping
+ var $_escape_char = '"';
+
+ /**
+ * The syntax to count rows is slightly different across different
+ * database engines, so this string appears in each driver and is
+ * used for the count_all() and count_all_results() functions.
+ */
+ var $_count_string = "SELECT COUNT(1) AS ";
+ var $_random_keyword = ' ASC'; // not currently supported
+
+ // Set "auto commit" by default
+ var $_commit = OCI_COMMIT_ON_SUCCESS;
+
+ // need to track statement id and cursor id
+ var $stmt_id;
+ var $curs_id;
+
+ // if we use a limit, we will add a field that will
+ // throw off num_fields later
+ var $limit_used;
+
+ /**
+ * Non-persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_connect()
+ {
+ return @ocilogon($this->username, $this->password, $this->hostname);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_pconnect()
+ {
+ return @ociplogon($this->username, $this->password, $this->hostname);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select the database
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_select()
+ {
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set client character set
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return resource
+ */
+ function db_set_charset($charset, $collation)
+ {
+ // @todo - add support if needed
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Version number query string
+ *
+ * @access public
+ * @return string
+ */
+ function _version()
+ {
+ return ociserverversion($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Execute the query
+ *
+ * @access private called by the base class
+ * @param string an SQL query
+ * @return resource
+ */
+ function _execute($sql)
+ {
+ // oracle must parse the query before it is run. All of the actions with
+ // the query are based on the statement id returned by ociparse
+ $this->stmt_id = FALSE;
+ $this->_set_stmt_id($sql);
+ ocisetprefetch($this->stmt_id, 1000);
+ return @ociexecute($this->stmt_id, $this->_commit);
+ }
+
+ /**
+ * Generate a statement ID
+ *
+ * @access private
+ * @param string an SQL query
+ * @return none
+ */
+ function _set_stmt_id($sql)
+ {
+ if ( ! is_resource($this->stmt_id))
+ {
+ $this->stmt_id = ociparse($this->conn_id, $this->_prep_query($sql));
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep the query
+ *
+ * If needed, each database adapter can prep the query string
+ *
+ * @access private called by execute()
+ * @param string an SQL query
+ * @return string
+ */
+ function _prep_query($sql)
+ {
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * getCursor. Returns a cursor from the datbase
+ *
+ * @access public
+ * @return cursor id
+ */
+ function get_cursor()
+ {
+ $this->curs_id = ocinewcursor($this->conn_id);
+ return $this->curs_id;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Stored Procedure. Executes a stored procedure
+ *
+ * @access public
+ * @param package package stored procedure is in
+ * @param procedure stored procedure to execute
+ * @param params array of parameters
+ * @return array
+ *
+ * params array keys
+ *
+ * KEY OPTIONAL NOTES
+ * name no the name of the parameter should be in :<param_name> format
+ * value no the value of the parameter. If this is an OUT or IN OUT parameter,
+ * this should be a reference to a variable
+ * type yes the type of the parameter
+ * length yes the max size of the parameter
+ */
+ function stored_procedure($package, $procedure, $params)
+ {
+ if ($package == '' OR $procedure == '' OR ! is_array($params))
+ {
+ if ($this->db_debug)
+ {
+ log_message('error', 'Invalid query: '.$package.'.'.$procedure);
+ return $this->display_error('db_invalid_query');
+ }
+ return FALSE;
+ }
+
+ // build the query string
+ $sql = "begin $package.$procedure(";
+
+ $have_cursor = FALSE;
+ foreach($params as $param)
+ {
+ $sql .= $param['name'] . ",";
+
+ if (array_key_exists('type', $param) && ($param['type'] == OCI_B_CURSOR))
+ {
+ $have_cursor = TRUE;
+ }
+ }
+ $sql = trim($sql, ",") . "); end;";
+
+ $this->stmt_id = FALSE;
+ $this->_set_stmt_id($sql);
+ $this->_bind_params($params);
+ $this->query($sql, FALSE, $have_cursor);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Bind parameters
+ *
+ * @access private
+ * @return none
+ */
+ function _bind_params($params)
+ {
+ if ( ! is_array($params) OR ! is_resource($this->stmt_id))
+ {
+ return;
+ }
+
+ foreach ($params as $param)
+ {
+ foreach (array('name', 'value', 'type', 'length') as $val)
+ {
+ if ( ! isset($param[$val]))
+ {
+ $param[$val] = '';
+ }
+ }
+
+ ocibindbyname($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Begin Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_begin($test_mode = FALSE)
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ // Reset the transaction failure flag.
+ // If the $test_mode flag is set to TRUE transactions will be rolled back
+ // even if the queries produce a successful result.
+ $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+ $this->_commit = OCI_DEFAULT;
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Commit Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_commit()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $ret = OCIcommit($this->conn_id);
+ $this->_commit = OCI_COMMIT_ON_SUCCESS;
+ return $ret;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rollback Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_rollback()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $ret = OCIrollback($this->conn_id);
+ $this->_commit = OCI_COMMIT_ON_SUCCESS;
+ return $ret;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape String
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function escape_str($str)
+ {
+ // Access the CI object
+ $CI =& get_instance();
+
+ return $CI->_remove_invisible_characters($str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Affected Rows
+ *
+ * @access public
+ * @return integer
+ */
+ function affected_rows()
+ {
+ return @ocirowcount($this->stmt_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert ID
+ *
+ * @access public
+ * @return integer
+ */
+ function insert_id()
+ {
+ // not supported in oracle
+ return $this->display_error('db_unsupported_function');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * "Count All" query
+ *
+ * Generates a platform-specific query string that counts all records in
+ * the specified database
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function count_all($table = '')
+ {
+ if ($table == '')
+ return '0';
+
+ $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+
+ if ($query == FALSE)
+ {
+ return 0;
+ }
+
+ $row = $query->row();
+ return $row->NUMROWS;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show table query
+ *
+ * Generates a platform-specific query string so that the table names can be fetched
+ *
+ * @access private
+ * @param boolean
+ * @return string
+ */
+ function _list_tables($prefix_limit = FALSE)
+ {
+ $sql = "SELECT TABLE_NAME FROM ALL_TABLES";
+
+ if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+ {
+ $sql .= " WHERE TABLE_NAME LIKE '".$this->dbprefix."%'";
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show column query
+ *
+ * Generates a platform-specific query string so that the column names can be fetched
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _list_columns($table = '')
+ {
+ return "SELECT COLUMN_NAME FROM all_tab_columns WHERE table_name = '$table'";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data query
+ *
+ * Generates a platform-specific query so that the column data can be retrieved
+ *
+ * @access public
+ * @param string the table name
+ * @return object
+ */
+ function _field_data($table)
+ {
+ return "SELECT * FROM ".$table." where rownum = 1";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message string
+ *
+ * @access private
+ * @return string
+ */
+ function _error_message()
+ {
+ $error = ocierror($this->conn_id);
+ return $error['message'];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message number
+ *
+ * @access private
+ * @return integer
+ */
+ function _error_number()
+ {
+ $error = ocierror($this->conn_id);
+ return $error['code'];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape the SQL Identifiers
+ *
+ * This function escapes column and table names
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _escape_identifiers($item)
+ {
+ if ($this->_escape_char == '')
+ {
+ return $item;
+ }
+
+ if (strpos($item, '.') !== FALSE)
+ {
+ $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
+ }
+ else
+ {
+ $str = $this->_escape_char.$item.$this->_escape_char;
+ }
+
+ // remove duplicates if the user already included the escape
+ return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * From Tables
+ *
+ * This function implicitly groups FROM tables so there is no confusion
+ * about operator precedence in harmony with SQL standards
+ *
+ * @access public
+ * @param type
+ * @return type
+ */
+ function _from_tables($tables)
+ {
+ if ( ! is_array($tables))
+ {
+ $tables = array($tables);
+ }
+
+ return implode(', ', $tables);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert statement
+ *
+ * Generates a platform-specific insert string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the insert keys
+ * @param array the insert values
+ * @return string
+ */
+ function _insert($table, $keys, $values)
+ {
+ return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Update statement
+ *
+ * Generates a platform-specific update string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the update data
+ * @param array the where clause
+ * @param array the orderby clause
+ * @param array the limit clause
+ * @return string
+ */
+ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+ {
+ foreach($values as $key => $val)
+ {
+ $valstr[] = $key." = ".$val;
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+
+ $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+ $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+ $sql .= $orderby.$limit;
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Truncate statement
+ *
+ * Generates a platform-specific truncate string from the supplied data
+ * If the database does not support the truncate() command
+ * This function maps to "DELETE FROM table"
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _truncate($table)
+ {
+ return "TRUNCATE TABLE ".$table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete statement
+ *
+ * Generates a platform-specific delete string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the where clause
+ * @param string the limit clause
+ * @return string
+ */
+ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+ {
+ $conditions = '';
+
+ if (count($where) > 0 OR count($like) > 0)
+ {
+ $conditions = "\nWHERE ";
+ $conditions .= implode("\n", $this->ar_where);
+
+ if (count($where) > 0 && count($like) > 0)
+ {
+ $conditions .= " AND ";
+ }
+ $conditions .= implode("\n", $like);
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ return "DELETE FROM ".$table.$conditions.$limit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Limit string
+ *
+ * Generates a platform-specific LIMIT clause
+ *
+ * @access public
+ * @param string the sql query string
+ * @param integer the number of rows to limit the query to
+ * @param integer the offset value
+ * @return string
+ */
+ function _limit($sql, $limit, $offset)
+ {
+ $limit = $offset + $limit;
+ $newsql = "SELECT * FROM (select inner_query.*, rownum rnum FROM ($sql) inner_query WHERE rownum < $limit)";
+
+ if ($offset != 0)
+ {
+ $newsql .= " WHERE rnum >= $offset";
+ }
+
+ // remember that we used limits
+ $this->limit_used = TRUE;
+
+ return $newsql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Close DB Connection
+ *
+ * @access public
+ * @param resource
+ * @return void
+ */
+ function _close($conn_id)
+ {
+ @ocilogoff($conn_id);
+ }
+
+
+}
+
+
+
+/* End of file oci8_driver.php */
/* Location: ./system/database/drivers/oci8/oci8_driver.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Oracle Forge Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_oci8_forge extends CI_DB_forge {\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access public\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database($name)\r
- {\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Create Table\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @param array the fields\r
- * @param mixed primary key(s)\r
- * @param mixed key(s)\r
- * @param boolean should 'IF NOT EXISTS' be added to the SQL\r
- * @return bool\r
- */\r
- function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)\r
- {\r
- $sql = 'CREATE TABLE ';\r
- \r
- if ($if_not_exists === TRUE)\r
- {\r
- $sql .= 'IF NOT EXISTS ';\r
- }\r
- \r
- $sql .= $this->db->_escape_identifiers($table)." (";\r
- $current_field_count = 0;\r
-\r
- foreach ($fields as $field=>$attributes)\r
- {\r
- // Numeric field names aren't allowed in databases, so if the key is\r
- // numeric, we know it was assigned by PHP and the developer manually\r
- // entered the field information, so we'll simply add it to the list\r
- if (is_numeric($field))\r
- {\r
- $sql .= "\n\t$attributes";\r
- }\r
- else\r
- {\r
- $attributes = array_change_key_case($attributes, CASE_UPPER);\r
- \r
- $sql .= "\n\t".$this->db->_protect_identifiers($field);\r
- \r
- $sql .= ' '.$attributes['TYPE'];\r
- \r
- if (array_key_exists('CONSTRAINT', $attributes))\r
- {\r
- $sql .= '('.$attributes['CONSTRAINT'].')';\r
- }\r
- \r
- if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)\r
- {\r
- $sql .= ' UNSIGNED';\r
- }\r
- \r
- if (array_key_exists('DEFAULT', $attributes))\r
- {\r
- $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';\r
- }\r
- \r
- if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)\r
- {\r
- $sql .= ' NULL';\r
- }\r
- else\r
- {\r
- $sql .= ' NOT NULL'; \r
- }\r
- \r
- if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)\r
- {\r
- $sql .= ' AUTO_INCREMENT';\r
- }\r
- }\r
- \r
- // don't add a comma on the end of the last field\r
- if (++$current_field_count < count($fields))\r
- {\r
- $sql .= ',';\r
- }\r
- }\r
-\r
- if (count($primary_keys) > 0)\r
- {\r
- $primary_keys = $this->db->_protect_identifiers($primary_keys);\r
- $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";\r
- }\r
-\r
- if (is_array($keys) && count($keys) > 0)\r
- {\r
- foreach ($keys as $key)\r
- {\r
- if (is_array($key))\r
- {\r
- $key = $this->db->_protect_identifiers($key); \r
- }\r
- else\r
- {\r
- $key = array($this->db->_protect_identifiers($key));\r
- }\r
- \r
- $sql .= ",\n\tUNIQUE COLUMNS (" . implode(', ', $key) . ")";\r
- }\r
- }\r
- \r
- $sql .= "\n)";\r
-\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop Table\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _drop_table($table)\r
- {\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Alter table query\r
- *\r
- * Generates a platform-specific query so that a table can be altered\r
- * Called by add_column(), drop_column(), and column_alter(),\r
- *\r
- * @access private\r
- * @param string the ALTER type (ADD, DROP, CHANGE)\r
- * @param string the column name\r
- * @param string the table name\r
- * @param string the column definition\r
- * @param string the default value\r
- * @param boolean should 'NOT NULL' be added\r
- * @param string the field after which we should add the new field\r
- * @return object\r
- */\r
- function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);\r
-\r
- // DROP has everything it needs now.\r
- if ($alter_type == 'DROP')\r
- {\r
- return $sql;\r
- }\r
-\r
- $sql .= " $column_definition";\r
-\r
- if ($default_value != '')\r
- {\r
- $sql .= " DEFAULT \"$default_value\"";\r
- }\r
-\r
- if ($null === NULL)\r
- {\r
- $sql .= ' NULL';\r
- }\r
- else\r
- {\r
- $sql .= ' NOT NULL';\r
- }\r
-\r
- if ($after_field != '')\r
- {\r
- $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);\r
- }\r
- \r
- return $sql;\r
- \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rename a table\r
- *\r
- * Generates a platform-specific query so that a table can be renamed\r
- *\r
- * @access private\r
- * @param string the old table name\r
- * @param string the new table name\r
- * @return string\r
- */\r
- function _rename_table($table_name, $new_table_name)\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);\r
- return $sql;\r
- }\r
-\r
-\r
-}\r
-\r
-/* End of file oci8_forge.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Oracle Forge Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_oci8_forge extends CI_DB_forge {
+
+ /**
+ * Create database
+ *
+ * @access public
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database($name)
+ {
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create Table
+ *
+ * @access private
+ * @param string the table name
+ * @param array the fields
+ * @param mixed primary key(s)
+ * @param mixed key(s)
+ * @param boolean should 'IF NOT EXISTS' be added to the SQL
+ * @return bool
+ */
+ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+ {
+ $sql = 'CREATE TABLE ';
+
+ if ($if_not_exists === TRUE)
+ {
+ $sql .= 'IF NOT EXISTS ';
+ }
+
+ $sql .= $this->db->_escape_identifiers($table)." (";
+ $current_field_count = 0;
+
+ foreach ($fields as $field=>$attributes)
+ {
+ // Numeric field names aren't allowed in databases, so if the key is
+ // numeric, we know it was assigned by PHP and the developer manually
+ // entered the field information, so we'll simply add it to the list
+ if (is_numeric($field))
+ {
+ $sql .= "\n\t$attributes";
+ }
+ else
+ {
+ $attributes = array_change_key_case($attributes, CASE_UPPER);
+
+ $sql .= "\n\t".$this->db->_protect_identifiers($field);
+
+ $sql .= ' '.$attributes['TYPE'];
+
+ if (array_key_exists('CONSTRAINT', $attributes))
+ {
+ $sql .= '('.$attributes['CONSTRAINT'].')';
+ }
+
+ if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+ {
+ $sql .= ' UNSIGNED';
+ }
+
+ if (array_key_exists('DEFAULT', $attributes))
+ {
+ $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+ }
+
+ if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
+ {
+ $sql .= ' NULL';
+ }
+ else
+ {
+ $sql .= ' NOT NULL';
+ }
+
+ if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+ {
+ $sql .= ' AUTO_INCREMENT';
+ }
+ }
+
+ // don't add a comma on the end of the last field
+ if (++$current_field_count < count($fields))
+ {
+ $sql .= ',';
+ }
+ }
+
+ if (count($primary_keys) > 0)
+ {
+ $primary_keys = $this->db->_protect_identifiers($primary_keys);
+ $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
+ }
+
+ if (is_array($keys) && count($keys) > 0)
+ {
+ foreach ($keys as $key)
+ {
+ if (is_array($key))
+ {
+ $key = $this->db->_protect_identifiers($key);
+ }
+ else
+ {
+ $key = array($this->db->_protect_identifiers($key));
+ }
+
+ $sql .= ",\n\tUNIQUE COLUMNS (" . implode(', ', $key) . ")";
+ }
+ }
+
+ $sql .= "\n)";
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop Table
+ *
+ * @access private
+ * @return bool
+ */
+ function _drop_table($table)
+ {
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alter table query
+ *
+ * Generates a platform-specific query so that a table can be altered
+ * Called by add_column(), drop_column(), and column_alter(),
+ *
+ * @access private
+ * @param string the ALTER type (ADD, DROP, CHANGE)
+ * @param string the column name
+ * @param string the table name
+ * @param string the column definition
+ * @param string the default value
+ * @param boolean should 'NOT NULL' be added
+ * @param string the field after which we should add the new field
+ * @return object
+ */
+ function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
+
+ // DROP has everything it needs now.
+ if ($alter_type == 'DROP')
+ {
+ return $sql;
+ }
+
+ $sql .= " $column_definition";
+
+ if ($default_value != '')
+ {
+ $sql .= " DEFAULT \"$default_value\"";
+ }
+
+ if ($null === NULL)
+ {
+ $sql .= ' NULL';
+ }
+ else
+ {
+ $sql .= ' NOT NULL';
+ }
+
+ if ($after_field != '')
+ {
+ $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+ }
+
+ return $sql;
+
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rename a table
+ *
+ * Generates a platform-specific query so that a table can be renamed
+ *
+ * @access private
+ * @param string the old table name
+ * @param string the new table name
+ * @return string
+ */
+ function _rename_table($table_name, $new_table_name)
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+ return $sql;
+ }
+
+
+}
+
+/* End of file oci8_forge.php */
/* Location: ./system/database/drivers/oci8/oci8_forge.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * oci8 Result Class\r
- *\r
- * This class extends the parent result class: CI_DB_result\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_oci8_result extends CI_DB_result {\r
-\r
- var $stmt_id;\r
- var $curs_id;\r
- var $limit_used;\r
-\r
- /**\r
- * Number of rows in the result set.\r
- *\r
- * Oracle doesn't have a graceful way to retun the number of rows\r
- * so we have to use what amounts to a hack.\r
- * \r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_rows()\r
- {\r
- $rowcount = count($this->result_array());\r
- @ociexecute($this->stmt_id);\r
-\r
- if ($this->curs_id)\r
- {\r
- @ociexecute($this->curs_id);\r
- }\r
-\r
- return $rowcount;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Number of fields in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_fields()\r
- {\r
- $count = @ocinumcols($this->stmt_id);\r
-\r
- // if we used a limit we subtract it\r
- if ($this->limit_used)\r
- {\r
- $count = $count - 1;\r
- }\r
-\r
- return $count;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch Field Names\r
- *\r
- * Generates an array of column names\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function list_fields()\r
- {\r
- $field_names = array();\r
- $fieldCount = $this->num_fields();\r
- for ($c = 1; $c <= $fieldCount; $c++)\r
- {\r
- $field_names[] = ocicolumnname($this->stmt_id, $c);\r
- }\r
- return $field_names;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data\r
- *\r
- * Generates an array of objects containing field meta-data\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function field_data()\r
- {\r
- $retval = array();\r
- $fieldCount = $this->num_fields();\r
- for ($c = 1; $c <= $fieldCount; $c++)\r
- {\r
- $F = new stdClass();\r
- $F->name = ocicolumnname($this->stmt_id, $c);\r
- $F->type = ocicolumntype($this->stmt_id, $c);\r
- $F->max_length = ocicolumnsize($this->stmt_id, $c);\r
-\r
- $retval[] = $F;\r
- }\r
-\r
- return $retval;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Free the result\r
- *\r
- * @return null\r
- */ \r
- function free_result()\r
- {\r
- if (is_resource($this->result_id))\r
- {\r
- ocifreestatement($this->result_id); \r
- $this->result_id = FALSE;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - associative array\r
- *\r
- * Returns the result set as an array\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _fetch_assoc(&$row)\r
- {\r
- $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id;\r
- \r
- return ocifetchinto($id, $row, OCI_ASSOC + OCI_RETURN_NULLS); \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - object\r
- *\r
- * Returns the result set as an object\r
- *\r
- * @access private\r
- * @return object\r
- */\r
- function _fetch_object()\r
- { \r
- $result = array();\r
-\r
- // If PHP 5 is being used we can fetch an result object\r
- if (function_exists('oci_fetch_object'))\r
- {\r
- $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id;\r
- \r
- return @oci_fetch_object($id);\r
- }\r
- \r
- // If PHP 4 is being used we have to build our own result\r
- foreach ($this->result_array() as $key => $val)\r
- {\r
- $obj = new stdClass();\r
- if (is_array($val))\r
- {\r
- foreach ($val as $k => $v)\r
- {\r
- $obj->$k = $v;\r
- }\r
- }\r
- else\r
- {\r
- $obj->$key = $val;\r
- }\r
- \r
- $result[] = $obj;\r
- }\r
-\r
- return $result;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Query result. "array" version.\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function result_array()\r
- {\r
- if (count($this->result_array) > 0)\r
- {\r
- return $this->result_array;\r
- }\r
-\r
- // oracle's fetch functions do not return arrays.\r
- // The information is returned in reference parameters\r
- $row = NULL;\r
- while ($this->_fetch_assoc($row))\r
- {\r
- $this->result_array[] = $row;\r
- }\r
-\r
- return $this->result_array;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Data Seek\r
- *\r
- * Moves the internal pointer to the desired offset. We call\r
- * this internally before fetching results to make sure the\r
- * result set starts at zero\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _data_seek($n = 0)\r
- {\r
- return FALSE; // Not needed\r
- }\r
-\r
-}\r
-\r
-\r
-/* End of file oci8_result.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * oci8 Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_oci8_result extends CI_DB_result {
+
+ var $stmt_id;
+ var $curs_id;
+ var $limit_used;
+
+ /**
+ * Number of rows in the result set.
+ *
+ * Oracle doesn't have a graceful way to retun the number of rows
+ * so we have to use what amounts to a hack.
+ *
+ *
+ * @access public
+ * @return integer
+ */
+ function num_rows()
+ {
+ $rowcount = count($this->result_array());
+ @ociexecute($this->stmt_id);
+
+ if ($this->curs_id)
+ {
+ @ociexecute($this->curs_id);
+ }
+
+ return $rowcount;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Number of fields in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_fields()
+ {
+ $count = @ocinumcols($this->stmt_id);
+
+ // if we used a limit we subtract it
+ if ($this->limit_used)
+ {
+ $count = $count - 1;
+ }
+
+ return $count;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch Field Names
+ *
+ * Generates an array of column names
+ *
+ * @access public
+ * @return array
+ */
+ function list_fields()
+ {
+ $field_names = array();
+ $fieldCount = $this->num_fields();
+ for ($c = 1; $c <= $fieldCount; $c++)
+ {
+ $field_names[] = ocicolumnname($this->stmt_id, $c);
+ }
+ return $field_names;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data
+ *
+ * Generates an array of objects containing field meta-data
+ *
+ * @access public
+ * @return array
+ */
+ function field_data()
+ {
+ $retval = array();
+ $fieldCount = $this->num_fields();
+ for ($c = 1; $c <= $fieldCount; $c++)
+ {
+ $F = new stdClass();
+ $F->name = ocicolumnname($this->stmt_id, $c);
+ $F->type = ocicolumntype($this->stmt_id, $c);
+ $F->max_length = ocicolumnsize($this->stmt_id, $c);
+
+ $retval[] = $F;
+ }
+
+ return $retval;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Free the result
+ *
+ * @return null
+ */
+ function free_result()
+ {
+ if (is_resource($this->result_id))
+ {
+ ocifreestatement($this->result_id);
+ $this->result_id = FALSE;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - associative array
+ *
+ * Returns the result set as an array
+ *
+ * @access private
+ * @return array
+ */
+ function _fetch_assoc(&$row)
+ {
+ $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id;
+
+ return ocifetchinto($id, $row, OCI_ASSOC + OCI_RETURN_NULLS);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - object
+ *
+ * Returns the result set as an object
+ *
+ * @access private
+ * @return object
+ */
+ function _fetch_object()
+ {
+ $result = array();
+
+ // If PHP 5 is being used we can fetch an result object
+ if (function_exists('oci_fetch_object'))
+ {
+ $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id;
+
+ return @oci_fetch_object($id);
+ }
+
+ // If PHP 4 is being used we have to build our own result
+ foreach ($this->result_array() as $key => $val)
+ {
+ $obj = new stdClass();
+ if (is_array($val))
+ {
+ foreach ($val as $k => $v)
+ {
+ $obj->$k = $v;
+ }
+ }
+ else
+ {
+ $obj->$key = $val;
+ }
+
+ $result[] = $obj;
+ }
+
+ return $result;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Query result. "array" version.
+ *
+ * @access public
+ * @return array
+ */
+ function result_array()
+ {
+ if (count($this->result_array) > 0)
+ {
+ return $this->result_array;
+ }
+
+ // oracle's fetch functions do not return arrays.
+ // The information is returned in reference parameters
+ $row = NULL;
+ while ($this->_fetch_assoc($row))
+ {
+ $this->result_array[] = $row;
+ }
+
+ return $this->result_array;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Data Seek
+ *
+ * Moves the internal pointer to the desired offset. We call
+ * this internally before fetching results to make sure the
+ * result set starts at zero
+ *
+ * @access private
+ * @return array
+ */
+ function _data_seek($n = 0)
+ {
+ return FALSE; // Not needed
+ }
+
+}
+
+
+/* End of file oci8_result.php */
/* Location: ./system/database/drivers/oci8/oci8_result.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Oracle Utility Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_oci8_utility extends CI_DB_utility {\r
-\r
- /**\r
- * List databases\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _list_databases()\r
- {\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Optimize table query\r
- *\r
- * Generates a platform-specific query so that a table can be optimized\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _optimize_table($table)\r
- {\r
- return FALSE; // Is this supported in Oracle?\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Repair table query\r
- *\r
- * Generates a platform-specific query so that a table can be repaired\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _repair_table($table)\r
- {\r
- return FALSE; // Is this supported in Oracle?\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Oracle Export\r
- *\r
- * @access private\r
- * @param array Preferences\r
- * @return mixed\r
- */\r
- function _backup($params = array())\r
- {\r
- // Currently unsupported\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
-\r
- /**\r
- *\r
- * The functions below have been deprecated as of 1.6, and are only here for backwards\r
- * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation\r
- * is STRONGLY discouraged in favour if using dbforge.\r
- *\r
- */\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access public\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database($name)\r
- {\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- return FALSE;\r
- }\r
-\r
-}\r
-\r
-/* End of file oci8_utility.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Oracle Utility Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_oci8_utility extends CI_DB_utility {
+
+ /**
+ * List databases
+ *
+ * @access private
+ * @return bool
+ */
+ function _list_databases()
+ {
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Optimize table query
+ *
+ * Generates a platform-specific query so that a table can be optimized
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _optimize_table($table)
+ {
+ return FALSE; // Is this supported in Oracle?
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Repair table query
+ *
+ * Generates a platform-specific query so that a table can be repaired
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _repair_table($table)
+ {
+ return FALSE; // Is this supported in Oracle?
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Oracle Export
+ *
+ * @access private
+ * @param array Preferences
+ * @return mixed
+ */
+ function _backup($params = array())
+ {
+ // Currently unsupported
+ return $this->db->display_error('db_unsuported_feature');
+ }
+
+ /**
+ *
+ * The functions below have been deprecated as of 1.6, and are only here for backwards
+ * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation
+ * is STRONGLY discouraged in favour if using dbforge.
+ *
+ */
+
+ /**
+ * Create database
+ *
+ * @access public
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database($name)
+ {
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ return FALSE;
+ }
+
+}
+
+/* End of file oci8_utility.php */
/* Location: ./system/database/drivers/oci8/oci8_utility.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * ODBC Database Adapter Class\r
- *\r
- * Note: _DB is an extender class that the app controller\r
- * creates dynamically based on whether the active record\r
- * class is being used or not.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Drivers\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_odbc_driver extends CI_DB {\r
-\r
- var $dbdriver = 'odbc';\r
- \r
- // the character used to excape - not necessary for ODBC\r
- var $_escape_char = '';\r
-\r
- /**\r
- * The syntax to count rows is slightly different across different\r
- * database engines, so this string appears in each driver and is\r
- * used for the count_all() and count_all_results() functions.\r
- */\r
- var $_count_string = "SELECT COUNT(*) AS ";\r
- var $_random_keyword;\r
-\r
-\r
- function CI_DB_odbc_driver($params)\r
- {\r
- parent::CI_DB($params);\r
- \r
- $this->_random_keyword = ' RND('.time().')'; // database specific random keyword\r
- }\r
-\r
- /**\r
- * Non-persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_connect()\r
- {\r
- return @odbc_connect($this->hostname, $this->username, $this->password);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_pconnect()\r
- {\r
- return @odbc_pconnect($this->hostname, $this->username, $this->password);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select the database\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_select()\r
- {\r
- // Not needed for ODBC\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set client character set\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return resource\r
- */\r
- function db_set_charset($charset, $collation)\r
- {\r
- // @todo - add support if needed\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Version number query string\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function _version()\r
- {\r
- return "SELECT version() AS ver";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Execute the query\r
- *\r
- * @access private called by the base class\r
- * @param string an SQL query\r
- * @return resource\r
- */ \r
- function _execute($sql)\r
- {\r
- $sql = $this->_prep_query($sql);\r
- return @odbc_exec($this->conn_id, $sql);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Prep the query\r
- *\r
- * If needed, each database adapter can prep the query string\r
- *\r
- * @access private called by execute()\r
- * @param string an SQL query\r
- * @return string\r
- */ \r
- function _prep_query($sql)\r
- {\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Begin Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_begin($test_mode = FALSE)\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
- \r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // Reset the transaction failure flag.\r
- // If the $test_mode flag is set to TRUE transactions will be rolled back\r
- // even if the queries produce a successful result.\r
- $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;\r
-\r
- return odbc_autocommit($this->conn_id, FALSE);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Commit Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_commit()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $ret = odbc_commit($this->conn_id);\r
- odbc_autocommit($this->conn_id, TRUE);\r
- return $ret;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rollback Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_rollback()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $ret = odbc_rollback($this->conn_id);\r
- odbc_autocommit($this->conn_id, TRUE);\r
- return $ret;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape String\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function escape_str($str) \r
- {\r
- // Access the CI object\r
- $CI =& get_instance();\r
-\r
- // ODBC doesn't require escaping\r
- return $CI->_remove_invisible_characters($str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Affected Rows\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function affected_rows()\r
- {\r
- return @odbc_num_rows($this->conn_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Insert ID\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function insert_id()\r
- {\r
- return @odbc_insert_id($this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * "Count All" query\r
- *\r
- * Generates a platform-specific query string that counts all records in\r
- * the specified database\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function count_all($table = '')\r
- {\r
- if ($table == '')\r
- return '0';\r
- \r
- $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));\r
- \r
- if ($query->num_rows() == 0)\r
- return '0';\r
-\r
- $row = $query->row();\r
- return $row->numrows;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Show table query\r
- *\r
- * Generates a platform-specific query string so that the table names can be fetched\r
- *\r
- * @access private\r
- * @param boolean\r
- * @return string\r
- */\r
- function _list_tables($prefix_limit = FALSE)\r
- {\r
- $sql = "SHOW TABLES FROM `".$this->database."`";\r
-\r
- if ($prefix_limit !== FALSE AND $this->dbprefix != '')\r
- {\r
- //$sql .= " LIKE '".$this->dbprefix."%'";\r
- return FALSE; // not currently supported\r
- }\r
- \r
- return $sql;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Show column query\r
- *\r
- * Generates a platform-specific query string so that the column names can be fetched\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */\r
- function _list_columns($table = '')\r
- {\r
- return "SHOW COLUMNS FROM ".$table;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data query\r
- *\r
- * Generates a platform-specific query so that the column data can be retrieved\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _field_data($table)\r
- {\r
- return "SELECT TOP 1 FROM ".$table;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message string\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _error_message()\r
- {\r
- return odbc_errormsg($this->conn_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message number\r
- *\r
- * @access private\r
- * @return integer\r
- */\r
- function _error_number()\r
- {\r
- return odbc_error($this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape the SQL Identifiers\r
- *\r
- * This function escapes column and table names\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _escape_identifiers($item)\r
- {\r
- if ($this->_escape_char == '')\r
- {\r
- return $item;\r
- }\r
- \r
- if (strpos($item, '.') !== FALSE)\r
- {\r
- $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; \r
- }\r
- else\r
- {\r
- $str = $this->_escape_char.$item.$this->_escape_char;\r
- }\r
- \r
- // remove duplicates if the user already included the escape\r
- return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * From Tables\r
- *\r
- * This function implicitly groups FROM tables so there is no confusion\r
- * about operator precedence in harmony with SQL standards\r
- *\r
- * @access public\r
- * @param type\r
- * @return type\r
- */\r
- function _from_tables($tables)\r
- {\r
- if ( ! is_array($tables))\r
- {\r
- $tables = array($tables);\r
- }\r
- \r
- return '('.implode(', ', $tables).')';\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Insert statement\r
- *\r
- * Generates a platform-specific insert string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the insert keys\r
- * @param array the insert values\r
- * @return string\r
- */\r
- function _insert($table, $keys, $values)\r
- { \r
- return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Update statement\r
- *\r
- * Generates a platform-specific update string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the update data\r
- * @param array the where clause\r
- * @param array the orderby clause\r
- * @param array the limit clause\r
- * @return string\r
- */\r
- function _update($table, $values, $where, $orderby = array(), $limit = FALSE)\r
- {\r
- foreach($values as $key => $val)\r
- {\r
- $valstr[] = $key." = ".$val;\r
- }\r
- \r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';\r
- \r
- $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);\r
-\r
- $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';\r
-\r
- $sql .= $orderby.$limit;\r
- \r
- return $sql;\r
- }\r
-\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Truncate statement\r
- *\r
- * Generates a platform-specific truncate string from the supplied data\r
- * If the database does not support the truncate() command\r
- * This function maps to "DELETE FROM table"\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */ \r
- function _truncate($table)\r
- {\r
- return $this->_delete($table);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete statement\r
- *\r
- * Generates a platform-specific delete string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the where clause\r
- * @param string the limit clause\r
- * @return string\r
- */ \r
- function _delete($table, $where = array(), $like = array(), $limit = FALSE)\r
- {\r
- $conditions = '';\r
-\r
- if (count($where) > 0 OR count($like) > 0)\r
- {\r
- $conditions = "\nWHERE ";\r
- $conditions .= implode("\n", $this->ar_where);\r
-\r
- if (count($where) > 0 && count($like) > 0)\r
- {\r
- $conditions .= " AND ";\r
- }\r
- $conditions .= implode("\n", $like);\r
- }\r
-\r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- return "DELETE FROM ".$table.$conditions.$limit;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Limit string\r
- *\r
- * Generates a platform-specific LIMIT clause\r
- *\r
- * @access public\r
- * @param string the sql query string\r
- * @param integer the number of rows to limit the query to\r
- * @param integer the offset value\r
- * @return string\r
- */\r
- function _limit($sql, $limit, $offset)\r
- {\r
- // Does ODBC doesn't use the LIMIT clause?\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Close DB Connection\r
- *\r
- * @access public\r
- * @param resource\r
- * @return void\r
- */\r
- function _close($conn_id)\r
- {\r
- @odbc_close($conn_id);\r
- }\r
-\r
- \r
-}\r
-\r
-\r
-\r
-/* End of file odbc_driver.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * ODBC Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package CodeIgniter
+ * @subpackage Drivers
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_odbc_driver extends CI_DB {
+
+ var $dbdriver = 'odbc';
+
+ // the character used to excape - not necessary for ODBC
+ var $_escape_char = '';
+
+ /**
+ * The syntax to count rows is slightly different across different
+ * database engines, so this string appears in each driver and is
+ * used for the count_all() and count_all_results() functions.
+ */
+ var $_count_string = "SELECT COUNT(*) AS ";
+ var $_random_keyword;
+
+
+ function CI_DB_odbc_driver($params)
+ {
+ parent::CI_DB($params);
+
+ $this->_random_keyword = ' RND('.time().')'; // database specific random keyword
+ }
+
+ /**
+ * Non-persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_connect()
+ {
+ return @odbc_connect($this->hostname, $this->username, $this->password);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_pconnect()
+ {
+ return @odbc_pconnect($this->hostname, $this->username, $this->password);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select the database
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_select()
+ {
+ // Not needed for ODBC
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set client character set
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return resource
+ */
+ function db_set_charset($charset, $collation)
+ {
+ // @todo - add support if needed
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Version number query string
+ *
+ * @access public
+ * @return string
+ */
+ function _version()
+ {
+ return "SELECT version() AS ver";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Execute the query
+ *
+ * @access private called by the base class
+ * @param string an SQL query
+ * @return resource
+ */
+ function _execute($sql)
+ {
+ $sql = $this->_prep_query($sql);
+ return @odbc_exec($this->conn_id, $sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep the query
+ *
+ * If needed, each database adapter can prep the query string
+ *
+ * @access private called by execute()
+ * @param string an SQL query
+ * @return string
+ */
+ function _prep_query($sql)
+ {
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Begin Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_begin($test_mode = FALSE)
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ // Reset the transaction failure flag.
+ // If the $test_mode flag is set to TRUE transactions will be rolled back
+ // even if the queries produce a successful result.
+ $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+ return odbc_autocommit($this->conn_id, FALSE);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Commit Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_commit()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $ret = odbc_commit($this->conn_id);
+ odbc_autocommit($this->conn_id, TRUE);
+ return $ret;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rollback Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_rollback()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $ret = odbc_rollback($this->conn_id);
+ odbc_autocommit($this->conn_id, TRUE);
+ return $ret;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape String
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function escape_str($str)
+ {
+ // Access the CI object
+ $CI =& get_instance();
+
+ // ODBC doesn't require escaping
+ return $CI->_remove_invisible_characters($str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Affected Rows
+ *
+ * @access public
+ * @return integer
+ */
+ function affected_rows()
+ {
+ return @odbc_num_rows($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert ID
+ *
+ * @access public
+ * @return integer
+ */
+ function insert_id()
+ {
+ return @odbc_insert_id($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * "Count All" query
+ *
+ * Generates a platform-specific query string that counts all records in
+ * the specified database
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function count_all($table = '')
+ {
+ if ($table == '')
+ return '0';
+
+ $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+
+ if ($query->num_rows() == 0)
+ return '0';
+
+ $row = $query->row();
+ return $row->numrows;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show table query
+ *
+ * Generates a platform-specific query string so that the table names can be fetched
+ *
+ * @access private
+ * @param boolean
+ * @return string
+ */
+ function _list_tables($prefix_limit = FALSE)
+ {
+ $sql = "SHOW TABLES FROM `".$this->database."`";
+
+ if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+ {
+ //$sql .= " LIKE '".$this->dbprefix."%'";
+ return FALSE; // not currently supported
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show column query
+ *
+ * Generates a platform-specific query string so that the column names can be fetched
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _list_columns($table = '')
+ {
+ return "SHOW COLUMNS FROM ".$table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data query
+ *
+ * Generates a platform-specific query so that the column data can be retrieved
+ *
+ * @access public
+ * @param string the table name
+ * @return object
+ */
+ function _field_data($table)
+ {
+ return "SELECT TOP 1 FROM ".$table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message string
+ *
+ * @access private
+ * @return string
+ */
+ function _error_message()
+ {
+ return odbc_errormsg($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message number
+ *
+ * @access private
+ * @return integer
+ */
+ function _error_number()
+ {
+ return odbc_error($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape the SQL Identifiers
+ *
+ * This function escapes column and table names
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _escape_identifiers($item)
+ {
+ if ($this->_escape_char == '')
+ {
+ return $item;
+ }
+
+ if (strpos($item, '.') !== FALSE)
+ {
+ $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
+ }
+ else
+ {
+ $str = $this->_escape_char.$item.$this->_escape_char;
+ }
+
+ // remove duplicates if the user already included the escape
+ return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * From Tables
+ *
+ * This function implicitly groups FROM tables so there is no confusion
+ * about operator precedence in harmony with SQL standards
+ *
+ * @access public
+ * @param type
+ * @return type
+ */
+ function _from_tables($tables)
+ {
+ if ( ! is_array($tables))
+ {
+ $tables = array($tables);
+ }
+
+ return '('.implode(', ', $tables).')';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert statement
+ *
+ * Generates a platform-specific insert string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the insert keys
+ * @param array the insert values
+ * @return string
+ */
+ function _insert($table, $keys, $values)
+ {
+ return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Update statement
+ *
+ * Generates a platform-specific update string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the update data
+ * @param array the where clause
+ * @param array the orderby clause
+ * @param array the limit clause
+ * @return string
+ */
+ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+ {
+ foreach($values as $key => $val)
+ {
+ $valstr[] = $key." = ".$val;
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+
+ $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+ $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+ $sql .= $orderby.$limit;
+
+ return $sql;
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Truncate statement
+ *
+ * Generates a platform-specific truncate string from the supplied data
+ * If the database does not support the truncate() command
+ * This function maps to "DELETE FROM table"
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _truncate($table)
+ {
+ return $this->_delete($table);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete statement
+ *
+ * Generates a platform-specific delete string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the where clause
+ * @param string the limit clause
+ * @return string
+ */
+ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+ {
+ $conditions = '';
+
+ if (count($where) > 0 OR count($like) > 0)
+ {
+ $conditions = "\nWHERE ";
+ $conditions .= implode("\n", $this->ar_where);
+
+ if (count($where) > 0 && count($like) > 0)
+ {
+ $conditions .= " AND ";
+ }
+ $conditions .= implode("\n", $like);
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ return "DELETE FROM ".$table.$conditions.$limit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Limit string
+ *
+ * Generates a platform-specific LIMIT clause
+ *
+ * @access public
+ * @param string the sql query string
+ * @param integer the number of rows to limit the query to
+ * @param integer the offset value
+ * @return string
+ */
+ function _limit($sql, $limit, $offset)
+ {
+ // Does ODBC doesn't use the LIMIT clause?
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Close DB Connection
+ *
+ * @access public
+ * @param resource
+ * @return void
+ */
+ function _close($conn_id)
+ {
+ @odbc_close($conn_id);
+ }
+
+
+}
+
+
+
+/* End of file odbc_driver.php */
/* Location: ./system/database/drivers/odbc/odbc_driver.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * ODBC Forge Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/database/\r
- */\r
-class CI_DB_odbc_forge extends CI_DB_forge {\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database()\r
- {\r
- // ODBC has no "create database" command since it's\r
- // designed to connect to an existing database\r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- // ODBC has no "drop database" command since it's\r
- // designed to connect to an existing database \r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Create Table\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @param array the fields\r
- * @param mixed primary key(s)\r
- * @param mixed key(s)\r
- * @param boolean should 'IF NOT EXISTS' be added to the SQL\r
- * @return bool\r
- */\r
- function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)\r
- {\r
- $sql = 'CREATE TABLE ';\r
- \r
- if ($if_not_exists === TRUE)\r
- {\r
- $sql .= 'IF NOT EXISTS ';\r
- }\r
- \r
- $sql .= $this->db->_escape_identifiers($table)." (";\r
- $current_field_count = 0;\r
-\r
- foreach ($fields as $field=>$attributes)\r
- {\r
- // Numeric field names aren't allowed in databases, so if the key is\r
- // numeric, we know it was assigned by PHP and the developer manually\r
- // entered the field information, so we'll simply add it to the list\r
- if (is_numeric($field))\r
- {\r
- $sql .= "\n\t$attributes";\r
- }\r
- else\r
- {\r
- $attributes = array_change_key_case($attributes, CASE_UPPER);\r
- \r
- $sql .= "\n\t".$this->db->_protect_identifiers($field);\r
- \r
- $sql .= ' '.$attributes['TYPE'];\r
- \r
- if (array_key_exists('CONSTRAINT', $attributes))\r
- {\r
- $sql .= '('.$attributes['CONSTRAINT'].')';\r
- }\r
- \r
- if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)\r
- {\r
- $sql .= ' UNSIGNED';\r
- }\r
- \r
- if (array_key_exists('DEFAULT', $attributes))\r
- {\r
- $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';\r
- }\r
- \r
- if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)\r
- {\r
- $sql .= ' NULL';\r
- }\r
- else\r
- {\r
- $sql .= ' NOT NULL'; \r
- }\r
- \r
- if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)\r
- {\r
- $sql .= ' AUTO_INCREMENT';\r
- }\r
- }\r
- \r
- // don't add a comma on the end of the last field\r
- if (++$current_field_count < count($fields))\r
- {\r
- $sql .= ',';\r
- }\r
- }\r
-\r
- if (count($primary_keys) > 0)\r
- {\r
- $primary_keys = $this->db->_protect_identifiers($primary_keys);\r
- $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";\r
- }\r
- \r
- if (is_array($keys) && count($keys) > 0)\r
- {\r
- foreach ($keys as $key)\r
- {\r
- if (is_array($key))\r
- {\r
- $key = $this->db->_protect_identifiers($key); \r
- }\r
- else\r
- {\r
- $key = array($this->db->_protect_identifiers($key));\r
- }\r
- \r
- $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";\r
- }\r
- }\r
- \r
- $sql .= "\n)";\r
-\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop Table\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _drop_table($table)\r
- {\r
- // Not a supported ODBC feature \r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Alter table query\r
- *\r
- * Generates a platform-specific query so that a table can be altered\r
- * Called by add_column(), drop_column(), and column_alter(),\r
- *\r
- * @access private\r
- * @param string the ALTER type (ADD, DROP, CHANGE)\r
- * @param string the column name\r
- * @param string the table name\r
- * @param string the column definition\r
- * @param string the default value\r
- * @param boolean should 'NOT NULL' be added\r
- * @param string the field after which we should add the new field\r
- * @return object\r
- */\r
- function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);\r
-\r
- // DROP has everything it needs now.\r
- if ($alter_type == 'DROP')\r
- {\r
- return $sql;\r
- }\r
-\r
- $sql .= " $column_definition";\r
-\r
- if ($default_value != '')\r
- {\r
- $sql .= " DEFAULT \"$default_value\"";\r
- }\r
-\r
- if ($null === NULL)\r
- {\r
- $sql .= ' NULL';\r
- }\r
- else\r
- {\r
- $sql .= ' NOT NULL';\r
- }\r
-\r
- if ($after_field != '')\r
- {\r
- $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);\r
- }\r
- \r
- return $sql;\r
- \r
- }\r
-\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rename a table\r
- *\r
- * Generates a platform-specific query so that a table can be renamed\r
- *\r
- * @access private\r
- * @param string the old table name\r
- * @param string the new table name\r
- * @return string\r
- */\r
- function _rename_table($table_name, $new_table_name)\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);\r
- return $sql;\r
- }\r
-\r
-\r
-}\r
-\r
-/* End of file odbc_forge.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * ODBC Forge Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/database/
+ */
+class CI_DB_odbc_forge extends CI_DB_forge {
+
+ /**
+ * Create database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database()
+ {
+ // ODBC has no "create database" command since it's
+ // designed to connect to an existing database
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unsuported_feature');
+ }
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ // ODBC has no "drop database" command since it's
+ // designed to connect to an existing database
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unsuported_feature');
+ }
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create Table
+ *
+ * @access private
+ * @param string the table name
+ * @param array the fields
+ * @param mixed primary key(s)
+ * @param mixed key(s)
+ * @param boolean should 'IF NOT EXISTS' be added to the SQL
+ * @return bool
+ */
+ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+ {
+ $sql = 'CREATE TABLE ';
+
+ if ($if_not_exists === TRUE)
+ {
+ $sql .= 'IF NOT EXISTS ';
+ }
+
+ $sql .= $this->db->_escape_identifiers($table)." (";
+ $current_field_count = 0;
+
+ foreach ($fields as $field=>$attributes)
+ {
+ // Numeric field names aren't allowed in databases, so if the key is
+ // numeric, we know it was assigned by PHP and the developer manually
+ // entered the field information, so we'll simply add it to the list
+ if (is_numeric($field))
+ {
+ $sql .= "\n\t$attributes";
+ }
+ else
+ {
+ $attributes = array_change_key_case($attributes, CASE_UPPER);
+
+ $sql .= "\n\t".$this->db->_protect_identifiers($field);
+
+ $sql .= ' '.$attributes['TYPE'];
+
+ if (array_key_exists('CONSTRAINT', $attributes))
+ {
+ $sql .= '('.$attributes['CONSTRAINT'].')';
+ }
+
+ if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+ {
+ $sql .= ' UNSIGNED';
+ }
+
+ if (array_key_exists('DEFAULT', $attributes))
+ {
+ $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+ }
+
+ if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
+ {
+ $sql .= ' NULL';
+ }
+ else
+ {
+ $sql .= ' NOT NULL';
+ }
+
+ if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+ {
+ $sql .= ' AUTO_INCREMENT';
+ }
+ }
+
+ // don't add a comma on the end of the last field
+ if (++$current_field_count < count($fields))
+ {
+ $sql .= ',';
+ }
+ }
+
+ if (count($primary_keys) > 0)
+ {
+ $primary_keys = $this->db->_protect_identifiers($primary_keys);
+ $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
+ }
+
+ if (is_array($keys) && count($keys) > 0)
+ {
+ foreach ($keys as $key)
+ {
+ if (is_array($key))
+ {
+ $key = $this->db->_protect_identifiers($key);
+ }
+ else
+ {
+ $key = array($this->db->_protect_identifiers($key));
+ }
+
+ $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";
+ }
+ }
+
+ $sql .= "\n)";
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop Table
+ *
+ * @access private
+ * @return bool
+ */
+ function _drop_table($table)
+ {
+ // Not a supported ODBC feature
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unsuported_feature');
+ }
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alter table query
+ *
+ * Generates a platform-specific query so that a table can be altered
+ * Called by add_column(), drop_column(), and column_alter(),
+ *
+ * @access private
+ * @param string the ALTER type (ADD, DROP, CHANGE)
+ * @param string the column name
+ * @param string the table name
+ * @param string the column definition
+ * @param string the default value
+ * @param boolean should 'NOT NULL' be added
+ * @param string the field after which we should add the new field
+ * @return object
+ */
+ function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
+
+ // DROP has everything it needs now.
+ if ($alter_type == 'DROP')
+ {
+ return $sql;
+ }
+
+ $sql .= " $column_definition";
+
+ if ($default_value != '')
+ {
+ $sql .= " DEFAULT \"$default_value\"";
+ }
+
+ if ($null === NULL)
+ {
+ $sql .= ' NULL';
+ }
+ else
+ {
+ $sql .= ' NOT NULL';
+ }
+
+ if ($after_field != '')
+ {
+ $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+ }
+
+ return $sql;
+
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rename a table
+ *
+ * Generates a platform-specific query so that a table can be renamed
+ *
+ * @access private
+ * @param string the old table name
+ * @param string the new table name
+ * @return string
+ */
+ function _rename_table($table_name, $new_table_name)
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+ return $sql;
+ }
+
+
+}
+
+/* End of file odbc_forge.php */
/* Location: ./system/database/drivers/odbc/odbc_forge.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * ODBC Result Class\r
- *\r
- * This class extends the parent result class: CI_DB_result\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_odbc_result extends CI_DB_result {\r
- \r
- /**\r
- * Number of rows in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_rows()\r
- {\r
- return @odbc_num_rows($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Number of fields in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_fields()\r
- {\r
- return @odbc_num_fields($this->result_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch Field Names\r
- *\r
- * Generates an array of column names\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function list_fields()\r
- {\r
- $field_names = array();\r
- for ($i = 0; $i < $this->num_fields(); $i++)\r
- {\r
- $field_names[] = odbc_field_name($this->result_id, $i);\r
- }\r
- \r
- return $field_names;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data\r
- *\r
- * Generates an array of objects containing field meta-data\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function field_data()\r
- {\r
- $retval = array();\r
- for ($i = 0; $i < $this->num_fields(); $i++)\r
- {\r
- $F = new stdClass();\r
- $F->name = odbc_field_name($this->result_id, $i);\r
- $F->type = odbc_field_type($this->result_id, $i);\r
- $F->max_length = odbc_field_len($this->result_id, $i);\r
- $F->primary_key = 0;\r
- $F->default = '';\r
-\r
- $retval[] = $F;\r
- }\r
- \r
- return $retval;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Free the result\r
- *\r
- * @return null\r
- */ \r
- function free_result()\r
- {\r
- if (is_resource($this->result_id))\r
- {\r
- odbc_free_result($this->result_id);\r
- $this->result_id = FALSE;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Data Seek\r
- *\r
- * Moves the internal pointer to the desired offset. We call\r
- * this internally before fetching results to make sure the\r
- * result set starts at zero\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _data_seek($n = 0)\r
- {\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - associative array\r
- *\r
- * Returns the result set as an array\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _fetch_assoc()\r
- {\r
- if (function_exists('odbc_fetch_object'))\r
- {\r
- return odbc_fetch_array($this->result_id);\r
- }\r
- else\r
- {\r
- return $this->_odbc_fetch_array($this->result_id);\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - object\r
- *\r
- * Returns the result set as an object\r
- *\r
- * @access private\r
- * @return object\r
- */\r
- function _fetch_object()\r
- {\r
- if (function_exists('odbc_fetch_object'))\r
- {\r
- return odbc_fetch_object($this->result_id);\r
- }\r
- else\r
- {\r
- return $this->_odbc_fetch_object($this->result_id);\r
- }\r
- }\r
-\r
-\r
- /**\r
- * Result - object\r
- *\r
- * subsititutes the odbc_fetch_object function when\r
- * not available (odbc_fetch_object requires unixODBC)\r
- *\r
- * @access private\r
- * @return object\r
- */\r
- function _odbc_fetch_object(& $odbc_result) {\r
- $rs = array();\r
- $rs_obj = false;\r
- if (odbc_fetch_into($odbc_result, $rs)) {\r
- foreach ($rs as $k=>$v) {\r
- $field_name= odbc_field_name($odbc_result, $k+1);\r
- $rs_obj->$field_name = $v;\r
- }\r
- }\r
- return $rs_obj;\r
- }\r
-\r
-\r
- /**\r
- * Result - array\r
- *\r
- * subsititutes the odbc_fetch_array function when\r
- * not available (odbc_fetch_array requires unixODBC)\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _odbc_fetch_array(& $odbc_result) {\r
- $rs = array();\r
- $rs_assoc = false;\r
- if (odbc_fetch_into($odbc_result, $rs)) {\r
- $rs_assoc=array();\r
- foreach ($rs as $k=>$v) {\r
- $field_name= odbc_field_name($odbc_result, $k+1);\r
- $rs_assoc[$field_name] = $v;\r
- }\r
- }\r
- return $rs_assoc;\r
- }\r
-\r
-}\r
-\r
-\r
-/* End of file odbc_result.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * ODBC Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_odbc_result extends CI_DB_result {
+
+ /**
+ * Number of rows in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_rows()
+ {
+ return @odbc_num_rows($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Number of fields in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_fields()
+ {
+ return @odbc_num_fields($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch Field Names
+ *
+ * Generates an array of column names
+ *
+ * @access public
+ * @return array
+ */
+ function list_fields()
+ {
+ $field_names = array();
+ for ($i = 0; $i < $this->num_fields(); $i++)
+ {
+ $field_names[] = odbc_field_name($this->result_id, $i);
+ }
+
+ return $field_names;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data
+ *
+ * Generates an array of objects containing field meta-data
+ *
+ * @access public
+ * @return array
+ */
+ function field_data()
+ {
+ $retval = array();
+ for ($i = 0; $i < $this->num_fields(); $i++)
+ {
+ $F = new stdClass();
+ $F->name = odbc_field_name($this->result_id, $i);
+ $F->type = odbc_field_type($this->result_id, $i);
+ $F->max_length = odbc_field_len($this->result_id, $i);
+ $F->primary_key = 0;
+ $F->default = '';
+
+ $retval[] = $F;
+ }
+
+ return $retval;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Free the result
+ *
+ * @return null
+ */
+ function free_result()
+ {
+ if (is_resource($this->result_id))
+ {
+ odbc_free_result($this->result_id);
+ $this->result_id = FALSE;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Data Seek
+ *
+ * Moves the internal pointer to the desired offset. We call
+ * this internally before fetching results to make sure the
+ * result set starts at zero
+ *
+ * @access private
+ * @return array
+ */
+ function _data_seek($n = 0)
+ {
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - associative array
+ *
+ * Returns the result set as an array
+ *
+ * @access private
+ * @return array
+ */
+ function _fetch_assoc()
+ {
+ if (function_exists('odbc_fetch_object'))
+ {
+ return odbc_fetch_array($this->result_id);
+ }
+ else
+ {
+ return $this->_odbc_fetch_array($this->result_id);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - object
+ *
+ * Returns the result set as an object
+ *
+ * @access private
+ * @return object
+ */
+ function _fetch_object()
+ {
+ if (function_exists('odbc_fetch_object'))
+ {
+ return odbc_fetch_object($this->result_id);
+ }
+ else
+ {
+ return $this->_odbc_fetch_object($this->result_id);
+ }
+ }
+
+
+ /**
+ * Result - object
+ *
+ * subsititutes the odbc_fetch_object function when
+ * not available (odbc_fetch_object requires unixODBC)
+ *
+ * @access private
+ * @return object
+ */
+ function _odbc_fetch_object(& $odbc_result) {
+ $rs = array();
+ $rs_obj = false;
+ if (odbc_fetch_into($odbc_result, $rs)) {
+ foreach ($rs as $k=>$v) {
+ $field_name= odbc_field_name($odbc_result, $k+1);
+ $rs_obj->$field_name = $v;
+ }
+ }
+ return $rs_obj;
+ }
+
+
+ /**
+ * Result - array
+ *
+ * subsititutes the odbc_fetch_array function when
+ * not available (odbc_fetch_array requires unixODBC)
+ *
+ * @access private
+ * @return array
+ */
+ function _odbc_fetch_array(& $odbc_result) {
+ $rs = array();
+ $rs_assoc = false;
+ if (odbc_fetch_into($odbc_result, $rs)) {
+ $rs_assoc=array();
+ foreach ($rs as $k=>$v) {
+ $field_name= odbc_field_name($odbc_result, $k+1);
+ $rs_assoc[$field_name] = $v;
+ }
+ }
+ return $rs_assoc;
+ }
+
+}
+
+
+/* End of file odbc_result.php */
/* Location: ./system/database/drivers/odbc/odbc_result.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * ODBC Utility Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/database/\r
- */\r
-class CI_DB_odbc_utility extends CI_DB_utility {\r
-\r
- /**\r
- * List databases\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _list_databases()\r
- {\r
- // Not sure if ODBC lets you list all databases... \r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Optimize table query\r
- *\r
- * Generates a platform-specific query so that a table can be optimized\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _optimize_table($table)\r
- {\r
- // Not a supported ODBC feature \r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Repair table query\r
- *\r
- * Generates a platform-specific query so that a table can be repaired\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _repair_table($table)\r
- {\r
- // Not a supported ODBC feature \r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * ODBC Export\r
- *\r
- * @access private\r
- * @param array Preferences\r
- * @return mixed\r
- */\r
- function _backup($params = array())\r
- {\r
- // Currently unsupported\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
- \r
- /**\r
- *\r
- * The functions below have been deprecated as of 1.6, and are only here for backwards\r
- * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation\r
- * is STRONGLY discouraged in favour if using dbforge.\r
- *\r
- */\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database()\r
- {\r
- // ODBC has no "create database" command since it's\r
- // designed to connect to an existing database\r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- // ODBC has no "drop database" command since it's\r
- // designed to connect to an existing database \r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
- return FALSE;\r
- }\r
-}\r
-\r
-/* End of file odbc_utility.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * ODBC Utility Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/database/
+ */
+class CI_DB_odbc_utility extends CI_DB_utility {
+
+ /**
+ * List databases
+ *
+ * @access private
+ * @return bool
+ */
+ function _list_databases()
+ {
+ // Not sure if ODBC lets you list all databases...
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unsuported_feature');
+ }
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Optimize table query
+ *
+ * Generates a platform-specific query so that a table can be optimized
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _optimize_table($table)
+ {
+ // Not a supported ODBC feature
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unsuported_feature');
+ }
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Repair table query
+ *
+ * Generates a platform-specific query so that a table can be repaired
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _repair_table($table)
+ {
+ // Not a supported ODBC feature
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unsuported_feature');
+ }
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * ODBC Export
+ *
+ * @access private
+ * @param array Preferences
+ * @return mixed
+ */
+ function _backup($params = array())
+ {
+ // Currently unsupported
+ return $this->db->display_error('db_unsuported_feature');
+ }
+
+ /**
+ *
+ * The functions below have been deprecated as of 1.6, and are only here for backwards
+ * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation
+ * is STRONGLY discouraged in favour if using dbforge.
+ *
+ */
+
+ /**
+ * Create database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database()
+ {
+ // ODBC has no "create database" command since it's
+ // designed to connect to an existing database
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unsuported_feature');
+ }
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ // ODBC has no "drop database" command since it's
+ // designed to connect to an existing database
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unsuported_feature');
+ }
+ return FALSE;
+ }
+}
+
+/* End of file odbc_utility.php */
/* Location: ./system/database/drivers/odbc/odbc_utility.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Postgre Database Adapter Class\r
- *\r
- * Note: _DB is an extender class that the app controller\r
- * creates dynamically based on whether the active record\r
- * class is being used or not.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Drivers\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_postgre_driver extends CI_DB {\r
-\r
- var $dbdriver = 'postgre';\r
- \r
- var $_escape_char = '"';\r
-\r
- /**\r
- * The syntax to count rows is slightly different across different\r
- * database engines, so this string appears in each driver and is\r
- * used for the count_all() and count_all_results() functions.\r
- */\r
- var $_count_string = "SELECT COUNT(*) AS ";\r
- var $_random_keyword = ' RANDOM()'; // database specific random keyword\r
-\r
- /**\r
- * Connection String\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _connect_string()\r
- {\r
- $components = array(\r
- 'hostname' => 'host',\r
- 'port' => 'port',\r
- 'database' => 'dbname',\r
- 'username' => 'user',\r
- 'password' => 'password'\r
- );\r
- \r
- $connect_string = "";\r
- foreach ($components as $key => $val)\r
- {\r
- if (isset($this->$key) && $this->$key != '')\r
- {\r
- $connect_string .= " $val=".$this->$key;\r
- }\r
- }\r
- return trim($connect_string);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Non-persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_connect()\r
- { \r
- return @pg_connect($this->_connect_string());\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_pconnect()\r
- {\r
- return @pg_pconnect($this->_connect_string());\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select the database\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_select()\r
- {\r
- // Not needed for Postgre so we'll return TRUE\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set client character set\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return resource\r
- */\r
- function db_set_charset($charset, $collation)\r
- {\r
- // @todo - add support if needed\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Version number query string\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function _version()\r
- {\r
- return "SELECT version() AS ver";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Execute the query\r
- *\r
- * @access private called by the base class\r
- * @param string an SQL query\r
- * @return resource\r
- */ \r
- function _execute($sql)\r
- {\r
- $sql = $this->_prep_query($sql);\r
- return @pg_query($this->conn_id, $sql);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Prep the query\r
- *\r
- * If needed, each database adapter can prep the query string\r
- *\r
- * @access private called by execute()\r
- * @param string an SQL query\r
- * @return string\r
- */ \r
- function _prep_query($sql)\r
- {\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Begin Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_begin($test_mode = FALSE)\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
- \r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // Reset the transaction failure flag.\r
- // If the $test_mode flag is set to TRUE transactions will be rolled back\r
- // even if the queries produce a successful result.\r
- $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;\r
-\r
- return @pg_exec($this->conn_id, "begin");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Commit Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_commit()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- return @pg_exec($this->conn_id, "commit");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rollback Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_rollback()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- return @pg_exec($this->conn_id, "rollback");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape String\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function escape_str($str) \r
- { \r
- return pg_escape_string($str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Affected Rows\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function affected_rows()\r
- {\r
- return @pg_affected_rows($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Insert ID\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function insert_id()\r
- {\r
- $v = $this->_version();\r
- $v = $v['server'];\r
- \r
- $table = func_num_args() > 0 ? func_get_arg(0) : null;\r
- $column = func_num_args() > 1 ? func_get_arg(1) : null;\r
- \r
- if ($table == null && $v >= '8.1')\r
- {\r
- $sql='SELECT LASTVAL() as ins_id';\r
- }\r
- elseif ($table != null && $column != null && $v >= '8.0')\r
- {\r
- $sql = sprintf("SELECT pg_get_serial_sequence('%s','%s') as seq", $table, $column);\r
- $query = $this->query($sql);\r
- $row = $query->row();\r
- $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $row->seq);\r
- }\r
- elseif ($table != null)\r
- {\r
- // seq_name passed in table parameter\r
- $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $table);\r
- }\r
- else\r
- {\r
- return pg_last_oid($this->result_id);\r
- }\r
- $query = $this->query($sql);\r
- $row = $query->row();\r
- return $row->ins_id;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * "Count All" query\r
- *\r
- * Generates a platform-specific query string that counts all records in\r
- * the specified database\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function count_all($table = '')\r
- {\r
- if ($table == '')\r
- return '0';\r
-\r
- $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));\r
- \r
- if ($query->num_rows() == 0)\r
- return '0';\r
-\r
- $row = $query->row();\r
- return $row->numrows;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Show table query\r
- *\r
- * Generates a platform-specific query string so that the table names can be fetched\r
- *\r
- * @access private\r
- * @param boolean\r
- * @return string\r
- */\r
- function _list_tables($prefix_limit = FALSE)\r
- { \r
- $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"; \r
- \r
- if ($prefix_limit !== FALSE AND $this->dbprefix != '')\r
- {\r
- $sql .= " AND table_name LIKE '".$this->dbprefix."%'";\r
- }\r
- \r
- return $sql;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Show column query\r
- *\r
- * Generates a platform-specific query string so that the column names can be fetched\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */\r
- function _list_columns($table = '')\r
- {\r
- return "SELECT column_name FROM information_schema.columns WHERE table_name ='".$table."'";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data query\r
- *\r
- * Generates a platform-specific query so that the column data can be retrieved\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _field_data($table)\r
- {\r
- return "SELECT * FROM ".$table." LIMIT 1";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message string\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _error_message()\r
- {\r
- return pg_last_error($this->conn_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message number\r
- *\r
- * @access private\r
- * @return integer\r
- */\r
- function _error_number()\r
- {\r
- return '';\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape the SQL Identifiers\r
- *\r
- * This function escapes column and table names\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _escape_identifiers($item)\r
- {\r
- if ($this->_escape_char == '')\r
- {\r
- return $item;\r
- }\r
- \r
- if (strpos($item, '.') !== FALSE)\r
- {\r
- $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; \r
- }\r
- else\r
- {\r
- $str = $this->_escape_char.$item.$this->_escape_char;\r
- }\r
- \r
- // remove duplicates if the user already included the escape\r
- return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * From Tables\r
- *\r
- * This function implicitly groups FROM tables so there is no confusion\r
- * about operator precedence in harmony with SQL standards\r
- *\r
- * @access public\r
- * @param type\r
- * @return type\r
- */\r
- function _from_tables($tables)\r
- {\r
- if ( ! is_array($tables))\r
- {\r
- $tables = array($tables);\r
- }\r
- \r
- return implode(', ', $tables);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Insert statement\r
- *\r
- * Generates a platform-specific insert string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the insert keys\r
- * @param array the insert values\r
- * @return string\r
- */\r
- function _insert($table, $keys, $values)\r
- { \r
- return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Update statement\r
- *\r
- * Generates a platform-specific update string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the update data\r
- * @param array the where clause\r
- * @param array the orderby clause\r
- * @param array the limit clause\r
- * @return string\r
- */\r
- function _update($table, $values, $where, $orderby = array(), $limit = FALSE)\r
- {\r
- foreach($values as $key => $val)\r
- {\r
- $valstr[] = $key." = ".$val;\r
- }\r
- \r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';\r
- \r
- $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);\r
-\r
- $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';\r
-\r
- $sql .= $orderby.$limit;\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Truncate statement\r
- *\r
- * Generates a platform-specific truncate string from the supplied data\r
- * If the database does not support the truncate() command\r
- * This function maps to "DELETE FROM table"\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */ \r
- function _truncate($table)\r
- {\r
- return "TRUNCATE ".$table;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete statement\r
- *\r
- * Generates a platform-specific delete string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the where clause\r
- * @param string the limit clause\r
- * @return string\r
- */ \r
- function _delete($table, $where = array(), $like = array(), $limit = FALSE)\r
- {\r
- $conditions = '';\r
-\r
- if (count($where) > 0 OR count($like) > 0)\r
- {\r
- $conditions = "\nWHERE ";\r
- $conditions .= implode("\n", $this->ar_where);\r
-\r
- if (count($where) > 0 && count($like) > 0)\r
- {\r
- $conditions .= " AND ";\r
- }\r
- $conditions .= implode("\n", $like);\r
- }\r
-\r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- return "DELETE FROM ".$table.$conditions.$limit;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- /**\r
- * Limit string\r
- *\r
- * Generates a platform-specific LIMIT clause\r
- *\r
- * @access public\r
- * @param string the sql query string\r
- * @param integer the number of rows to limit the query to\r
- * @param integer the offset value\r
- * @return string\r
- */\r
- function _limit($sql, $limit, $offset)\r
- { \r
- $sql .= "LIMIT ".$limit;\r
- \r
- if ($offset > 0)\r
- {\r
- $sql .= " OFFSET ".$offset;\r
- }\r
- \r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Close DB Connection\r
- *\r
- * @access public\r
- * @param resource\r
- * @return void\r
- */\r
- function _close($conn_id)\r
- {\r
- @pg_close($conn_id);\r
- }\r
-\r
-\r
-}\r
-\r
-\r
-/* End of file postgre_driver.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Postgre Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package CodeIgniter
+ * @subpackage Drivers
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_postgre_driver extends CI_DB {
+
+ var $dbdriver = 'postgre';
+
+ var $_escape_char = '"';
+
+ /**
+ * The syntax to count rows is slightly different across different
+ * database engines, so this string appears in each driver and is
+ * used for the count_all() and count_all_results() functions.
+ */
+ var $_count_string = "SELECT COUNT(*) AS ";
+ var $_random_keyword = ' RANDOM()'; // database specific random keyword
+
+ /**
+ * Connection String
+ *
+ * @access private
+ * @return string
+ */
+ function _connect_string()
+ {
+ $components = array(
+ 'hostname' => 'host',
+ 'port' => 'port',
+ 'database' => 'dbname',
+ 'username' => 'user',
+ 'password' => 'password'
+ );
+
+ $connect_string = "";
+ foreach ($components as $key => $val)
+ {
+ if (isset($this->$key) && $this->$key != '')
+ {
+ $connect_string .= " $val=".$this->$key;
+ }
+ }
+ return trim($connect_string);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Non-persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_connect()
+ {
+ return @pg_connect($this->_connect_string());
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_pconnect()
+ {
+ return @pg_pconnect($this->_connect_string());
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select the database
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_select()
+ {
+ // Not needed for Postgre so we'll return TRUE
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set client character set
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return resource
+ */
+ function db_set_charset($charset, $collation)
+ {
+ // @todo - add support if needed
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Version number query string
+ *
+ * @access public
+ * @return string
+ */
+ function _version()
+ {
+ return "SELECT version() AS ver";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Execute the query
+ *
+ * @access private called by the base class
+ * @param string an SQL query
+ * @return resource
+ */
+ function _execute($sql)
+ {
+ $sql = $this->_prep_query($sql);
+ return @pg_query($this->conn_id, $sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep the query
+ *
+ * If needed, each database adapter can prep the query string
+ *
+ * @access private called by execute()
+ * @param string an SQL query
+ * @return string
+ */
+ function _prep_query($sql)
+ {
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Begin Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_begin($test_mode = FALSE)
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ // Reset the transaction failure flag.
+ // If the $test_mode flag is set to TRUE transactions will be rolled back
+ // even if the queries produce a successful result.
+ $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+ return @pg_exec($this->conn_id, "begin");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Commit Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_commit()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ return @pg_exec($this->conn_id, "commit");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rollback Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_rollback()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ return @pg_exec($this->conn_id, "rollback");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape String
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function escape_str($str)
+ {
+ return pg_escape_string($str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Affected Rows
+ *
+ * @access public
+ * @return integer
+ */
+ function affected_rows()
+ {
+ return @pg_affected_rows($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert ID
+ *
+ * @access public
+ * @return integer
+ */
+ function insert_id()
+ {
+ $v = $this->_version();
+ $v = $v['server'];
+
+ $table = func_num_args() > 0 ? func_get_arg(0) : null;
+ $column = func_num_args() > 1 ? func_get_arg(1) : null;
+
+ if ($table == null && $v >= '8.1')
+ {
+ $sql='SELECT LASTVAL() as ins_id';
+ }
+ elseif ($table != null && $column != null && $v >= '8.0')
+ {
+ $sql = sprintf("SELECT pg_get_serial_sequence('%s','%s') as seq", $table, $column);
+ $query = $this->query($sql);
+ $row = $query->row();
+ $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $row->seq);
+ }
+ elseif ($table != null)
+ {
+ // seq_name passed in table parameter
+ $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $table);
+ }
+ else
+ {
+ return pg_last_oid($this->result_id);
+ }
+ $query = $this->query($sql);
+ $row = $query->row();
+ return $row->ins_id;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * "Count All" query
+ *
+ * Generates a platform-specific query string that counts all records in
+ * the specified database
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function count_all($table = '')
+ {
+ if ($table == '')
+ return '0';
+
+ $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+
+ if ($query->num_rows() == 0)
+ return '0';
+
+ $row = $query->row();
+ return $row->numrows;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show table query
+ *
+ * Generates a platform-specific query string so that the table names can be fetched
+ *
+ * @access private
+ * @param boolean
+ * @return string
+ */
+ function _list_tables($prefix_limit = FALSE)
+ {
+ $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'";
+
+ if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+ {
+ $sql .= " AND table_name LIKE '".$this->dbprefix."%'";
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show column query
+ *
+ * Generates a platform-specific query string so that the column names can be fetched
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _list_columns($table = '')
+ {
+ return "SELECT column_name FROM information_schema.columns WHERE table_name ='".$table."'";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data query
+ *
+ * Generates a platform-specific query so that the column data can be retrieved
+ *
+ * @access public
+ * @param string the table name
+ * @return object
+ */
+ function _field_data($table)
+ {
+ return "SELECT * FROM ".$table." LIMIT 1";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message string
+ *
+ * @access private
+ * @return string
+ */
+ function _error_message()
+ {
+ return pg_last_error($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message number
+ *
+ * @access private
+ * @return integer
+ */
+ function _error_number()
+ {
+ return '';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape the SQL Identifiers
+ *
+ * This function escapes column and table names
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _escape_identifiers($item)
+ {
+ if ($this->_escape_char == '')
+ {
+ return $item;
+ }
+
+ if (strpos($item, '.') !== FALSE)
+ {
+ $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
+ }
+ else
+ {
+ $str = $this->_escape_char.$item.$this->_escape_char;
+ }
+
+ // remove duplicates if the user already included the escape
+ return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * From Tables
+ *
+ * This function implicitly groups FROM tables so there is no confusion
+ * about operator precedence in harmony with SQL standards
+ *
+ * @access public
+ * @param type
+ * @return type
+ */
+ function _from_tables($tables)
+ {
+ if ( ! is_array($tables))
+ {
+ $tables = array($tables);
+ }
+
+ return implode(', ', $tables);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert statement
+ *
+ * Generates a platform-specific insert string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the insert keys
+ * @param array the insert values
+ * @return string
+ */
+ function _insert($table, $keys, $values)
+ {
+ return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Update statement
+ *
+ * Generates a platform-specific update string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the update data
+ * @param array the where clause
+ * @param array the orderby clause
+ * @param array the limit clause
+ * @return string
+ */
+ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+ {
+ foreach($values as $key => $val)
+ {
+ $valstr[] = $key." = ".$val;
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+
+ $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+ $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+ $sql .= $orderby.$limit;
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Truncate statement
+ *
+ * Generates a platform-specific truncate string from the supplied data
+ * If the database does not support the truncate() command
+ * This function maps to "DELETE FROM table"
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _truncate($table)
+ {
+ return "TRUNCATE ".$table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete statement
+ *
+ * Generates a platform-specific delete string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the where clause
+ * @param string the limit clause
+ * @return string
+ */
+ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+ {
+ $conditions = '';
+
+ if (count($where) > 0 OR count($like) > 0)
+ {
+ $conditions = "\nWHERE ";
+ $conditions .= implode("\n", $this->ar_where);
+
+ if (count($where) > 0 && count($like) > 0)
+ {
+ $conditions .= " AND ";
+ }
+ $conditions .= implode("\n", $like);
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ return "DELETE FROM ".$table.$conditions.$limit;
+ }
+
+ // --------------------------------------------------------------------
+ /**
+ * Limit string
+ *
+ * Generates a platform-specific LIMIT clause
+ *
+ * @access public
+ * @param string the sql query string
+ * @param integer the number of rows to limit the query to
+ * @param integer the offset value
+ * @return string
+ */
+ function _limit($sql, $limit, $offset)
+ {
+ $sql .= "LIMIT ".$limit;
+
+ if ($offset > 0)
+ {
+ $sql .= " OFFSET ".$offset;
+ }
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Close DB Connection
+ *
+ * @access public
+ * @param resource
+ * @return void
+ */
+ function _close($conn_id)
+ {
+ @pg_close($conn_id);
+ }
+
+
+}
+
+
+/* End of file postgre_driver.php */
/* Location: ./system/database/drivers/postgre/postgre_driver.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Postgre Forge Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_postgre_forge extends CI_DB_forge {\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database($name)\r
- {\r
- return "CREATE DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- return "DROP DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Create Table\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @param array the fields\r
- * @param mixed primary key(s)\r
- * @param mixed key(s)\r
- * @param boolean should 'IF NOT EXISTS' be added to the SQL\r
- * @return bool\r
- */\r
- function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)\r
- {\r
- $sql = 'CREATE TABLE ';\r
- \r
- if ($if_not_exists === TRUE)\r
- {\r
- $sql .= 'IF NOT EXISTS ';\r
- }\r
- \r
- $sql .= $this->db->_escape_identifiers($table)." (";\r
- $current_field_count = 0;\r
-\r
- foreach ($fields as $field=>$attributes)\r
- {\r
- // Numeric field names aren't allowed in databases, so if the key is\r
- // numeric, we know it was assigned by PHP and the developer manually\r
- // entered the field information, so we'll simply add it to the list\r
- if (is_numeric($field))\r
- {\r
- $sql .= "\n\t$attributes";\r
- }\r
- else\r
- {\r
- $attributes = array_change_key_case($attributes, CASE_UPPER);\r
- \r
- $sql .= "\n\t".$this->db->_protect_identifiers($field);\r
- \r
- $sql .= ' '.$attributes['TYPE'];\r
- \r
- if (array_key_exists('CONSTRAINT', $attributes))\r
- {\r
- $sql .= '('.$attributes['CONSTRAINT'].')';\r
- }\r
- \r
- if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)\r
- {\r
- $sql .= ' UNSIGNED';\r
- }\r
- \r
- if (array_key_exists('DEFAULT', $attributes))\r
- {\r
- $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';\r
- }\r
- \r
- if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)\r
- {\r
- $sql .= ' NULL';\r
- }\r
- else\r
- {\r
- $sql .= ' NOT NULL'; \r
- }\r
- \r
- if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)\r
- {\r
- $sql .= ' AUTO_INCREMENT';\r
- }\r
- }\r
- \r
- // don't add a comma on the end of the last field\r
- if (++$current_field_count < count($fields))\r
- {\r
- $sql .= ',';\r
- }\r
- }\r
-\r
- if (count($primary_keys) > 0)\r
- {\r
- $primary_keys = $this->db->_protect_identifiers($primary_keys);\r
- $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";\r
- }\r
- \r
- if (is_array($keys) && count($keys) > 0)\r
- {\r
- foreach ($keys as $key)\r
- {\r
- if (is_array($key))\r
- {\r
- $key = $this->db->_protect_identifiers($key); \r
- }\r
- else\r
- {\r
- $key = array($this->db->_protect_identifiers($key));\r
- }\r
- \r
- $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";\r
- }\r
- }\r
-\r
- $sql .= "\n);";\r
-\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop Table\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _drop_table($table)\r
- {\r
- return "DROP TABLE ".$this->db->_escape_identifiers($table)." CASCADE";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Alter table query\r
- *\r
- * Generates a platform-specific query so that a table can be altered\r
- * Called by add_column(), drop_column(), and column_alter(),\r
- *\r
- * @access private\r
- * @param string the ALTER type (ADD, DROP, CHANGE)\r
- * @param string the column name\r
- * @param string the table name\r
- * @param string the column definition\r
- * @param string the default value\r
- * @param boolean should 'NOT NULL' be added\r
- * @param string the field after which we should add the new field\r
- * @return object\r
- */\r
- function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);\r
-\r
- // DROP has everything it needs now.\r
- if ($alter_type == 'DROP')\r
- {\r
- return $sql;\r
- }\r
-\r
- $sql .= " $column_definition";\r
-\r
- if ($default_value != '')\r
- {\r
- $sql .= " DEFAULT \"$default_value\"";\r
- }\r
-\r
- if ($null === NULL)\r
- {\r
- $sql .= ' NULL';\r
- }\r
- else\r
- {\r
- $sql .= ' NOT NULL';\r
- }\r
-\r
- if ($after_field != '')\r
- {\r
- $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);\r
- }\r
- \r
- return $sql;\r
- \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rename a table\r
- *\r
- * Generates a platform-specific query so that a table can be renamed\r
- *\r
- * @access private\r
- * @param string the old table name\r
- * @param string the new table name\r
- * @return string\r
- */\r
- function _rename_table($table_name, $new_table_name)\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);\r
- return $sql;\r
- }\r
-\r
-\r
-}\r
-\r
-/* End of file postgre_forge.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Postgre Forge Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_postgre_forge extends CI_DB_forge {
+
+ /**
+ * Create database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database($name)
+ {
+ return "CREATE DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ return "DROP DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create Table
+ *
+ * @access private
+ * @param string the table name
+ * @param array the fields
+ * @param mixed primary key(s)
+ * @param mixed key(s)
+ * @param boolean should 'IF NOT EXISTS' be added to the SQL
+ * @return bool
+ */
+ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+ {
+ $sql = 'CREATE TABLE ';
+
+ if ($if_not_exists === TRUE)
+ {
+ $sql .= 'IF NOT EXISTS ';
+ }
+
+ $sql .= $this->db->_escape_identifiers($table)." (";
+ $current_field_count = 0;
+
+ foreach ($fields as $field=>$attributes)
+ {
+ // Numeric field names aren't allowed in databases, so if the key is
+ // numeric, we know it was assigned by PHP and the developer manually
+ // entered the field information, so we'll simply add it to the list
+ if (is_numeric($field))
+ {
+ $sql .= "\n\t$attributes";
+ }
+ else
+ {
+ $attributes = array_change_key_case($attributes, CASE_UPPER);
+
+ $sql .= "\n\t".$this->db->_protect_identifiers($field);
+
+ $sql .= ' '.$attributes['TYPE'];
+
+ if (array_key_exists('CONSTRAINT', $attributes))
+ {
+ $sql .= '('.$attributes['CONSTRAINT'].')';
+ }
+
+ if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+ {
+ $sql .= ' UNSIGNED';
+ }
+
+ if (array_key_exists('DEFAULT', $attributes))
+ {
+ $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+ }
+
+ if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
+ {
+ $sql .= ' NULL';
+ }
+ else
+ {
+ $sql .= ' NOT NULL';
+ }
+
+ if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+ {
+ $sql .= ' AUTO_INCREMENT';
+ }
+ }
+
+ // don't add a comma on the end of the last field
+ if (++$current_field_count < count($fields))
+ {
+ $sql .= ',';
+ }
+ }
+
+ if (count($primary_keys) > 0)
+ {
+ $primary_keys = $this->db->_protect_identifiers($primary_keys);
+ $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
+ }
+
+ if (is_array($keys) && count($keys) > 0)
+ {
+ foreach ($keys as $key)
+ {
+ if (is_array($key))
+ {
+ $key = $this->db->_protect_identifiers($key);
+ }
+ else
+ {
+ $key = array($this->db->_protect_identifiers($key));
+ }
+
+ $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")";
+ }
+ }
+
+ $sql .= "\n);";
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop Table
+ *
+ * @access private
+ * @return bool
+ */
+ function _drop_table($table)
+ {
+ return "DROP TABLE ".$this->db->_escape_identifiers($table)." CASCADE";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alter table query
+ *
+ * Generates a platform-specific query so that a table can be altered
+ * Called by add_column(), drop_column(), and column_alter(),
+ *
+ * @access private
+ * @param string the ALTER type (ADD, DROP, CHANGE)
+ * @param string the column name
+ * @param string the table name
+ * @param string the column definition
+ * @param string the default value
+ * @param boolean should 'NOT NULL' be added
+ * @param string the field after which we should add the new field
+ * @return object
+ */
+ function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
+
+ // DROP has everything it needs now.
+ if ($alter_type == 'DROP')
+ {
+ return $sql;
+ }
+
+ $sql .= " $column_definition";
+
+ if ($default_value != '')
+ {
+ $sql .= " DEFAULT \"$default_value\"";
+ }
+
+ if ($null === NULL)
+ {
+ $sql .= ' NULL';
+ }
+ else
+ {
+ $sql .= ' NOT NULL';
+ }
+
+ if ($after_field != '')
+ {
+ $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+ }
+
+ return $sql;
+
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rename a table
+ *
+ * Generates a platform-specific query so that a table can be renamed
+ *
+ * @access private
+ * @param string the old table name
+ * @param string the new table name
+ * @return string
+ */
+ function _rename_table($table_name, $new_table_name)
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+ return $sql;
+ }
+
+
+}
+
+/* End of file postgre_forge.php */
/* Location: ./system/database/drivers/postgre/postgre_forge.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Postgres Result Class\r
- *\r
- * This class extends the parent result class: CI_DB_result\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_postgre_result extends CI_DB_result {\r
-\r
- /**\r
- * Number of rows in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_rows()\r
- {\r
- return @pg_num_rows($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Number of fields in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_fields()\r
- {\r
- return @pg_num_fields($this->result_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch Field Names\r
- *\r
- * Generates an array of column names\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function list_fields()\r
- {\r
- $field_names = array();\r
- for ($i = 0; $i < $this->num_fields(); $i++)\r
- {\r
- $field_names[] = pg_field_name($this->result_id, $i);\r
- }\r
- \r
- return $field_names;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data\r
- *\r
- * Generates an array of objects containing field meta-data\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function field_data()\r
- {\r
- $retval = array();\r
- for ($i = 0; $i < $this->num_fields(); $i++)\r
- {\r
- $F = new stdClass();\r
- $F->name = pg_field_name($this->result_id, $i);\r
- $F->type = pg_field_type($this->result_id, $i);\r
- $F->max_length = pg_field_size($this->result_id, $i);\r
- $F->primary_key = 0;\r
- $F->default = '';\r
-\r
- $retval[] = $F;\r
- }\r
- \r
- return $retval;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Free the result\r
- *\r
- * @return null\r
- */ \r
- function free_result()\r
- {\r
- if (is_resource($this->result_id))\r
- {\r
- pg_free_result($this->result_id);\r
- $this->result_id = FALSE;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Data Seek\r
- *\r
- * Moves the internal pointer to the desired offset. We call\r
- * this internally before fetching results to make sure the\r
- * result set starts at zero\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _data_seek($n = 0)\r
- {\r
- return pg_result_seek($this->result_id, $n);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - associative array\r
- *\r
- * Returns the result set as an array\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _fetch_assoc()\r
- {\r
- return pg_fetch_assoc($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - object\r
- *\r
- * Returns the result set as an object\r
- *\r
- * @access private\r
- * @return object\r
- */\r
- function _fetch_object()\r
- {\r
- return pg_fetch_object($this->result_id);\r
- }\r
- \r
-}\r
-\r
-\r
-/* End of file postgre_result.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Postgres Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_postgre_result extends CI_DB_result {
+
+ /**
+ * Number of rows in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_rows()
+ {
+ return @pg_num_rows($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Number of fields in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_fields()
+ {
+ return @pg_num_fields($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch Field Names
+ *
+ * Generates an array of column names
+ *
+ * @access public
+ * @return array
+ */
+ function list_fields()
+ {
+ $field_names = array();
+ for ($i = 0; $i < $this->num_fields(); $i++)
+ {
+ $field_names[] = pg_field_name($this->result_id, $i);
+ }
+
+ return $field_names;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data
+ *
+ * Generates an array of objects containing field meta-data
+ *
+ * @access public
+ * @return array
+ */
+ function field_data()
+ {
+ $retval = array();
+ for ($i = 0; $i < $this->num_fields(); $i++)
+ {
+ $F = new stdClass();
+ $F->name = pg_field_name($this->result_id, $i);
+ $F->type = pg_field_type($this->result_id, $i);
+ $F->max_length = pg_field_size($this->result_id, $i);
+ $F->primary_key = 0;
+ $F->default = '';
+
+ $retval[] = $F;
+ }
+
+ return $retval;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Free the result
+ *
+ * @return null
+ */
+ function free_result()
+ {
+ if (is_resource($this->result_id))
+ {
+ pg_free_result($this->result_id);
+ $this->result_id = FALSE;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Data Seek
+ *
+ * Moves the internal pointer to the desired offset. We call
+ * this internally before fetching results to make sure the
+ * result set starts at zero
+ *
+ * @access private
+ * @return array
+ */
+ function _data_seek($n = 0)
+ {
+ return pg_result_seek($this->result_id, $n);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - associative array
+ *
+ * Returns the result set as an array
+ *
+ * @access private
+ * @return array
+ */
+ function _fetch_assoc()
+ {
+ return pg_fetch_assoc($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - object
+ *
+ * Returns the result set as an object
+ *
+ * @access private
+ * @return object
+ */
+ function _fetch_object()
+ {
+ return pg_fetch_object($this->result_id);
+ }
+
+}
+
+
+/* End of file postgre_result.php */
/* Location: ./system/database/drivers/postgre/postgre_result.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Postgre Utility Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_postgre_utility extends CI_DB_utility {\r
-\r
- /**\r
- * List databases\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _list_databases()\r
- {\r
- return "SELECT datname FROM pg_database";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Optimize table query\r
- *\r
- * Is table optimization supported in Postgre?\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _optimize_table($table)\r
- {\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Repair table query\r
- *\r
- * Are table repairs supported in Postgre?\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _repair_table($table)\r
- {\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Postgre Export\r
- *\r
- * @access private\r
- * @param array Preferences\r
- * @return mixed\r
- */\r
- function _backup($params = array())\r
- {\r
- // Currently unsupported\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
-\r
- /**\r
- *\r
- * The functions below have been deprecated as of 1.6, and are only here for backwards\r
- * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation\r
- * is STRONGLY discouraged in favour if using dbforge.\r
- *\r
- */\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database($name)\r
- {\r
- return "CREATE DATABASE ".$name;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- return "DROP DATABASE ".$name;\r
- }\r
-\r
-\r
-}\r
-\r
-\r
-/* End of file postgre_utility.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Postgre Utility Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_postgre_utility extends CI_DB_utility {
+
+ /**
+ * List databases
+ *
+ * @access private
+ * @return bool
+ */
+ function _list_databases()
+ {
+ return "SELECT datname FROM pg_database";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Optimize table query
+ *
+ * Is table optimization supported in Postgre?
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _optimize_table($table)
+ {
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Repair table query
+ *
+ * Are table repairs supported in Postgre?
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _repair_table($table)
+ {
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Postgre Export
+ *
+ * @access private
+ * @param array Preferences
+ * @return mixed
+ */
+ function _backup($params = array())
+ {
+ // Currently unsupported
+ return $this->db->display_error('db_unsuported_feature');
+ }
+
+ /**
+ *
+ * The functions below have been deprecated as of 1.6, and are only here for backwards
+ * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation
+ * is STRONGLY discouraged in favour if using dbforge.
+ *
+ */
+
+ /**
+ * Create database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database($name)
+ {
+ return "CREATE DATABASE ".$name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ return "DROP DATABASE ".$name;
+ }
+
+
+}
+
+
+/* End of file postgre_utility.php */
/* Location: ./system/database/drivers/postgre/postgre_utility.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-\r
-\r
-/**\r
- * SQLite Database Adapter Class\r
- *\r
- * Note: _DB is an extender class that the app controller\r
- * creates dynamically based on whether the active record\r
- * class is being used or not.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Drivers\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_sqlite_driver extends CI_DB {\r
-\r
- var $dbdriver = 'sqlite';\r
- \r
- // The character used to escape with - not needed for SQLite\r
- var $_escape_char = '';\r
-\r
- /**\r
- * The syntax to count rows is slightly different across different\r
- * database engines, so this string appears in each driver and is\r
- * used for the count_all() and count_all_results() functions.\r
- */\r
- var $_count_string = "SELECT COUNT(*) AS ";\r
- var $_random_keyword = ' Random()'; // database specific random keyword\r
-\r
- /**\r
- * Non-persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_connect()\r
- {\r
- if ( ! $conn_id = @sqlite_open($this->database, FILE_WRITE_MODE, $error))\r
- {\r
- log_message('error', $error);\r
- \r
- if ($this->db_debug)\r
- {\r
- $this->display_error($error, '', TRUE);\r
- }\r
- \r
- return FALSE;\r
- }\r
- \r
- return $conn_id;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Persistent database connection\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_pconnect()\r
- {\r
- if ( ! $conn_id = @sqlite_popen($this->database, FILE_WRITE_MODE, $error))\r
- {\r
- log_message('error', $error);\r
- \r
- if ($this->db_debug)\r
- {\r
- $this->display_error($error, '', TRUE);\r
- }\r
- \r
- return FALSE;\r
- }\r
- \r
- return $conn_id;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Select the database\r
- *\r
- * @access private called by the base class\r
- * @return resource\r
- */ \r
- function db_select()\r
- {\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set client character set\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return resource\r
- */\r
- function db_set_charset($charset, $collation)\r
- {\r
- // @todo - add support if needed\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Version number query string\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function _version()\r
- {\r
- return sqlite_libversion();\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Execute the query\r
- *\r
- * @access private called by the base class\r
- * @param string an SQL query\r
- * @return resource\r
- */ \r
- function _execute($sql)\r
- {\r
- $sql = $this->_prep_query($sql);\r
- return @sqlite_query($this->conn_id, $sql);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Prep the query\r
- *\r
- * If needed, each database adapter can prep the query string\r
- *\r
- * @access private called by execute()\r
- * @param string an SQL query\r
- * @return string\r
- */ \r
- function _prep_query($sql)\r
- {\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Begin Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_begin($test_mode = FALSE)\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
- \r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // Reset the transaction failure flag.\r
- // If the $test_mode flag is set to TRUE transactions will be rolled back\r
- // even if the queries produce a successful result.\r
- $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;\r
-\r
- $this->simple_query('BEGIN TRANSACTION');\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Commit Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_commit()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $this->simple_query('COMMIT');\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rollback Transaction\r
- *\r
- * @access public\r
- * @return bool \r
- */ \r
- function trans_rollback()\r
- {\r
- if ( ! $this->trans_enabled)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // When transactions are nested we only begin/commit/rollback the outermost ones\r
- if ($this->_trans_depth > 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- $this->simple_query('ROLLBACK');\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape String\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function escape_str($str) \r
- {\r
- return sqlite_escape_string($str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Affected Rows\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function affected_rows()\r
- {\r
- return sqlite_changes($this->conn_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Insert ID\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function insert_id()\r
- {\r
- return @sqlite_last_insert_rowid($this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * "Count All" query\r
- *\r
- * Generates a platform-specific query string that counts all records in\r
- * the specified database\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function count_all($table = '')\r
- {\r
- if ($table == '')\r
- return '0';\r
- \r
- $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));\r
- \r
- if ($query->num_rows() == 0)\r
- return '0';\r
-\r
- $row = $query->row();\r
- return $row->numrows;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * List table query\r
- *\r
- * Generates a platform-specific query string so that the table names can be fetched\r
- *\r
- * @access private\r
- * @param boolean\r
- * @return string\r
- */\r
- function _list_tables($prefix_limit = FALSE)\r
- {\r
- $sql = "SELECT name from sqlite_master WHERE type='table'";\r
-\r
- if ($prefix_limit !== FALSE AND $this->dbprefix != '')\r
- {\r
- $sql .= " AND 'name' LIKE '".$this->dbprefix."%'";\r
- }\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Show column query\r
- *\r
- * Generates a platform-specific query string so that the column names can be fetched\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */\r
- function _list_columns($table = '')\r
- {\r
- // Not supported\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data query\r
- *\r
- * Generates a platform-specific query so that the column data can be retrieved\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _field_data($table)\r
- {\r
- return "SELECT * FROM ".$table." LIMIT 1";\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message string\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _error_message()\r
- {\r
- return sqlite_error_string(sqlite_last_error($this->conn_id));\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * The error message number\r
- *\r
- * @access private\r
- * @return integer\r
- */\r
- function _error_number()\r
- {\r
- return sqlite_last_error($this->conn_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Escape the SQL Identifiers\r
- *\r
- * This function escapes column and table names\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _escape_identifiers($item)\r
- {\r
- if ($this->_escape_char == '')\r
- {\r
- return $item;\r
- }\r
- \r
- if (strpos($item, '.') !== FALSE)\r
- {\r
- $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; \r
- }\r
- else\r
- {\r
- $str = $this->_escape_char.$item.$this->_escape_char;\r
- }\r
- \r
- // remove duplicates if the user already included the escape\r
- return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * From Tables\r
- *\r
- * This function implicitly groups FROM tables so there is no confusion\r
- * about operator precedence in harmony with SQL standards\r
- *\r
- * @access public\r
- * @param type\r
- * @return type\r
- */\r
- function _from_tables($tables)\r
- {\r
- if ( ! is_array($tables))\r
- {\r
- $tables = array($tables);\r
- }\r
- \r
- return '('.implode(', ', $tables).')';\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Insert statement\r
- *\r
- * Generates a platform-specific insert string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the insert keys\r
- * @param array the insert values\r
- * @return string\r
- */\r
- function _insert($table, $keys, $values)\r
- { \r
- return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Update statement\r
- *\r
- * Generates a platform-specific update string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the update data\r
- * @param array the where clause\r
- * @param array the orderby clause\r
- * @param array the limit clause\r
- * @return string\r
- */\r
- function _update($table, $values, $where, $orderby = array(), $limit = FALSE)\r
- {\r
- foreach($values as $key => $val)\r
- {\r
- $valstr[] = $key." = ".$val;\r
- }\r
- \r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';\r
- \r
- $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);\r
-\r
- $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';\r
-\r
- $sql .= $orderby.$limit;\r
- \r
- return $sql;\r
- }\r
-\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Truncate statement\r
- *\r
- * Generates a platform-specific truncate string from the supplied data\r
- * If the database does not support the truncate() command\r
- * This function maps to "DELETE FROM table"\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @return string\r
- */ \r
- function _truncate($table)\r
- {\r
- return $this->_delete($table);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete statement\r
- *\r
- * Generates a platform-specific delete string from the supplied data\r
- *\r
- * @access public\r
- * @param string the table name\r
- * @param array the where clause\r
- * @param string the limit clause\r
- * @return string\r
- */ \r
- function _delete($table, $where = array(), $like = array(), $limit = FALSE)\r
- {\r
- $conditions = '';\r
-\r
- if (count($where) > 0 OR count($like) > 0)\r
- {\r
- $conditions = "\nWHERE ";\r
- $conditions .= implode("\n", $this->ar_where);\r
-\r
- if (count($where) > 0 && count($like) > 0)\r
- {\r
- $conditions .= " AND ";\r
- }\r
- $conditions .= implode("\n", $like);\r
- }\r
-\r
- $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;\r
- \r
- return "DELETE FROM ".$table.$conditions.$limit;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Limit string\r
- *\r
- * Generates a platform-specific LIMIT clause\r
- *\r
- * @access public\r
- * @param string the sql query string\r
- * @param integer the number of rows to limit the query to\r
- * @param integer the offset value\r
- * @return string\r
- */\r
- function _limit($sql, $limit, $offset)\r
- { \r
- if ($offset == 0)\r
- {\r
- $offset = '';\r
- }\r
- else\r
- {\r
- $offset .= ", ";\r
- }\r
- \r
- return $sql."LIMIT ".$offset.$limit;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Close DB Connection\r
- *\r
- * @access public\r
- * @param resource\r
- * @return void\r
- */\r
- function _close($conn_id)\r
- {\r
- @sqlite_close($conn_id);\r
- }\r
-\r
-\r
-}\r
-\r
-\r
-/* End of file sqlite_driver.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+
+
+/**
+ * SQLite Database Adapter Class
+ *
+ * Note: _DB is an extender class that the app controller
+ * creates dynamically based on whether the active record
+ * class is being used or not.
+ *
+ * @package CodeIgniter
+ * @subpackage Drivers
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_sqlite_driver extends CI_DB {
+
+ var $dbdriver = 'sqlite';
+
+ // The character used to escape with - not needed for SQLite
+ var $_escape_char = '';
+
+ /**
+ * The syntax to count rows is slightly different across different
+ * database engines, so this string appears in each driver and is
+ * used for the count_all() and count_all_results() functions.
+ */
+ var $_count_string = "SELECT COUNT(*) AS ";
+ var $_random_keyword = ' Random()'; // database specific random keyword
+
+ /**
+ * Non-persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_connect()
+ {
+ if ( ! $conn_id = @sqlite_open($this->database, FILE_WRITE_MODE, $error))
+ {
+ log_message('error', $error);
+
+ if ($this->db_debug)
+ {
+ $this->display_error($error, '', TRUE);
+ }
+
+ return FALSE;
+ }
+
+ return $conn_id;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Persistent database connection
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_pconnect()
+ {
+ if ( ! $conn_id = @sqlite_popen($this->database, FILE_WRITE_MODE, $error))
+ {
+ log_message('error', $error);
+
+ if ($this->db_debug)
+ {
+ $this->display_error($error, '', TRUE);
+ }
+
+ return FALSE;
+ }
+
+ return $conn_id;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Select the database
+ *
+ * @access private called by the base class
+ * @return resource
+ */
+ function db_select()
+ {
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set client character set
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return resource
+ */
+ function db_set_charset($charset, $collation)
+ {
+ // @todo - add support if needed
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Version number query string
+ *
+ * @access public
+ * @return string
+ */
+ function _version()
+ {
+ return sqlite_libversion();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Execute the query
+ *
+ * @access private called by the base class
+ * @param string an SQL query
+ * @return resource
+ */
+ function _execute($sql)
+ {
+ $sql = $this->_prep_query($sql);
+ return @sqlite_query($this->conn_id, $sql);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep the query
+ *
+ * If needed, each database adapter can prep the query string
+ *
+ * @access private called by execute()
+ * @param string an SQL query
+ * @return string
+ */
+ function _prep_query($sql)
+ {
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Begin Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_begin($test_mode = FALSE)
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ // Reset the transaction failure flag.
+ // If the $test_mode flag is set to TRUE transactions will be rolled back
+ // even if the queries produce a successful result.
+ $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
+
+ $this->simple_query('BEGIN TRANSACTION');
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Commit Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_commit()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $this->simple_query('COMMIT');
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rollback Transaction
+ *
+ * @access public
+ * @return bool
+ */
+ function trans_rollback()
+ {
+ if ( ! $this->trans_enabled)
+ {
+ return TRUE;
+ }
+
+ // When transactions are nested we only begin/commit/rollback the outermost ones
+ if ($this->_trans_depth > 0)
+ {
+ return TRUE;
+ }
+
+ $this->simple_query('ROLLBACK');
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape String
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function escape_str($str)
+ {
+ return sqlite_escape_string($str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Affected Rows
+ *
+ * @access public
+ * @return integer
+ */
+ function affected_rows()
+ {
+ return sqlite_changes($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert ID
+ *
+ * @access public
+ * @return integer
+ */
+ function insert_id()
+ {
+ return @sqlite_last_insert_rowid($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * "Count All" query
+ *
+ * Generates a platform-specific query string that counts all records in
+ * the specified database
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function count_all($table = '')
+ {
+ if ($table == '')
+ return '0';
+
+ $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE));
+
+ if ($query->num_rows() == 0)
+ return '0';
+
+ $row = $query->row();
+ return $row->numrows;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * List table query
+ *
+ * Generates a platform-specific query string so that the table names can be fetched
+ *
+ * @access private
+ * @param boolean
+ * @return string
+ */
+ function _list_tables($prefix_limit = FALSE)
+ {
+ $sql = "SELECT name from sqlite_master WHERE type='table'";
+
+ if ($prefix_limit !== FALSE AND $this->dbprefix != '')
+ {
+ $sql .= " AND 'name' LIKE '".$this->dbprefix."%'";
+ }
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show column query
+ *
+ * Generates a platform-specific query string so that the column names can be fetched
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _list_columns($table = '')
+ {
+ // Not supported
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data query
+ *
+ * Generates a platform-specific query so that the column data can be retrieved
+ *
+ * @access public
+ * @param string the table name
+ * @return object
+ */
+ function _field_data($table)
+ {
+ return "SELECT * FROM ".$table." LIMIT 1";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message string
+ *
+ * @access private
+ * @return string
+ */
+ function _error_message()
+ {
+ return sqlite_error_string(sqlite_last_error($this->conn_id));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * The error message number
+ *
+ * @access private
+ * @return integer
+ */
+ function _error_number()
+ {
+ return sqlite_last_error($this->conn_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Escape the SQL Identifiers
+ *
+ * This function escapes column and table names
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _escape_identifiers($item)
+ {
+ if ($this->_escape_char == '')
+ {
+ return $item;
+ }
+
+ if (strpos($item, '.') !== FALSE)
+ {
+ $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char;
+ }
+ else
+ {
+ $str = $this->_escape_char.$item.$this->_escape_char;
+ }
+
+ // remove duplicates if the user already included the escape
+ return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * From Tables
+ *
+ * This function implicitly groups FROM tables so there is no confusion
+ * about operator precedence in harmony with SQL standards
+ *
+ * @access public
+ * @param type
+ * @return type
+ */
+ function _from_tables($tables)
+ {
+ if ( ! is_array($tables))
+ {
+ $tables = array($tables);
+ }
+
+ return '('.implode(', ', $tables).')';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert statement
+ *
+ * Generates a platform-specific insert string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the insert keys
+ * @param array the insert values
+ * @return string
+ */
+ function _insert($table, $keys, $values)
+ {
+ return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Update statement
+ *
+ * Generates a platform-specific update string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the update data
+ * @param array the where clause
+ * @param array the orderby clause
+ * @param array the limit clause
+ * @return string
+ */
+ function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
+ {
+ foreach($values as $key => $val)
+ {
+ $valstr[] = $key." = ".$val;
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
+
+ $sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
+
+ $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
+
+ $sql .= $orderby.$limit;
+
+ return $sql;
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Truncate statement
+ *
+ * Generates a platform-specific truncate string from the supplied data
+ * If the database does not support the truncate() command
+ * This function maps to "DELETE FROM table"
+ *
+ * @access public
+ * @param string the table name
+ * @return string
+ */
+ function _truncate($table)
+ {
+ return $this->_delete($table);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete statement
+ *
+ * Generates a platform-specific delete string from the supplied data
+ *
+ * @access public
+ * @param string the table name
+ * @param array the where clause
+ * @param string the limit clause
+ * @return string
+ */
+ function _delete($table, $where = array(), $like = array(), $limit = FALSE)
+ {
+ $conditions = '';
+
+ if (count($where) > 0 OR count($like) > 0)
+ {
+ $conditions = "\nWHERE ";
+ $conditions .= implode("\n", $this->ar_where);
+
+ if (count($where) > 0 && count($like) > 0)
+ {
+ $conditions .= " AND ";
+ }
+ $conditions .= implode("\n", $like);
+ }
+
+ $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
+
+ return "DELETE FROM ".$table.$conditions.$limit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Limit string
+ *
+ * Generates a platform-specific LIMIT clause
+ *
+ * @access public
+ * @param string the sql query string
+ * @param integer the number of rows to limit the query to
+ * @param integer the offset value
+ * @return string
+ */
+ function _limit($sql, $limit, $offset)
+ {
+ if ($offset == 0)
+ {
+ $offset = '';
+ }
+ else
+ {
+ $offset .= ", ";
+ }
+
+ return $sql."LIMIT ".$offset.$limit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Close DB Connection
+ *
+ * @access public
+ * @param resource
+ * @return void
+ */
+ function _close($conn_id)
+ {
+ @sqlite_close($conn_id);
+ }
+
+
+}
+
+
+/* End of file sqlite_driver.php */
/* Location: ./system/database/drivers/sqlite/sqlite_driver.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * SQLite Forge Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_sqlite_forge extends CI_DB_forge {\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access public\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database()\r
- {\r
- // In SQLite, a database is created when you connect to the database.\r
- // We'll return TRUE so that an error isn't generated\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- if ( ! @file_exists($this->db->database) OR ! @unlink($this->db->database))\r
- {\r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unable_to_drop');\r
- }\r
- return FALSE;\r
- }\r
- return TRUE;\r
- }\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Create Table\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @param array the fields\r
- * @param mixed primary key(s)\r
- * @param mixed key(s)\r
- * @param boolean should 'IF NOT EXISTS' be added to the SQL\r
- * @return bool\r
- */\r
- function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)\r
- {\r
- $sql = 'CREATE TABLE ';\r
- \r
- // IF NOT EXISTS added to SQLite in 3.3.0\r
- if ($if_not_exists === TRUE && version_compare($this->_version(), '3.3.0', '>=') === TRUE)\r
- {\r
- $sql .= 'IF NOT EXISTS ';\r
- }\r
- \r
- $sql .= $this->db->_escape_identifiers($table)."(";\r
- $current_field_count = 0;\r
-\r
- foreach ($fields as $field=>$attributes)\r
- {\r
- // Numeric field names aren't allowed in databases, so if the key is\r
- // numeric, we know it was assigned by PHP and the developer manually\r
- // entered the field information, so we'll simply add it to the list\r
- if (is_numeric($field))\r
- {\r
- $sql .= "\n\t$attributes";\r
- }\r
- else\r
- {\r
- $attributes = array_change_key_case($attributes, CASE_UPPER);\r
- \r
- $sql .= "\n\t".$this->db->_protect_identifiers($field);\r
- \r
- $sql .= ' '.$attributes['TYPE'];\r
- \r
- if (array_key_exists('CONSTRAINT', $attributes))\r
- {\r
- $sql .= '('.$attributes['CONSTRAINT'].')';\r
- }\r
- \r
- if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)\r
- {\r
- $sql .= ' UNSIGNED';\r
- }\r
- \r
- if (array_key_exists('DEFAULT', $attributes))\r
- {\r
- $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';\r
- }\r
- \r
- if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)\r
- {\r
- $sql .= ' NULL';\r
- }\r
- else\r
- {\r
- $sql .= ' NOT NULL'; \r
- }\r
- \r
- if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)\r
- {\r
- $sql .= ' AUTO_INCREMENT';\r
- }\r
- }\r
- \r
- // don't add a comma on the end of the last field\r
- if (++$current_field_count < count($fields))\r
- {\r
- $sql .= ',';\r
- }\r
- }\r
-\r
- if (count($primary_keys) > 0)\r
- {\r
- $primary_keys = $this->db->_protect_identifiers($primary_keys);\r
- $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";\r
- }\r
-\r
- if (is_array($keys) && count($keys) > 0)\r
- {\r
- foreach ($keys as $key)\r
- {\r
- if (is_array($key))\r
- {\r
- $key = $this->db->_protect_identifiers($key); \r
- }\r
- else\r
- {\r
- $key = array($this->db->_protect_identifiers($key));\r
- }\r
- \r
- $sql .= ",\n\tUNIQUE (" . implode(', ', $key) . ")";\r
- }\r
- }\r
-\r
- $sql .= "\n)";\r
-\r
- return $sql;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop Table\r
- *\r
- * Unsupported feature in SQLite\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _drop_table($table)\r
- {\r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
- return array();\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Alter table query\r
- *\r
- * Generates a platform-specific query so that a table can be altered\r
- * Called by add_column(), drop_column(), and column_alter(),\r
- *\r
- * @access private\r
- * @param string the ALTER type (ADD, DROP, CHANGE)\r
- * @param string the column name\r
- * @param string the table name\r
- * @param string the column definition\r
- * @param string the default value\r
- * @param boolean should 'NOT NULL' be added\r
- * @param string the field after which we should add the new field\r
- * @return object\r
- */\r
- function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);\r
-\r
- // DROP has everything it needs now.\r
- if ($alter_type == 'DROP')\r
- {\r
- // SQLite does not support dropping columns\r
- // http://www.sqlite.org/omitted.html\r
- // http://www.sqlite.org/faq.html#q11\r
- return FALSE;\r
- }\r
-\r
- $sql .= " $column_definition";\r
-\r
- if ($default_value != '')\r
- {\r
- $sql .= " DEFAULT \"$default_value\"";\r
- }\r
-\r
- if ($null === NULL)\r
- {\r
- $sql .= ' NULL';\r
- }\r
- else\r
- {\r
- $sql .= ' NOT NULL';\r
- }\r
-\r
- if ($after_field != '')\r
- {\r
- $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);\r
- }\r
- \r
- return $sql;\r
- \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rename a table\r
- *\r
- * Generates a platform-specific query so that a table can be renamed\r
- *\r
- * @access private\r
- * @param string the old table name\r
- * @param string the new table name\r
- * @return string\r
- */\r
- function _rename_table($table_name, $new_table_name)\r
- {\r
- $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);\r
- return $sql;\r
- }\r
-}\r
-\r
-/* End of file sqlite_forge.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * SQLite Forge Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_sqlite_forge extends CI_DB_forge {
+
+ /**
+ * Create database
+ *
+ * @access public
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database()
+ {
+ // In SQLite, a database is created when you connect to the database.
+ // We'll return TRUE so that an error isn't generated
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ if ( ! @file_exists($this->db->database) OR ! @unlink($this->db->database))
+ {
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unable_to_drop');
+ }
+ return FALSE;
+ }
+ return TRUE;
+ }
+ // --------------------------------------------------------------------
+
+ /**
+ * Create Table
+ *
+ * @access private
+ * @param string the table name
+ * @param array the fields
+ * @param mixed primary key(s)
+ * @param mixed key(s)
+ * @param boolean should 'IF NOT EXISTS' be added to the SQL
+ * @return bool
+ */
+ function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
+ {
+ $sql = 'CREATE TABLE ';
+
+ // IF NOT EXISTS added to SQLite in 3.3.0
+ if ($if_not_exists === TRUE && version_compare($this->_version(), '3.3.0', '>=') === TRUE)
+ {
+ $sql .= 'IF NOT EXISTS ';
+ }
+
+ $sql .= $this->db->_escape_identifiers($table)."(";
+ $current_field_count = 0;
+
+ foreach ($fields as $field=>$attributes)
+ {
+ // Numeric field names aren't allowed in databases, so if the key is
+ // numeric, we know it was assigned by PHP and the developer manually
+ // entered the field information, so we'll simply add it to the list
+ if (is_numeric($field))
+ {
+ $sql .= "\n\t$attributes";
+ }
+ else
+ {
+ $attributes = array_change_key_case($attributes, CASE_UPPER);
+
+ $sql .= "\n\t".$this->db->_protect_identifiers($field);
+
+ $sql .= ' '.$attributes['TYPE'];
+
+ if (array_key_exists('CONSTRAINT', $attributes))
+ {
+ $sql .= '('.$attributes['CONSTRAINT'].')';
+ }
+
+ if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
+ {
+ $sql .= ' UNSIGNED';
+ }
+
+ if (array_key_exists('DEFAULT', $attributes))
+ {
+ $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
+ }
+
+ if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
+ {
+ $sql .= ' NULL';
+ }
+ else
+ {
+ $sql .= ' NOT NULL';
+ }
+
+ if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
+ {
+ $sql .= ' AUTO_INCREMENT';
+ }
+ }
+
+ // don't add a comma on the end of the last field
+ if (++$current_field_count < count($fields))
+ {
+ $sql .= ',';
+ }
+ }
+
+ if (count($primary_keys) > 0)
+ {
+ $primary_keys = $this->db->_protect_identifiers($primary_keys);
+ $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")";
+ }
+
+ if (is_array($keys) && count($keys) > 0)
+ {
+ foreach ($keys as $key)
+ {
+ if (is_array($key))
+ {
+ $key = $this->db->_protect_identifiers($key);
+ }
+ else
+ {
+ $key = array($this->db->_protect_identifiers($key));
+ }
+
+ $sql .= ",\n\tUNIQUE (" . implode(', ', $key) . ")";
+ }
+ }
+
+ $sql .= "\n)";
+
+ return $sql;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop Table
+ *
+ * Unsupported feature in SQLite
+ *
+ * @access private
+ * @return bool
+ */
+ function _drop_table($table)
+ {
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unsuported_feature');
+ }
+ return array();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alter table query
+ *
+ * Generates a platform-specific query so that a table can be altered
+ * Called by add_column(), drop_column(), and column_alter(),
+ *
+ * @access private
+ * @param string the ALTER type (ADD, DROP, CHANGE)
+ * @param string the column name
+ * @param string the table name
+ * @param string the column definition
+ * @param string the default value
+ * @param boolean should 'NOT NULL' be added
+ * @param string the field after which we should add the new field
+ * @return object
+ */
+ function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '')
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name);
+
+ // DROP has everything it needs now.
+ if ($alter_type == 'DROP')
+ {
+ // SQLite does not support dropping columns
+ // http://www.sqlite.org/omitted.html
+ // http://www.sqlite.org/faq.html#q11
+ return FALSE;
+ }
+
+ $sql .= " $column_definition";
+
+ if ($default_value != '')
+ {
+ $sql .= " DEFAULT \"$default_value\"";
+ }
+
+ if ($null === NULL)
+ {
+ $sql .= ' NULL';
+ }
+ else
+ {
+ $sql .= ' NOT NULL';
+ }
+
+ if ($after_field != '')
+ {
+ $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field);
+ }
+
+ return $sql;
+
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rename a table
+ *
+ * Generates a platform-specific query so that a table can be renamed
+ *
+ * @access private
+ * @param string the old table name
+ * @param string the new table name
+ * @return string
+ */
+ function _rename_table($table_name, $new_table_name)
+ {
+ $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name);
+ return $sql;
+ }
+}
+
+/* End of file sqlite_forge.php */
/* Location: ./system/database/drivers/sqlite/sqlite_forge.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * SQLite Result Class\r
- *\r
- * This class extends the parent result class: CI_DB_result\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_sqlite_result extends CI_DB_result {\r
- \r
- /**\r
- * Number of rows in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_rows()\r
- {\r
- return @sqlite_num_rows($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Number of fields in the result set\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function num_fields()\r
- {\r
- return @sqlite_num_fields($this->result_id);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch Field Names\r
- *\r
- * Generates an array of column names\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function list_fields()\r
- {\r
- $field_names = array();\r
- for ($i = 0; $i < $this->num_fields(); $i++)\r
- {\r
- $field_names[] = sqlite_field_name($this->result_id, $i);\r
- }\r
- \r
- return $field_names;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Field data\r
- *\r
- * Generates an array of objects containing field meta-data\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function field_data()\r
- {\r
- $retval = array();\r
- for ($i = 0; $i < $this->num_fields(); $i++)\r
- {\r
- $F = new stdClass();\r
- $F->name = sqlite_field_name($this->result_id, $i);\r
- $F->type = 'varchar';\r
- $F->max_length = 0;\r
- $F->primary_key = 0;\r
- $F->default = '';\r
-\r
- $retval[] = $F;\r
- }\r
- \r
- return $retval;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Free the result\r
- *\r
- * @return null\r
- */ \r
- function free_result()\r
- {\r
- // Not implemented in SQLite\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Data Seek\r
- *\r
- * Moves the internal pointer to the desired offset. We call\r
- * this internally before fetching results to make sure the\r
- * result set starts at zero\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _data_seek($n = 0)\r
- {\r
- return sqlite_seek($this->result_id, $n);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - associative array\r
- *\r
- * Returns the result set as an array\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _fetch_assoc()\r
- {\r
- return sqlite_fetch_array($this->result_id);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Result - object\r
- *\r
- * Returns the result set as an object\r
- *\r
- * @access private\r
- * @return object\r
- */\r
- function _fetch_object()\r
- {\r
- if (function_exists('sqlite_fetch_object'))\r
- {\r
- return sqlite_fetch_object($this->result_id);\r
- }\r
- else\r
- {\r
- $arr = sqlite_fetch_array($this->result_id, SQLITE_ASSOC);\r
- if (is_array($arr))\r
- {\r
- $obj = (object) $arr;\r
- return $obj;\r
- } else {\r
- return NULL;\r
- } \r
- }\r
- }\r
-\r
-}\r
-\r
-\r
-/* End of file sqlite_result.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * SQLite Result Class
+ *
+ * This class extends the parent result class: CI_DB_result
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_sqlite_result extends CI_DB_result {
+
+ /**
+ * Number of rows in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_rows()
+ {
+ return @sqlite_num_rows($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Number of fields in the result set
+ *
+ * @access public
+ * @return integer
+ */
+ function num_fields()
+ {
+ return @sqlite_num_fields($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch Field Names
+ *
+ * Generates an array of column names
+ *
+ * @access public
+ * @return array
+ */
+ function list_fields()
+ {
+ $field_names = array();
+ for ($i = 0; $i < $this->num_fields(); $i++)
+ {
+ $field_names[] = sqlite_field_name($this->result_id, $i);
+ }
+
+ return $field_names;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Field data
+ *
+ * Generates an array of objects containing field meta-data
+ *
+ * @access public
+ * @return array
+ */
+ function field_data()
+ {
+ $retval = array();
+ for ($i = 0; $i < $this->num_fields(); $i++)
+ {
+ $F = new stdClass();
+ $F->name = sqlite_field_name($this->result_id, $i);
+ $F->type = 'varchar';
+ $F->max_length = 0;
+ $F->primary_key = 0;
+ $F->default = '';
+
+ $retval[] = $F;
+ }
+
+ return $retval;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Free the result
+ *
+ * @return null
+ */
+ function free_result()
+ {
+ // Not implemented in SQLite
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Data Seek
+ *
+ * Moves the internal pointer to the desired offset. We call
+ * this internally before fetching results to make sure the
+ * result set starts at zero
+ *
+ * @access private
+ * @return array
+ */
+ function _data_seek($n = 0)
+ {
+ return sqlite_seek($this->result_id, $n);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - associative array
+ *
+ * Returns the result set as an array
+ *
+ * @access private
+ * @return array
+ */
+ function _fetch_assoc()
+ {
+ return sqlite_fetch_array($this->result_id);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result - object
+ *
+ * Returns the result set as an object
+ *
+ * @access private
+ * @return object
+ */
+ function _fetch_object()
+ {
+ if (function_exists('sqlite_fetch_object'))
+ {
+ return sqlite_fetch_object($this->result_id);
+ }
+ else
+ {
+ $arr = sqlite_fetch_array($this->result_id, SQLITE_ASSOC);
+ if (is_array($arr))
+ {
+ $obj = (object) $arr;
+ return $obj;
+ } else {
+ return NULL;
+ }
+ }
+ }
+
+}
+
+
+/* End of file sqlite_result.php */
/* Location: ./system/database/drivers/sqlite/sqlite_result.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * SQLite Utility Class\r
- *\r
- * @category Database\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/database/\r
- */\r
-class CI_DB_sqlite_utility extends CI_DB_utility {\r
-\r
- /**\r
- * List databases\r
- *\r
- * I don't believe you can do a database listing with SQLite\r
- * since each database is its own file. I suppose we could\r
- * try reading a directory looking for SQLite files, but\r
- * that doesn't seem like a terribly good idea\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _list_databases()\r
- {\r
- if ($this->db_debug)\r
- {\r
- return $this->display_error('db_unsuported_feature');\r
- }\r
- return array();\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Optimize table query\r
- *\r
- * Is optimization even supported in SQLite?\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _optimize_table($table)\r
- {\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Repair table query\r
- *\r
- * Are table repairs even supported in SQLite?\r
- *\r
- * @access private\r
- * @param string the table name\r
- * @return object\r
- */\r
- function _repair_table($table)\r
- {\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * SQLite Export\r
- *\r
- * @access private\r
- * @param array Preferences\r
- * @return mixed\r
- */\r
- function _backup($params = array())\r
- {\r
- // Currently unsupported\r
- return $this->db->display_error('db_unsuported_feature');\r
- }\r
-\r
- /**\r
- *\r
- * The functions below have been deprecated as of 1.6, and are only here for backwards\r
- * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation\r
- * is STRONGLY discouraged in favour if using dbforge.\r
- *\r
- */\r
-\r
- /**\r
- * Create database\r
- *\r
- * @access public\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _create_database()\r
- {\r
- // In SQLite, a database is created when you connect to the database.\r
- // We'll return TRUE so that an error isn't generated\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Drop database\r
- *\r
- * @access private\r
- * @param string the database name\r
- * @return bool\r
- */\r
- function _drop_database($name)\r
- {\r
- if ( ! @file_exists($this->db->database) OR ! @unlink($this->db->database))\r
- {\r
- if ($this->db->db_debug)\r
- {\r
- return $this->db->display_error('db_unable_to_drop');\r
- }\r
- return FALSE;\r
- }\r
- return TRUE;\r
- }\r
-\r
-}\r
-\r
-/* End of file sqlite_utility.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * SQLite Utility Class
+ *
+ * @category Database
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_sqlite_utility extends CI_DB_utility {
+
+ /**
+ * List databases
+ *
+ * I don't believe you can do a database listing with SQLite
+ * since each database is its own file. I suppose we could
+ * try reading a directory looking for SQLite files, but
+ * that doesn't seem like a terribly good idea
+ *
+ * @access private
+ * @return bool
+ */
+ function _list_databases()
+ {
+ if ($this->db_debug)
+ {
+ return $this->display_error('db_unsuported_feature');
+ }
+ return array();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Optimize table query
+ *
+ * Is optimization even supported in SQLite?
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _optimize_table($table)
+ {
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Repair table query
+ *
+ * Are table repairs even supported in SQLite?
+ *
+ * @access private
+ * @param string the table name
+ * @return object
+ */
+ function _repair_table($table)
+ {
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * SQLite Export
+ *
+ * @access private
+ * @param array Preferences
+ * @return mixed
+ */
+ function _backup($params = array())
+ {
+ // Currently unsupported
+ return $this->db->display_error('db_unsuported_feature');
+ }
+
+ /**
+ *
+ * The functions below have been deprecated as of 1.6, and are only here for backwards
+ * compatibility. They now reside in dbforge(). The use of dbutils for database manipulation
+ * is STRONGLY discouraged in favour if using dbforge.
+ *
+ */
+
+ /**
+ * Create database
+ *
+ * @access public
+ * @param string the database name
+ * @return bool
+ */
+ function _create_database()
+ {
+ // In SQLite, a database is created when you connect to the database.
+ // We'll return TRUE so that an error isn't generated
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Drop database
+ *
+ * @access private
+ * @param string the database name
+ * @return bool
+ */
+ function _drop_database($name)
+ {
+ if ( ! @file_exists($this->db->database) OR ! @unlink($this->db->database))
+ {
+ if ($this->db->db_debug)
+ {
+ return $this->db->display_error('db_unable_to_drop');
+ }
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+}
+
+/* End of file sqlite_utility.php */
/* Location: ./system/database/drivers/sqlite/sqlite_utility.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Array Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/array_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Element\r
- *\r
- * Lets you determine whether an array index is set and whether it has a value.\r
- * If the element is empty it returns FALSE (or whatever you specify as the default value.)\r
- *\r
- * @access public\r
- * @param string\r
- * @param array\r
- * @param mixed\r
- * @return mixed depends on what the array contains\r
- */ \r
-if ( ! function_exists('element'))\r
-{\r
- function element($item, $array, $default = FALSE)\r
- {\r
- if ( ! isset($array[$item]) OR $array[$item] == "")\r
- {\r
- return $default;\r
- }\r
-\r
- return $array[$item];\r
- } \r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Random Element - Takes an array as input and returns a random element\r
- *\r
- * @access public\r
- * @param array\r
- * @return mixed depends on what the array contains\r
- */ \r
-if ( ! function_exists('random_element'))\r
-{\r
- function random_element($array)\r
- {\r
- if ( ! is_array($array))\r
- {\r
- return $array;\r
- }\r
- return $array[array_rand($array)];\r
- } \r
-}\r
-\r
-\r
-/* End of file array_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Array Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/array_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Element
+ *
+ * Lets you determine whether an array index is set and whether it has a value.
+ * If the element is empty it returns FALSE (or whatever you specify as the default value.)
+ *
+ * @access public
+ * @param string
+ * @param array
+ * @param mixed
+ * @return mixed depends on what the array contains
+ */
+if ( ! function_exists('element'))
+{
+ function element($item, $array, $default = FALSE)
+ {
+ if ( ! isset($array[$item]) OR $array[$item] == "")
+ {
+ return $default;
+ }
+
+ return $array[$item];
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Random Element - Takes an array as input and returns a random element
+ *
+ * @access public
+ * @param array
+ * @return mixed depends on what the array contains
+ */
+if ( ! function_exists('random_element'))
+{
+ function random_element($array)
+ {
+ if ( ! is_array($array))
+ {
+ return $array;
+ }
+ return $array[array_rand($array)];
+ }
+}
+
+
+/* End of file array_helper.php */
/* Location: ./system/helpers/array_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Cookie Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/cookie_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Set cookie\r
- *\r
- * Accepts six parameter, or you can submit an associative\r
- * array in the first parameter containing all the values.\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string the value of the cookie\r
- * @param string the number of seconds until expiration\r
- * @param string the cookie domain. Usually: .yourdomain.com\r
- * @param string the cookie path\r
- * @param string the cookie prefix\r
- * @return void\r
- */\r
-if ( ! function_exists('set_cookie'))\r
-{\r
- function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '')\r
- {\r
- if (is_array($name))\r
- { \r
- foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'name') as $item)\r
- {\r
- if (isset($name[$item]))\r
- {\r
- $$item = $name[$item];\r
- }\r
- }\r
- }\r
- \r
- // Set the config file options\r
- $CI =& get_instance();\r
- \r
- if ($prefix == '' AND $CI->config->item('cookie_prefix') != '')\r
- {\r
- $prefix = $CI->config->item('cookie_prefix');\r
- }\r
- if ($domain == '' AND $CI->config->item('cookie_domain') != '')\r
- {\r
- $domain = $CI->config->item('cookie_domain');\r
- }\r
- if ($path == '/' AND $CI->config->item('cookie_path') != '/')\r
- {\r
- $path = $CI->config->item('cookie_path');\r
- }\r
- \r
- if ( ! is_numeric($expire))\r
- {\r
- $expire = time() - 86500;\r
- }\r
- else\r
- {\r
- if ($expire > 0)\r
- {\r
- $expire = time() + $expire;\r
- }\r
- else\r
- {\r
- $expire = 0;\r
- }\r
- }\r
- \r
- setcookie($prefix.$name, $value, $expire, $path, $domain, 0);\r
- }\r
-}\r
- \r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Fetch an item from the COOKIE array\r
- *\r
- * @access public\r
- * @param string\r
- * @param bool\r
- * @return mixed\r
- */\r
-if ( ! function_exists('get_cookie'))\r
-{\r
- function get_cookie($index = '', $xss_clean = FALSE)\r
- {\r
- $CI =& get_instance();\r
- return $CI->input->cookie($index, $xss_clean);\r
- }\r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Delete a COOKIE\r
- *\r
- * @param mixed\r
- * @param string the cookie domain. Usually: .yourdomain.com\r
- * @param string the cookie path\r
- * @param string the cookie prefix\r
- * @return void\r
- */\r
-if ( ! function_exists('delete_cookie'))\r
-{\r
- function delete_cookie($name = '', $domain = '', $path = '/', $prefix = '')\r
- {\r
- set_cookie($name, '', '', $domain, $path, $prefix);\r
- }\r
-}\r
-\r
-\r
-/* End of file cookie_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Cookie Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/cookie_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Set cookie
+ *
+ * Accepts six parameter, or you can submit an associative
+ * array in the first parameter containing all the values.
+ *
+ * @access public
+ * @param mixed
+ * @param string the value of the cookie
+ * @param string the number of seconds until expiration
+ * @param string the cookie domain. Usually: .yourdomain.com
+ * @param string the cookie path
+ * @param string the cookie prefix
+ * @return void
+ */
+if ( ! function_exists('set_cookie'))
+{
+ function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '')
+ {
+ if (is_array($name))
+ {
+ foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'name') as $item)
+ {
+ if (isset($name[$item]))
+ {
+ $$item = $name[$item];
+ }
+ }
+ }
+
+ // Set the config file options
+ $CI =& get_instance();
+
+ if ($prefix == '' AND $CI->config->item('cookie_prefix') != '')
+ {
+ $prefix = $CI->config->item('cookie_prefix');
+ }
+ if ($domain == '' AND $CI->config->item('cookie_domain') != '')
+ {
+ $domain = $CI->config->item('cookie_domain');
+ }
+ if ($path == '/' AND $CI->config->item('cookie_path') != '/')
+ {
+ $path = $CI->config->item('cookie_path');
+ }
+
+ if ( ! is_numeric($expire))
+ {
+ $expire = time() - 86500;
+ }
+ else
+ {
+ if ($expire > 0)
+ {
+ $expire = time() + $expire;
+ }
+ else
+ {
+ $expire = 0;
+ }
+ }
+
+ setcookie($prefix.$name, $value, $expire, $path, $domain, 0);
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Fetch an item from the COOKIE array
+ *
+ * @access public
+ * @param string
+ * @param bool
+ * @return mixed
+ */
+if ( ! function_exists('get_cookie'))
+{
+ function get_cookie($index = '', $xss_clean = FALSE)
+ {
+ $CI =& get_instance();
+ return $CI->input->cookie($index, $xss_clean);
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Delete a COOKIE
+ *
+ * @param mixed
+ * @param string the cookie domain. Usually: .yourdomain.com
+ * @param string the cookie path
+ * @param string the cookie prefix
+ * @return void
+ */
+if ( ! function_exists('delete_cookie'))
+{
+ function delete_cookie($name = '', $domain = '', $path = '/', $prefix = '')
+ {
+ set_cookie($name, '', '', $domain, $path, $prefix);
+ }
+}
+
+
+/* End of file cookie_helper.php */
/* Location: ./system/helpers/cookie_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Date Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/date_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Get "now" time\r
- *\r
- * Returns time() or its GMT equivalent based on the config file preference\r
- *\r
- * @access public\r
- * @return integer\r
- */ \r
-if ( ! function_exists('now'))\r
-{\r
- function now()\r
- {\r
- $CI =& get_instance();\r
- \r
- if (strtolower($CI->config->item('time_reference')) == 'gmt')\r
- {\r
- $now = time();\r
- $system_time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now));\r
- \r
- if (strlen($system_time) < 10)\r
- {\r
- $system_time = time();\r
- log_message('error', 'The Date class could not set a proper GMT timestamp so the local time() value was used.');\r
- }\r
- \r
- return $system_time;\r
- }\r
- else\r
- {\r
- return time();\r
- }\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Convert MySQL Style Datecodes\r
- *\r
- * This function is identical to PHPs date() function,\r
- * except that it allows date codes to be formatted using\r
- * the MySQL style, where each code letter is preceded\r
- * with a percent sign: %Y %m %d etc...\r
- *\r
- * The benefit of doing dates this way is that you don't\r
- * have to worry about escaping your text letters that\r
- * match the date codes.\r
- *\r
- * @access public\r
- * @param string\r
- * @param integer\r
- * @return integer\r
- */ \r
-if ( ! function_exists('mdate'))\r
-{\r
- function mdate($datestr = '', $time = '')\r
- {\r
- if ($datestr == '')\r
- return '';\r
- \r
- if ($time == '')\r
- $time = now();\r
- \r
- $datestr = str_replace('%\\', '', preg_replace("/([a-z]+?){1}/i", "\\\\\\1", $datestr));\r
- return date($datestr, $time);\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Standard Date\r
- *\r
- * Returns a date formatted according to the submitted standard.\r
- *\r
- * @access public\r
- * @param string the chosen format\r
- * @param integer Unix timestamp\r
- * @return string\r
- */ \r
-if ( ! function_exists('standard_date'))\r
-{\r
- function standard_date($fmt = 'DATE_RFC822', $time = '')\r
- {\r
- $formats = array(\r
- 'DATE_ATOM' => '%Y-%m-%dT%H:%i:%s%Q',\r
- 'DATE_COOKIE' => '%l, %d-%M-%y %H:%i:%s UTC',\r
- 'DATE_ISO8601' => '%Y-%m-%dT%H:%i:%s%O',\r
- 'DATE_RFC822' => '%D, %d %M %y %H:%i:%s %O',\r
- 'DATE_RFC850' => '%l, %d-%M-%y %H:%m:%i UTC',\r
- 'DATE_RFC1036' => '%D, %d %M %y %H:%i:%s %O',\r
- 'DATE_RFC1123' => '%D, %d %M %Y %H:%i:%s %O',\r
- 'DATE_RSS' => '%D, %d %M %Y %H:%i:%s %O',\r
- 'DATE_W3C' => '%Y-%m-%dT%H:%i:%s%Q'\r
- );\r
-\r
- if ( ! isset($formats[$fmt]))\r
- {\r
- return FALSE;\r
- }\r
- \r
- return mdate($formats[$fmt], $time);\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Timespan\r
- *\r
- * Returns a span of seconds in this format:\r
- * 10 days 14 hours 36 minutes 47 seconds\r
- *\r
- * @access public\r
- * @param integer a number of seconds\r
- * @param integer Unix timestamp\r
- * @return integer\r
- */ \r
-if ( ! function_exists('timespan'))\r
-{\r
- function timespan($seconds = 1, $time = '')\r
- {\r
- $CI =& get_instance();\r
- $CI->lang->load('date');\r
-\r
- if ( ! is_numeric($seconds))\r
- {\r
- $seconds = 1;\r
- }\r
- \r
- if ( ! is_numeric($time))\r
- {\r
- $time = time();\r
- }\r
- \r
- if ($time <= $seconds)\r
- {\r
- $seconds = 1;\r
- }\r
- else\r
- {\r
- $seconds = $time - $seconds;\r
- }\r
- \r
- $str = '';\r
- $years = floor($seconds / 31536000);\r
- \r
- if ($years > 0)\r
- { \r
- $str .= $years.' '.$CI->lang->line((($years > 1) ? 'date_years' : 'date_year')).', ';\r
- } \r
- \r
- $seconds -= $years * 31536000;\r
- $months = floor($seconds / 2628000);\r
- \r
- if ($years > 0 OR $months > 0)\r
- {\r
- if ($months > 0)\r
- { \r
- $str .= $months.' '.$CI->lang->line((($months > 1) ? 'date_months' : 'date_month')).', ';\r
- } \r
- \r
- $seconds -= $months * 2628000;\r
- }\r
-\r
- $weeks = floor($seconds / 604800);\r
- \r
- if ($years > 0 OR $months > 0 OR $weeks > 0)\r
- {\r
- if ($weeks > 0)\r
- { \r
- $str .= $weeks.' '.$CI->lang->line((($weeks > 1) ? 'date_weeks' : 'date_week')).', ';\r
- }\r
- \r
- $seconds -= $weeks * 604800;\r
- } \r
-\r
- $days = floor($seconds / 86400);\r
- \r
- if ($months > 0 OR $weeks > 0 OR $days > 0)\r
- {\r
- if ($days > 0)\r
- { \r
- $str .= $days.' '.$CI->lang->line((($days > 1) ? 'date_days' : 'date_day')).', ';\r
- }\r
- \r
- $seconds -= $days * 86400;\r
- }\r
- \r
- $hours = floor($seconds / 3600);\r
- \r
- if ($days > 0 OR $hours > 0)\r
- {\r
- if ($hours > 0)\r
- {\r
- $str .= $hours.' '.$CI->lang->line((($hours > 1) ? 'date_hours' : 'date_hour')).', ';\r
- }\r
- \r
- $seconds -= $hours * 3600;\r
- }\r
- \r
- $minutes = floor($seconds / 60);\r
- \r
- if ($days > 0 OR $hours > 0 OR $minutes > 0)\r
- {\r
- if ($minutes > 0)\r
- { \r
- $str .= $minutes.' '.$CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute')).', ';\r
- }\r
- \r
- $seconds -= $minutes * 60;\r
- }\r
- \r
- if ($str == '')\r
- {\r
- $str .= $seconds.' '.$CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second')).', ';\r
- }\r
- \r
- return substr(trim($str), 0, -1);\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Number of days in a month\r
- *\r
- * Takes a month/year as input and returns the number of days\r
- * for the given month/year. Takes leap years into consideration.\r
- *\r
- * @access public\r
- * @param integer a numeric month\r
- * @param integer a numeric year\r
- * @return integer\r
- */ \r
-if ( ! function_exists('days_in_month'))\r
-{\r
- function days_in_month($month = 0, $year = '')\r
- {\r
- if ($month < 1 OR $month > 12)\r
- {\r
- return 0;\r
- }\r
- \r
- if ( ! is_numeric($year) OR strlen($year) != 4)\r
- {\r
- $year = date('Y');\r
- }\r
- \r
- if ($month == 2)\r
- {\r
- if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0))\r
- {\r
- return 29;\r
- }\r
- }\r
-\r
- $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);\r
- return $days_in_month[$month - 1];\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Converts a local Unix timestamp to GMT\r
- *\r
- * @access public\r
- * @param integer Unix timestamp\r
- * @return integer\r
- */ \r
-if ( ! function_exists('local_to_gmt'))\r
-{\r
- function local_to_gmt($time = '')\r
- {\r
- if ($time == '')\r
- $time = time();\r
- \r
- return mktime( gmdate("H", $time), gmdate("i", $time), gmdate("s", $time), gmdate("m", $time), gmdate("d", $time), gmdate("Y", $time));\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Converts GMT time to a localized value\r
- *\r
- * Takes a Unix timestamp (in GMT) as input, and returns\r
- * at the local value based on the timezone and DST setting\r
- * submitted\r
- *\r
- * @access public\r
- * @param integer Unix timestamp\r
- * @param string timezone\r
- * @param bool whether DST is active\r
- * @return integer\r
- */ \r
-if ( ! function_exists('gmt_to_local'))\r
-{\r
- function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE)\r
- { \r
- if ($time == '')\r
- {\r
- return now();\r
- }\r
- \r
- $time += timezones($timezone) * 3600;\r
-\r
- if ($dst == TRUE)\r
- {\r
- $time += 3600;\r
- }\r
- \r
- return $time;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Converts a MySQL Timestamp to Unix\r
- *\r
- * @access public\r
- * @param integer Unix timestamp\r
- * @return integer\r
- */ \r
-if ( ! function_exists('mysql_to_unix'))\r
-{\r
- function mysql_to_unix($time = '')\r
- {\r
- // We'll remove certain characters for backward compatibility\r
- // since the formatting changed with MySQL 4.1\r
- // YYYY-MM-DD HH:MM:SS\r
- \r
- $time = str_replace('-', '', $time);\r
- $time = str_replace(':', '', $time);\r
- $time = str_replace(' ', '', $time);\r
- \r
- // YYYYMMDDHHMMSS\r
- return mktime(\r
- substr($time, 8, 2),\r
- substr($time, 10, 2),\r
- substr($time, 12, 2),\r
- substr($time, 4, 2),\r
- substr($time, 6, 2),\r
- substr($time, 0, 4)\r
- );\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Unix to "Human"\r
- *\r
- * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM\r
- *\r
- * @access public\r
- * @param integer Unix timestamp\r
- * @param bool whether to show seconds\r
- * @param string format: us or euro\r
- * @return string\r
- */ \r
-if ( ! function_exists('unix_to_human'))\r
-{\r
- function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us')\r
- {\r
- $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' ';\r
- \r
- if ($fmt == 'us')\r
- {\r
- $r .= date('h', $time).':'.date('i', $time);\r
- }\r
- else\r
- {\r
- $r .= date('H', $time).':'.date('i', $time);\r
- }\r
- \r
- if ($seconds)\r
- {\r
- $r .= ':'.date('s', $time);\r
- }\r
- \r
- if ($fmt == 'us')\r
- {\r
- $r .= ' '.date('A', $time);\r
- }\r
- \r
- return $r;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Convert "human" date to GMT\r
- *\r
- * Reverses the above process\r
- *\r
- * @access public\r
- * @param string format: us or euro\r
- * @return integer\r
- */ \r
-if ( ! function_exists('human_to_unix'))\r
-{\r
- function human_to_unix($datestr = '')\r
- {\r
- if ($datestr == '')\r
- {\r
- return FALSE;\r
- }\r
- \r
- $datestr = trim($datestr);\r
- $datestr = preg_replace("/\040+/", "\040", $datestr);\r
-\r
- if ( ! preg_match('/^[0-9]{2,4}\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr))\r
- {\r
- return FALSE;\r
- }\r
-\r
- $split = preg_split("/\040/", $datestr);\r
-\r
- $ex = explode("-", $split['0']);\r
- \r
- $year = (strlen($ex['0']) == 2) ? '20'.$ex['0'] : $ex['0'];\r
- $month = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1'];\r
- $day = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2'];\r
-\r
- $ex = explode(":", $split['1']);\r
- \r
- $hour = (strlen($ex['0']) == 1) ? '0'.$ex['0'] : $ex['0'];\r
- $min = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1'];\r
-\r
- if (isset($ex['2']) AND ereg("[0-9]{1,2}", $ex['2']))\r
- {\r
- $sec = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2'];\r
- }\r
- else\r
- {\r
- // Unless specified, seconds get set to zero.\r
- $sec = '00';\r
- }\r
- \r
- if (isset($split['2']))\r
- {\r
- $ampm = strtolower($split['2']);\r
- \r
- if (substr($ampm, 0, 1) == 'p' AND $hour < 12)\r
- $hour = $hour + 12;\r
- \r
- if (substr($ampm, 0, 1) == 'a' AND $hour == 12)\r
- $hour = '00';\r
- \r
- if (strlen($hour) == 1)\r
- $hour = '0'.$hour;\r
- }\r
- \r
- return mktime($hour, $min, $sec, $month, $day, $year);\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Timezone Menu\r
- *\r
- * Generates a drop-down menu of timezones.\r
- *\r
- * @access public\r
- * @param string timezone\r
- * @param string classname\r
- * @param string menu name\r
- * @return string\r
- */ \r
-if ( ! function_exists('timezone_menu'))\r
-{\r
- function timezone_menu($default = 'UTC', $class = "", $name = 'timezones')\r
- {\r
- $CI =& get_instance();\r
- $CI->lang->load('date');\r
- \r
- if ($default == 'GMT')\r
- $default = 'UTC';\r
-\r
- $menu = '<select name="'.$name.'"';\r
- \r
- if ($class != '')\r
- {\r
- $menu .= ' class="'.$class.'"';\r
- }\r
- \r
- $menu .= ">\n";\r
- \r
- foreach (timezones() as $key => $val)\r
- {\r
- $selected = ($default == $key) ? " selected='selected'" : '';\r
- $menu .= "<option value='{$key}'{$selected}>".$CI->lang->line($key)."</option>\n";\r
- }\r
-\r
- $menu .= "</select>";\r
-\r
- return $menu;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Timezones\r
- *\r
- * Returns an array of timezones. This is a helper function\r
- * for various other ones in this library\r
- *\r
- * @access public\r
- * @param string timezone\r
- * @return string\r
- */ \r
-if ( ! function_exists('timezones'))\r
-{\r
- function timezones($tz = '')\r
- {\r
- // Note: Don't change the order of these even though\r
- // some items appear to be in the wrong order\r
- \r
- $zones = array( \r
- 'UM12' => -12,\r
- 'UM11' => -11,\r
- 'UM10' => -10,\r
- 'UM95' => -9.5,\r
- 'UM9' => -9,\r
- 'UM8' => -8,\r
- 'UM7' => -7,\r
- 'UM6' => -6,\r
- 'UM5' => -5,\r
- 'UM45' => -4.5,\r
- 'UM4' => -4,\r
- 'UM35' => -3.5,\r
- 'UM3' => -3,\r
- 'UM2' => -2,\r
- 'UM1' => -1,\r
- 'UTC' => 0,\r
- 'UP1' => +1,\r
- 'UP2' => +2,\r
- 'UP3' => +3,\r
- 'UP35' => +3.5,\r
- 'UP4' => +4,\r
- 'UP45' => +4.5,\r
- 'UP5' => +5,\r
- 'UP55' => +5.5,\r
- 'UP575' => +5.75,\r
- 'UP6' => +6,\r
- 'UP65' => +6.5,\r
- 'UP7' => +7,\r
- 'UP8' => +8,\r
- 'UP875' => +8.75,\r
- 'UP9' => +9,\r
- 'UP95' => +9.5,\r
- 'UP10' => +10,\r
- 'UP105' => +10.5,\r
- 'UP11' => +11,\r
- 'UP115' => +11.5,\r
- 'UP12' => +12,\r
- 'UP1275' => +12.75,\r
- 'UP13' => +13,\r
- 'UP14' => +14\r
- );\r
- \r
- if ($tz == '')\r
- {\r
- return $zones;\r
- }\r
- \r
- if ($tz == 'GMT')\r
- $tz = 'UTC';\r
- \r
- return ( ! isset($zones[$tz])) ? 0 : $zones[$tz];\r
- }\r
-}\r
-\r
-\r
-/* End of file date_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Date Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/date_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Get "now" time
+ *
+ * Returns time() or its GMT equivalent based on the config file preference
+ *
+ * @access public
+ * @return integer
+ */
+if ( ! function_exists('now'))
+{
+ function now()
+ {
+ $CI =& get_instance();
+
+ if (strtolower($CI->config->item('time_reference')) == 'gmt')
+ {
+ $now = time();
+ $system_time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now));
+
+ if (strlen($system_time) < 10)
+ {
+ $system_time = time();
+ log_message('error', 'The Date class could not set a proper GMT timestamp so the local time() value was used.');
+ }
+
+ return $system_time;
+ }
+ else
+ {
+ return time();
+ }
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Convert MySQL Style Datecodes
+ *
+ * This function is identical to PHPs date() function,
+ * except that it allows date codes to be formatted using
+ * the MySQL style, where each code letter is preceded
+ * with a percent sign: %Y %m %d etc...
+ *
+ * The benefit of doing dates this way is that you don't
+ * have to worry about escaping your text letters that
+ * match the date codes.
+ *
+ * @access public
+ * @param string
+ * @param integer
+ * @return integer
+ */
+if ( ! function_exists('mdate'))
+{
+ function mdate($datestr = '', $time = '')
+ {
+ if ($datestr == '')
+ return '';
+
+ if ($time == '')
+ $time = now();
+
+ $datestr = str_replace('%\\', '', preg_replace("/([a-z]+?){1}/i", "\\\\\\1", $datestr));
+ return date($datestr, $time);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Standard Date
+ *
+ * Returns a date formatted according to the submitted standard.
+ *
+ * @access public
+ * @param string the chosen format
+ * @param integer Unix timestamp
+ * @return string
+ */
+if ( ! function_exists('standard_date'))
+{
+ function standard_date($fmt = 'DATE_RFC822', $time = '')
+ {
+ $formats = array(
+ 'DATE_ATOM' => '%Y-%m-%dT%H:%i:%s%Q',
+ 'DATE_COOKIE' => '%l, %d-%M-%y %H:%i:%s UTC',
+ 'DATE_ISO8601' => '%Y-%m-%dT%H:%i:%s%O',
+ 'DATE_RFC822' => '%D, %d %M %y %H:%i:%s %O',
+ 'DATE_RFC850' => '%l, %d-%M-%y %H:%m:%i UTC',
+ 'DATE_RFC1036' => '%D, %d %M %y %H:%i:%s %O',
+ 'DATE_RFC1123' => '%D, %d %M %Y %H:%i:%s %O',
+ 'DATE_RSS' => '%D, %d %M %Y %H:%i:%s %O',
+ 'DATE_W3C' => '%Y-%m-%dT%H:%i:%s%Q'
+ );
+
+ if ( ! isset($formats[$fmt]))
+ {
+ return FALSE;
+ }
+
+ return mdate($formats[$fmt], $time);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Timespan
+ *
+ * Returns a span of seconds in this format:
+ * 10 days 14 hours 36 minutes 47 seconds
+ *
+ * @access public
+ * @param integer a number of seconds
+ * @param integer Unix timestamp
+ * @return integer
+ */
+if ( ! function_exists('timespan'))
+{
+ function timespan($seconds = 1, $time = '')
+ {
+ $CI =& get_instance();
+ $CI->lang->load('date');
+
+ if ( ! is_numeric($seconds))
+ {
+ $seconds = 1;
+ }
+
+ if ( ! is_numeric($time))
+ {
+ $time = time();
+ }
+
+ if ($time <= $seconds)
+ {
+ $seconds = 1;
+ }
+ else
+ {
+ $seconds = $time - $seconds;
+ }
+
+ $str = '';
+ $years = floor($seconds / 31536000);
+
+ if ($years > 0)
+ {
+ $str .= $years.' '.$CI->lang->line((($years > 1) ? 'date_years' : 'date_year')).', ';
+ }
+
+ $seconds -= $years * 31536000;
+ $months = floor($seconds / 2628000);
+
+ if ($years > 0 OR $months > 0)
+ {
+ if ($months > 0)
+ {
+ $str .= $months.' '.$CI->lang->line((($months > 1) ? 'date_months' : 'date_month')).', ';
+ }
+
+ $seconds -= $months * 2628000;
+ }
+
+ $weeks = floor($seconds / 604800);
+
+ if ($years > 0 OR $months > 0 OR $weeks > 0)
+ {
+ if ($weeks > 0)
+ {
+ $str .= $weeks.' '.$CI->lang->line((($weeks > 1) ? 'date_weeks' : 'date_week')).', ';
+ }
+
+ $seconds -= $weeks * 604800;
+ }
+
+ $days = floor($seconds / 86400);
+
+ if ($months > 0 OR $weeks > 0 OR $days > 0)
+ {
+ if ($days > 0)
+ {
+ $str .= $days.' '.$CI->lang->line((($days > 1) ? 'date_days' : 'date_day')).', ';
+ }
+
+ $seconds -= $days * 86400;
+ }
+
+ $hours = floor($seconds / 3600);
+
+ if ($days > 0 OR $hours > 0)
+ {
+ if ($hours > 0)
+ {
+ $str .= $hours.' '.$CI->lang->line((($hours > 1) ? 'date_hours' : 'date_hour')).', ';
+ }
+
+ $seconds -= $hours * 3600;
+ }
+
+ $minutes = floor($seconds / 60);
+
+ if ($days > 0 OR $hours > 0 OR $minutes > 0)
+ {
+ if ($minutes > 0)
+ {
+ $str .= $minutes.' '.$CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute')).', ';
+ }
+
+ $seconds -= $minutes * 60;
+ }
+
+ if ($str == '')
+ {
+ $str .= $seconds.' '.$CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second')).', ';
+ }
+
+ return substr(trim($str), 0, -1);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Number of days in a month
+ *
+ * Takes a month/year as input and returns the number of days
+ * for the given month/year. Takes leap years into consideration.
+ *
+ * @access public
+ * @param integer a numeric month
+ * @param integer a numeric year
+ * @return integer
+ */
+if ( ! function_exists('days_in_month'))
+{
+ function days_in_month($month = 0, $year = '')
+ {
+ if ($month < 1 OR $month > 12)
+ {
+ return 0;
+ }
+
+ if ( ! is_numeric($year) OR strlen($year) != 4)
+ {
+ $year = date('Y');
+ }
+
+ if ($month == 2)
+ {
+ if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0))
+ {
+ return 29;
+ }
+ }
+
+ $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
+ return $days_in_month[$month - 1];
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Converts a local Unix timestamp to GMT
+ *
+ * @access public
+ * @param integer Unix timestamp
+ * @return integer
+ */
+if ( ! function_exists('local_to_gmt'))
+{
+ function local_to_gmt($time = '')
+ {
+ if ($time == '')
+ $time = time();
+
+ return mktime( gmdate("H", $time), gmdate("i", $time), gmdate("s", $time), gmdate("m", $time), gmdate("d", $time), gmdate("Y", $time));
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Converts GMT time to a localized value
+ *
+ * Takes a Unix timestamp (in GMT) as input, and returns
+ * at the local value based on the timezone and DST setting
+ * submitted
+ *
+ * @access public
+ * @param integer Unix timestamp
+ * @param string timezone
+ * @param bool whether DST is active
+ * @return integer
+ */
+if ( ! function_exists('gmt_to_local'))
+{
+ function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE)
+ {
+ if ($time == '')
+ {
+ return now();
+ }
+
+ $time += timezones($timezone) * 3600;
+
+ if ($dst == TRUE)
+ {
+ $time += 3600;
+ }
+
+ return $time;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Converts a MySQL Timestamp to Unix
+ *
+ * @access public
+ * @param integer Unix timestamp
+ * @return integer
+ */
+if ( ! function_exists('mysql_to_unix'))
+{
+ function mysql_to_unix($time = '')
+ {
+ // We'll remove certain characters for backward compatibility
+ // since the formatting changed with MySQL 4.1
+ // YYYY-MM-DD HH:MM:SS
+
+ $time = str_replace('-', '', $time);
+ $time = str_replace(':', '', $time);
+ $time = str_replace(' ', '', $time);
+
+ // YYYYMMDDHHMMSS
+ return mktime(
+ substr($time, 8, 2),
+ substr($time, 10, 2),
+ substr($time, 12, 2),
+ substr($time, 4, 2),
+ substr($time, 6, 2),
+ substr($time, 0, 4)
+ );
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Unix to "Human"
+ *
+ * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM
+ *
+ * @access public
+ * @param integer Unix timestamp
+ * @param bool whether to show seconds
+ * @param string format: us or euro
+ * @return string
+ */
+if ( ! function_exists('unix_to_human'))
+{
+ function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us')
+ {
+ $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' ';
+
+ if ($fmt == 'us')
+ {
+ $r .= date('h', $time).':'.date('i', $time);
+ }
+ else
+ {
+ $r .= date('H', $time).':'.date('i', $time);
+ }
+
+ if ($seconds)
+ {
+ $r .= ':'.date('s', $time);
+ }
+
+ if ($fmt == 'us')
+ {
+ $r .= ' '.date('A', $time);
+ }
+
+ return $r;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Convert "human" date to GMT
+ *
+ * Reverses the above process
+ *
+ * @access public
+ * @param string format: us or euro
+ * @return integer
+ */
+if ( ! function_exists('human_to_unix'))
+{
+ function human_to_unix($datestr = '')
+ {
+ if ($datestr == '')
+ {
+ return FALSE;
+ }
+
+ $datestr = trim($datestr);
+ $datestr = preg_replace("/\040+/", "\040", $datestr);
+
+ if ( ! preg_match('/^[0-9]{2,4}\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr))
+ {
+ return FALSE;
+ }
+
+ $split = preg_split("/\040/", $datestr);
+
+ $ex = explode("-", $split['0']);
+
+ $year = (strlen($ex['0']) == 2) ? '20'.$ex['0'] : $ex['0'];
+ $month = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1'];
+ $day = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2'];
+
+ $ex = explode(":", $split['1']);
+
+ $hour = (strlen($ex['0']) == 1) ? '0'.$ex['0'] : $ex['0'];
+ $min = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1'];
+
+ if (isset($ex['2']) AND ereg("[0-9]{1,2}", $ex['2']))
+ {
+ $sec = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2'];
+ }
+ else
+ {
+ // Unless specified, seconds get set to zero.
+ $sec = '00';
+ }
+
+ if (isset($split['2']))
+ {
+ $ampm = strtolower($split['2']);
+
+ if (substr($ampm, 0, 1) == 'p' AND $hour < 12)
+ $hour = $hour + 12;
+
+ if (substr($ampm, 0, 1) == 'a' AND $hour == 12)
+ $hour = '00';
+
+ if (strlen($hour) == 1)
+ $hour = '0'.$hour;
+ }
+
+ return mktime($hour, $min, $sec, $month, $day, $year);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Timezone Menu
+ *
+ * Generates a drop-down menu of timezones.
+ *
+ * @access public
+ * @param string timezone
+ * @param string classname
+ * @param string menu name
+ * @return string
+ */
+if ( ! function_exists('timezone_menu'))
+{
+ function timezone_menu($default = 'UTC', $class = "", $name = 'timezones')
+ {
+ $CI =& get_instance();
+ $CI->lang->load('date');
+
+ if ($default == 'GMT')
+ $default = 'UTC';
+
+ $menu = '<select name="'.$name.'"';
+
+ if ($class != '')
+ {
+ $menu .= ' class="'.$class.'"';
+ }
+
+ $menu .= ">\n";
+
+ foreach (timezones() as $key => $val)
+ {
+ $selected = ($default == $key) ? " selected='selected'" : '';
+ $menu .= "<option value='{$key}'{$selected}>".$CI->lang->line($key)."</option>\n";
+ }
+
+ $menu .= "</select>";
+
+ return $menu;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Timezones
+ *
+ * Returns an array of timezones. This is a helper function
+ * for various other ones in this library
+ *
+ * @access public
+ * @param string timezone
+ * @return string
+ */
+if ( ! function_exists('timezones'))
+{
+ function timezones($tz = '')
+ {
+ // Note: Don't change the order of these even though
+ // some items appear to be in the wrong order
+
+ $zones = array(
+ 'UM12' => -12,
+ 'UM11' => -11,
+ 'UM10' => -10,
+ 'UM95' => -9.5,
+ 'UM9' => -9,
+ 'UM8' => -8,
+ 'UM7' => -7,
+ 'UM6' => -6,
+ 'UM5' => -5,
+ 'UM45' => -4.5,
+ 'UM4' => -4,
+ 'UM35' => -3.5,
+ 'UM3' => -3,
+ 'UM2' => -2,
+ 'UM1' => -1,
+ 'UTC' => 0,
+ 'UP1' => +1,
+ 'UP2' => +2,
+ 'UP3' => +3,
+ 'UP35' => +3.5,
+ 'UP4' => +4,
+ 'UP45' => +4.5,
+ 'UP5' => +5,
+ 'UP55' => +5.5,
+ 'UP575' => +5.75,
+ 'UP6' => +6,
+ 'UP65' => +6.5,
+ 'UP7' => +7,
+ 'UP8' => +8,
+ 'UP875' => +8.75,
+ 'UP9' => +9,
+ 'UP95' => +9.5,
+ 'UP10' => +10,
+ 'UP105' => +10.5,
+ 'UP11' => +11,
+ 'UP115' => +11.5,
+ 'UP12' => +12,
+ 'UP1275' => +12.75,
+ 'UP13' => +13,
+ 'UP14' => +14
+ );
+
+ if ($tz == '')
+ {
+ return $zones;
+ }
+
+ if ($tz == 'GMT')
+ $tz = 'UTC';
+
+ return ( ! isset($zones[$tz])) ? 0 : $zones[$tz];
+ }
+}
+
+
+/* End of file date_helper.php */
/* Location: ./system/helpers/date_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Directory Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/directory_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Create a Directory Map\r
- *\r
- * Reads the specified directory and builds an array\r
- * representation of it. Sub-folders contained with the\r
- * directory will be mapped as well.\r
- *\r
- * @access public\r
- * @param string path to source\r
- * @param bool whether to limit the result to the top level only\r
- * @return array\r
- */ \r
-if ( ! function_exists('directory_map'))\r
-{\r
- function directory_map($source_dir, $top_level_only = FALSE)\r
- { \r
- if ($fp = @opendir($source_dir))\r
- {\r
- $source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; \r
- $filedata = array();\r
- \r
- while (FALSE !== ($file = readdir($fp)))\r
- {\r
- if (strncmp($file, '.', 1) == 0)\r
- {\r
- continue;\r
- }\r
- \r
- if ($top_level_only == FALSE && @is_dir($source_dir.$file))\r
- {\r
- $temp_array = array();\r
- \r
- $temp_array = directory_map($source_dir.$file.DIRECTORY_SEPARATOR);\r
- \r
- $filedata[$file] = $temp_array;\r
- }\r
- else\r
- {\r
- $filedata[] = $file;\r
- }\r
- }\r
- \r
- closedir($fp);\r
- return $filedata;\r
- }\r
- }\r
-}\r
-\r
-\r
-/* End of file directory_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Directory Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/directory_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Create a Directory Map
+ *
+ * Reads the specified directory and builds an array
+ * representation of it. Sub-folders contained with the
+ * directory will be mapped as well.
+ *
+ * @access public
+ * @param string path to source
+ * @param bool whether to limit the result to the top level only
+ * @return array
+ */
+if ( ! function_exists('directory_map'))
+{
+ function directory_map($source_dir, $top_level_only = FALSE)
+ {
+ if ($fp = @opendir($source_dir))
+ {
+ $source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
+ $filedata = array();
+
+ while (FALSE !== ($file = readdir($fp)))
+ {
+ if (strncmp($file, '.', 1) == 0)
+ {
+ continue;
+ }
+
+ if ($top_level_only == FALSE && @is_dir($source_dir.$file))
+ {
+ $temp_array = array();
+
+ $temp_array = directory_map($source_dir.$file.DIRECTORY_SEPARATOR);
+
+ $filedata[$file] = $temp_array;
+ }
+ else
+ {
+ $filedata[] = $file;
+ }
+ }
+
+ closedir($fp);
+ return $filedata;
+ }
+ }
+}
+
+
+/* End of file directory_helper.php */
/* Location: ./system/helpers/directory_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Download Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/download_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Force Download\r
- *\r
- * Generates headers that force a download to happen\r
- *\r
- * @access public\r
- * @param string filename\r
- * @param mixed the data to be downloaded\r
- * @return void\r
- */ \r
-if ( ! function_exists('force_download'))\r
-{\r
- function force_download($filename = '', $data = '')\r
- {\r
- if ($filename == '' OR $data == '')\r
- {\r
- return FALSE;\r
- }\r
-\r
- // Try to determine if the filename includes a file extension.\r
- // We need it in order to set the MIME type\r
- if (FALSE === strpos($filename, '.'))\r
- {\r
- return FALSE;\r
- }\r
- \r
- // Grab the file extension\r
- $x = explode('.', $filename);\r
- $extension = end($x);\r
-\r
- // Load the mime types\r
- @include(APPPATH.'config/mimes'.EXT);\r
- \r
- // Set a default mime if we can't find it\r
- if ( ! isset($mimes[$extension]))\r
- {\r
- $mime = 'application/octet-stream';\r
- }\r
- else\r
- {\r
- $mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension];\r
- }\r
- \r
- // Generate the server headers\r
- if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))\r
- {\r
- header('Content-Type: "'.$mime.'"');\r
- header('Content-Disposition: attachment; filename="'.$filename.'"');\r
- header('Expires: 0');\r
- header('Cache-Control: must-revalidate, post-check=0, pre-check=0');\r
- header("Content-Transfer-Encoding: binary");\r
- header('Pragma: public');\r
- header("Content-Length: ".strlen($data));\r
- }\r
- else\r
- {\r
- header('Content-Type: "'.$mime.'"');\r
- header('Content-Disposition: attachment; filename="'.$filename.'"');\r
- header("Content-Transfer-Encoding: binary");\r
- header('Expires: 0');\r
- header('Pragma: no-cache');\r
- header("Content-Length: ".strlen($data));\r
- }\r
- \r
- exit($data);\r
- }\r
-}\r
-\r
-\r
-/* End of file download_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Download Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/download_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Force Download
+ *
+ * Generates headers that force a download to happen
+ *
+ * @access public
+ * @param string filename
+ * @param mixed the data to be downloaded
+ * @return void
+ */
+if ( ! function_exists('force_download'))
+{
+ function force_download($filename = '', $data = '')
+ {
+ if ($filename == '' OR $data == '')
+ {
+ return FALSE;
+ }
+
+ // Try to determine if the filename includes a file extension.
+ // We need it in order to set the MIME type
+ if (FALSE === strpos($filename, '.'))
+ {
+ return FALSE;
+ }
+
+ // Grab the file extension
+ $x = explode('.', $filename);
+ $extension = end($x);
+
+ // Load the mime types
+ @include(APPPATH.'config/mimes'.EXT);
+
+ // Set a default mime if we can't find it
+ if ( ! isset($mimes[$extension]))
+ {
+ $mime = 'application/octet-stream';
+ }
+ else
+ {
+ $mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension];
+ }
+
+ // Generate the server headers
+ if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
+ {
+ header('Content-Type: "'.$mime.'"');
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ header('Expires: 0');
+ header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
+ header("Content-Transfer-Encoding: binary");
+ header('Pragma: public');
+ header("Content-Length: ".strlen($data));
+ }
+ else
+ {
+ header('Content-Type: "'.$mime.'"');
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ header("Content-Transfer-Encoding: binary");
+ header('Expires: 0');
+ header('Pragma: no-cache');
+ header("Content-Length: ".strlen($data));
+ }
+
+ exit($data);
+ }
+}
+
+
+/* End of file download_helper.php */
/* Location: ./system/helpers/download_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Email Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/email_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Validate email address\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
-if ( ! function_exists('valid_email'))\r
-{\r
- function valid_email($address)\r
- {\r
- return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address)) ? FALSE : TRUE;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Send an email\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
-if ( ! function_exists('send_email'))\r
-{\r
- function send_email($recipient, $subject = 'Test email', $message = 'Hello World')\r
- {\r
- return mail($recipient, $subject, $message);\r
- }\r
-}\r
-\r
-\r
-/* End of file email_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Email Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/email_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Validate email address
+ *
+ * @access public
+ * @return bool
+ */
+if ( ! function_exists('valid_email'))
+{
+ function valid_email($address)
+ {
+ return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address)) ? FALSE : TRUE;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Send an email
+ *
+ * @access public
+ * @return bool
+ */
+if ( ! function_exists('send_email'))
+{
+ function send_email($recipient, $subject = 'Test email', $message = 'Hello World')
+ {
+ return mail($recipient, $subject, $message);
+ }
+}
+
+
+/* End of file email_helper.php */
/* Location: ./system/helpers/email_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter File Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/file_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Read File\r
- *\r
- * Opens the file specfied in the path and returns it as a string.\r
- *\r
- * @access public\r
- * @param string path to file\r
- * @return string\r
- */ \r
-if ( ! function_exists('read_file'))\r
-{\r
- function read_file($file)\r
- {\r
- if ( ! file_exists($file))\r
- {\r
- return FALSE;\r
- }\r
- \r
- if (function_exists('file_get_contents'))\r
- {\r
- return file_get_contents($file); \r
- }\r
-\r
- if ( ! $fp = @fopen($file, FOPEN_READ))\r
- {\r
- return FALSE;\r
- }\r
- \r
- flock($fp, LOCK_SH);\r
- \r
- $data = '';\r
- if (filesize($file) > 0)\r
- {\r
- $data =& fread($fp, filesize($file));\r
- }\r
-\r
- flock($fp, LOCK_UN);\r
- fclose($fp);\r
-\r
- return $data;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Write File\r
- *\r
- * Writes data to the file specified in the path.\r
- * Creates a new file if non-existent.\r
- *\r
- * @access public\r
- * @param string path to file\r
- * @param string file data\r
- * @return bool\r
- */ \r
-if ( ! function_exists('write_file'))\r
-{\r
- function write_file($path, $data, $mode = FOPEN_WRITE_CREATE_DESTRUCTIVE)\r
- {\r
- if ( ! $fp = @fopen($path, $mode))\r
- {\r
- return FALSE;\r
- }\r
- \r
- flock($fp, LOCK_EX);\r
- fwrite($fp, $data);\r
- flock($fp, LOCK_UN);\r
- fclose($fp); \r
-\r
- return TRUE;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Delete Files\r
- *\r
- * Deletes all files contained in the supplied directory path.\r
- * Files must be writable or owned by the system in order to be deleted.\r
- * If the second parameter is set to TRUE, any directories contained\r
- * within the supplied base directory will be nuked as well.\r
- *\r
- * @access public\r
- * @param string path to file\r
- * @param bool whether to delete any directories found in the path\r
- * @return bool\r
- */ \r
-if ( ! function_exists('delete_files'))\r
-{\r
- function delete_files($path, $del_dir = FALSE, $level = 0)\r
- { \r
- // Trim the trailing slash\r
- $path = preg_replace("|^(.+?)/*$|", "\\1", $path);\r
- \r
- if ( ! $current_dir = @opendir($path))\r
- return;\r
- \r
- while(FALSE !== ($filename = @readdir($current_dir)))\r
- {\r
- if ($filename != "." and $filename != "..")\r
- {\r
- if (is_dir($path.'/'.$filename))\r
- {\r
- // Ignore empty folders\r
- if (substr($filename, 0, 1) != '.')\r
- {\r
- delete_files($path.'/'.$filename, $del_dir, $level + 1);\r
- }\r
- }\r
- else\r
- {\r
- unlink($path.'/'.$filename);\r
- }\r
- }\r
- }\r
- @closedir($current_dir);\r
- \r
- if ($del_dir == TRUE AND $level > 0)\r
- {\r
- @rmdir($path);\r
- }\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Get Filenames\r
- *\r
- * Reads the specified directory and builds an array containing the filenames. \r
- * Any sub-folders contained within the specified path are read as well.\r
- *\r
- * @access public\r
- * @param string path to source\r
- * @param bool whether to include the path as part of the filename\r
- * @param bool internal variable to determine recursion status - do not use in calls\r
- * @return array\r
- */ \r
-if ( ! function_exists('get_filenames'))\r
-{\r
- function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE)\r
- {\r
- static $_filedata = array();\r
- \r
- if ($fp = @opendir($source_dir))\r
- {\r
- // reset the array and make sure $source_dir has a trailing slash on the initial call\r
- if ($_recursion === FALSE)\r
- {\r
- $_filedata = array();\r
- $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;\r
- }\r
- \r
- while (FALSE !== ($file = readdir($fp)))\r
- {\r
- if (@is_dir($source_dir.$file) && strncmp($file, '.', 1) !== 0)\r
- {\r
- get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE);\r
- }\r
- elseif (strncmp($file, '.', 1) !== 0)\r
- {\r
- \r
- $_filedata[] = ($include_path == TRUE) ? $source_dir.$file : $file;\r
- }\r
- }\r
- return $_filedata;\r
- }\r
- else\r
- {\r
- return FALSE;\r
- }\r
- }\r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Get Directory File Information\r
- *\r
- * Reads the specified directory and builds an array containing the filenames, \r
- * filesize, dates, and permissions\r
- *\r
- * Any sub-folders contained within the specified path are read as well.\r
- *\r
- * @access public\r
- * @param string path to source\r
- * @param bool whether to include the path as part of the filename\r
- * @param bool internal variable to determine recursion status - do not use in calls\r
- * @return array\r
- */ \r
-if ( ! function_exists('get_dir_file_info'))\r
-{\r
- function get_dir_file_info($source_dir, $include_path = FALSE, $_recursion = FALSE)\r
- {\r
- $_filedata = array();\r
- $relative_path = $source_dir;\r
- \r
- if ($fp = @opendir($source_dir))\r
- {\r
- // reset the array and make sure $source_dir has a trailing slash on the initial call\r
- if ($_recursion === FALSE)\r
- {\r
- $_filedata = array();\r
- $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;\r
- }\r
-\r
- while (FALSE !== ($file = readdir($fp)))\r
- {\r
- if (@is_dir($source_dir.$file) && strncmp($file, '.', 1) !== 0)\r
- {\r
- get_dir_file_info($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE);\r
- }\r
- elseif (strncmp($file, '.', 1) !== 0)\r
- {\r
- $_filedata[$file] = get_file_info($source_dir.$file);\r
- $_filedata[$file]['relative_path'] = $relative_path;\r
- }\r
- }\r
- return $_filedata;\r
- }\r
- else\r
- {\r
- return FALSE;\r
- }\r
- }\r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
-* Get File Info\r
-*\r
-* Given a file and path, returns the name, path, size, date modified\r
-* Second parameter allows you to explicitly declare what information you want returned\r
-* Options are: name, server_path, size, date, readable, writable, executable, fileperms\r
-* Returns FALSE if the file cannot be found.\r
-*\r
-* @access public\r
-* @param string path to file\r
-* @param mixed array or comma separated string of information returned\r
-* @return array\r
-*/\r
-if ( ! function_exists('get_file_info'))\r
-{\r
- function get_file_info($file, $returned_values = array('name', 'server_path', 'size', 'date'))\r
- {\r
-\r
- if ( ! file_exists($file))\r
- {\r
- return FALSE;\r
- }\r
-\r
- if (is_string($returned_values))\r
- {\r
- $returned_values = explode(',', $returned_values);\r
- }\r
-\r
- foreach ($returned_values as $key)\r
- {\r
- switch ($key)\r
- {\r
- case 'name':\r
- $fileinfo['name'] = substr(strrchr($file, '/'), 1);\r
- break;\r
- case 'server_path':\r
- $fileinfo['server_path'] = $file;\r
- break;\r
- case 'size':\r
- $fileinfo['size'] = filesize($file);\r
- break;\r
- case 'date':\r
- $fileinfo['date'] = filectime($file);\r
- break;\r
- case 'readable':\r
- $fileinfo['readable'] = is_readable($file);\r
- break;\r
- case 'writable':\r
- // There are known problems using is_weritable on IIS. It may not be reliable - consider fileperms()\r
- $fileinfo['writable'] = is_writable($file);\r
- break;\r
- case 'executable':\r
- $fileinfo['executable'] = is_executable($file);\r
- break;\r
- case 'fileperms':\r
- $fileinfo['fileperms'] = fileperms($file);\r
- break;\r
- }\r
- }\r
-\r
- return $fileinfo;\r
- }\r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Get Mime by Extension\r
- *\r
- * Translates a file extension into a mime type based on config/mimes.php. \r
- * Returns FALSE if it can't determine the type, or open the mime config file\r
- *\r
- * Note: this is NOT an accurate way of determining file mime types, and is here strictly as a convenience\r
- * It should NOT be trusted, and should certainly NOT be used for security\r
- *\r
- * @access public\r
- * @param string path to file\r
- * @return mixed\r
- */ \r
-if ( ! function_exists('get_mime_by_extension'))\r
-{\r
- function get_mime_by_extension($file)\r
- {\r
- $extension = substr(strrchr($file, '.'), 1);\r
- \r
- global $mimes;\r
- \r
- if ( ! is_array($mimes))\r
- {\r
- if ( ! require_once(APPPATH.'config/mimes.php'))\r
- {\r
- return FALSE;\r
- }\r
- }\r
-\r
- if (array_key_exists($extension, $mimes))\r
- {\r
- if (is_array($mimes[$extension]))\r
- {\r
- // Multiple mime types, just give the first one\r
- return current($mimes[$extension]);\r
- }\r
- else\r
- {\r
- return $mimes[$extension];\r
- }\r
- }\r
- else\r
- {\r
- return FALSE;\r
- }\r
- }\r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Symbolic Permissions\r
- *\r
- * Takes a numeric value representing a file's permissions and returns\r
- * standard symbolic notation representing that value\r
- *\r
- * @access public\r
- * @param int\r
- * @return string\r
- */ \r
-if ( ! function_exists('symbolic_permissions'))\r
-{\r
- function symbolic_permissions($perms)\r
- { \r
- if (($perms & 0xC000) == 0xC000)\r
- {\r
- $symbolic = 's'; // Socket\r
- }\r
- elseif (($perms & 0xA000) == 0xA000)\r
- {\r
- $symbolic = 'l'; // Symbolic Link\r
- }\r
- elseif (($perms & 0x8000) == 0x8000)\r
- {\r
- $symbolic = '-'; // Regular\r
- }\r
- elseif (($perms & 0x6000) == 0x6000)\r
- {\r
- $symbolic = 'b'; // Block special\r
- }\r
- elseif (($perms & 0x4000) == 0x4000)\r
- {\r
- $symbolic = 'd'; // Directory\r
- }\r
- elseif (($perms & 0x2000) == 0x2000)\r
- {\r
- $symbolic = 'c'; // Character special\r
- }\r
- elseif (($perms & 0x1000) == 0x1000)\r
- {\r
- $symbolic = 'p'; // FIFO pipe\r
- }\r
- else\r
- {\r
- $symbolic = 'u'; // Unknown\r
- }\r
-\r
- // Owner\r
- $symbolic .= (($perms & 0x0100) ? 'r' : '-');\r
- $symbolic .= (($perms & 0x0080) ? 'w' : '-');\r
- $symbolic .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-'));\r
-\r
- // Group\r
- $symbolic .= (($perms & 0x0020) ? 'r' : '-');\r
- $symbolic .= (($perms & 0x0010) ? 'w' : '-');\r
- $symbolic .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-'));\r
-\r
- // World\r
- $symbolic .= (($perms & 0x0004) ? 'r' : '-');\r
- $symbolic .= (($perms & 0x0002) ? 'w' : '-');\r
- $symbolic .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-'));\r
-\r
- return $symbolic; \r
- }\r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Octal Permissions\r
- *\r
- * Takes a numeric value representing a file's permissions and returns\r
- * a three character string representing the file's octal permissions\r
- *\r
- * @access public\r
- * @param int\r
- * @return string\r
- */ \r
-if ( ! function_exists('octal_permissions'))\r
-{\r
- function octal_permissions($perms)\r
- {\r
- return substr(sprintf('%o', $perms), -3);\r
- }\r
-}\r
-\r
-\r
-/* End of file file_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter File Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/file_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Read File
+ *
+ * Opens the file specfied in the path and returns it as a string.
+ *
+ * @access public
+ * @param string path to file
+ * @return string
+ */
+if ( ! function_exists('read_file'))
+{
+ function read_file($file)
+ {
+ if ( ! file_exists($file))
+ {
+ return FALSE;
+ }
+
+ if (function_exists('file_get_contents'))
+ {
+ return file_get_contents($file);
+ }
+
+ if ( ! $fp = @fopen($file, FOPEN_READ))
+ {
+ return FALSE;
+ }
+
+ flock($fp, LOCK_SH);
+
+ $data = '';
+ if (filesize($file) > 0)
+ {
+ $data =& fread($fp, filesize($file));
+ }
+
+ flock($fp, LOCK_UN);
+ fclose($fp);
+
+ return $data;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Write File
+ *
+ * Writes data to the file specified in the path.
+ * Creates a new file if non-existent.
+ *
+ * @access public
+ * @param string path to file
+ * @param string file data
+ * @return bool
+ */
+if ( ! function_exists('write_file'))
+{
+ function write_file($path, $data, $mode = FOPEN_WRITE_CREATE_DESTRUCTIVE)
+ {
+ if ( ! $fp = @fopen($path, $mode))
+ {
+ return FALSE;
+ }
+
+ flock($fp, LOCK_EX);
+ fwrite($fp, $data);
+ flock($fp, LOCK_UN);
+ fclose($fp);
+
+ return TRUE;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Delete Files
+ *
+ * Deletes all files contained in the supplied directory path.
+ * Files must be writable or owned by the system in order to be deleted.
+ * If the second parameter is set to TRUE, any directories contained
+ * within the supplied base directory will be nuked as well.
+ *
+ * @access public
+ * @param string path to file
+ * @param bool whether to delete any directories found in the path
+ * @return bool
+ */
+if ( ! function_exists('delete_files'))
+{
+ function delete_files($path, $del_dir = FALSE, $level = 0)
+ {
+ // Trim the trailing slash
+ $path = preg_replace("|^(.+?)/*$|", "\\1", $path);
+
+ if ( ! $current_dir = @opendir($path))
+ return;
+
+ while(FALSE !== ($filename = @readdir($current_dir)))
+ {
+ if ($filename != "." and $filename != "..")
+ {
+ if (is_dir($path.'/'.$filename))
+ {
+ // Ignore empty folders
+ if (substr($filename, 0, 1) != '.')
+ {
+ delete_files($path.'/'.$filename, $del_dir, $level + 1);
+ }
+ }
+ else
+ {
+ unlink($path.'/'.$filename);
+ }
+ }
+ }
+ @closedir($current_dir);
+
+ if ($del_dir == TRUE AND $level > 0)
+ {
+ @rmdir($path);
+ }
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Get Filenames
+ *
+ * Reads the specified directory and builds an array containing the filenames.
+ * Any sub-folders contained within the specified path are read as well.
+ *
+ * @access public
+ * @param string path to source
+ * @param bool whether to include the path as part of the filename
+ * @param bool internal variable to determine recursion status - do not use in calls
+ * @return array
+ */
+if ( ! function_exists('get_filenames'))
+{
+ function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE)
+ {
+ static $_filedata = array();
+
+ if ($fp = @opendir($source_dir))
+ {
+ // reset the array and make sure $source_dir has a trailing slash on the initial call
+ if ($_recursion === FALSE)
+ {
+ $_filedata = array();
+ $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
+ }
+
+ while (FALSE !== ($file = readdir($fp)))
+ {
+ if (@is_dir($source_dir.$file) && strncmp($file, '.', 1) !== 0)
+ {
+ get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE);
+ }
+ elseif (strncmp($file, '.', 1) !== 0)
+ {
+
+ $_filedata[] = ($include_path == TRUE) ? $source_dir.$file : $file;
+ }
+ }
+ return $_filedata;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Get Directory File Information
+ *
+ * Reads the specified directory and builds an array containing the filenames,
+ * filesize, dates, and permissions
+ *
+ * Any sub-folders contained within the specified path are read as well.
+ *
+ * @access public
+ * @param string path to source
+ * @param bool whether to include the path as part of the filename
+ * @param bool internal variable to determine recursion status - do not use in calls
+ * @return array
+ */
+if ( ! function_exists('get_dir_file_info'))
+{
+ function get_dir_file_info($source_dir, $include_path = FALSE, $_recursion = FALSE)
+ {
+ $_filedata = array();
+ $relative_path = $source_dir;
+
+ if ($fp = @opendir($source_dir))
+ {
+ // reset the array and make sure $source_dir has a trailing slash on the initial call
+ if ($_recursion === FALSE)
+ {
+ $_filedata = array();
+ $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
+ }
+
+ while (FALSE !== ($file = readdir($fp)))
+ {
+ if (@is_dir($source_dir.$file) && strncmp($file, '.', 1) !== 0)
+ {
+ get_dir_file_info($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE);
+ }
+ elseif (strncmp($file, '.', 1) !== 0)
+ {
+ $_filedata[$file] = get_file_info($source_dir.$file);
+ $_filedata[$file]['relative_path'] = $relative_path;
+ }
+ }
+ return $_filedata;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+* Get File Info
+*
+* Given a file and path, returns the name, path, size, date modified
+* Second parameter allows you to explicitly declare what information you want returned
+* Options are: name, server_path, size, date, readable, writable, executable, fileperms
+* Returns FALSE if the file cannot be found.
+*
+* @access public
+* @param string path to file
+* @param mixed array or comma separated string of information returned
+* @return array
+*/
+if ( ! function_exists('get_file_info'))
+{
+ function get_file_info($file, $returned_values = array('name', 'server_path', 'size', 'date'))
+ {
+
+ if ( ! file_exists($file))
+ {
+ return FALSE;
+ }
+
+ if (is_string($returned_values))
+ {
+ $returned_values = explode(',', $returned_values);
+ }
+
+ foreach ($returned_values as $key)
+ {
+ switch ($key)
+ {
+ case 'name':
+ $fileinfo['name'] = substr(strrchr($file, '/'), 1);
+ break;
+ case 'server_path':
+ $fileinfo['server_path'] = $file;
+ break;
+ case 'size':
+ $fileinfo['size'] = filesize($file);
+ break;
+ case 'date':
+ $fileinfo['date'] = filectime($file);
+ break;
+ case 'readable':
+ $fileinfo['readable'] = is_readable($file);
+ break;
+ case 'writable':
+ // There are known problems using is_weritable on IIS. It may not be reliable - consider fileperms()
+ $fileinfo['writable'] = is_writable($file);
+ break;
+ case 'executable':
+ $fileinfo['executable'] = is_executable($file);
+ break;
+ case 'fileperms':
+ $fileinfo['fileperms'] = fileperms($file);
+ break;
+ }
+ }
+
+ return $fileinfo;
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Get Mime by Extension
+ *
+ * Translates a file extension into a mime type based on config/mimes.php.
+ * Returns FALSE if it can't determine the type, or open the mime config file
+ *
+ * Note: this is NOT an accurate way of determining file mime types, and is here strictly as a convenience
+ * It should NOT be trusted, and should certainly NOT be used for security
+ *
+ * @access public
+ * @param string path to file
+ * @return mixed
+ */
+if ( ! function_exists('get_mime_by_extension'))
+{
+ function get_mime_by_extension($file)
+ {
+ $extension = substr(strrchr($file, '.'), 1);
+
+ global $mimes;
+
+ if ( ! is_array($mimes))
+ {
+ if ( ! require_once(APPPATH.'config/mimes.php'))
+ {
+ return FALSE;
+ }
+ }
+
+ if (array_key_exists($extension, $mimes))
+ {
+ if (is_array($mimes[$extension]))
+ {
+ // Multiple mime types, just give the first one
+ return current($mimes[$extension]);
+ }
+ else
+ {
+ return $mimes[$extension];
+ }
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Symbolic Permissions
+ *
+ * Takes a numeric value representing a file's permissions and returns
+ * standard symbolic notation representing that value
+ *
+ * @access public
+ * @param int
+ * @return string
+ */
+if ( ! function_exists('symbolic_permissions'))
+{
+ function symbolic_permissions($perms)
+ {
+ if (($perms & 0xC000) == 0xC000)
+ {
+ $symbolic = 's'; // Socket
+ }
+ elseif (($perms & 0xA000) == 0xA000)
+ {
+ $symbolic = 'l'; // Symbolic Link
+ }
+ elseif (($perms & 0x8000) == 0x8000)
+ {
+ $symbolic = '-'; // Regular
+ }
+ elseif (($perms & 0x6000) == 0x6000)
+ {
+ $symbolic = 'b'; // Block special
+ }
+ elseif (($perms & 0x4000) == 0x4000)
+ {
+ $symbolic = 'd'; // Directory
+ }
+ elseif (($perms & 0x2000) == 0x2000)
+ {
+ $symbolic = 'c'; // Character special
+ }
+ elseif (($perms & 0x1000) == 0x1000)
+ {
+ $symbolic = 'p'; // FIFO pipe
+ }
+ else
+ {
+ $symbolic = 'u'; // Unknown
+ }
+
+ // Owner
+ $symbolic .= (($perms & 0x0100) ? 'r' : '-');
+ $symbolic .= (($perms & 0x0080) ? 'w' : '-');
+ $symbolic .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-'));
+
+ // Group
+ $symbolic .= (($perms & 0x0020) ? 'r' : '-');
+ $symbolic .= (($perms & 0x0010) ? 'w' : '-');
+ $symbolic .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-'));
+
+ // World
+ $symbolic .= (($perms & 0x0004) ? 'r' : '-');
+ $symbolic .= (($perms & 0x0002) ? 'w' : '-');
+ $symbolic .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-'));
+
+ return $symbolic;
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Octal Permissions
+ *
+ * Takes a numeric value representing a file's permissions and returns
+ * a three character string representing the file's octal permissions
+ *
+ * @access public
+ * @param int
+ * @return string
+ */
+if ( ! function_exists('octal_permissions'))
+{
+ function octal_permissions($perms)
+ {
+ return substr(sprintf('%o', $perms), -3);
+ }
+}
+
+
+/* End of file file_helper.php */
/* Location: ./system/helpers/file_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Form Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/form_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Form Declaration\r
- *\r
- * Creates the opening portion of the form.\r
- *\r
- * @access public\r
- * @param string the URI segments of the form destination\r
- * @param array a key/value pair of attributes\r
- * @param array a key/value pair hidden data\r
- * @return string\r
- */ \r
-if ( ! function_exists('form_open'))\r
-{\r
- function form_open($action = '', $attributes = '', $hidden = array())\r
- {\r
- $CI =& get_instance();\r
-\r
- if ($attributes == '')\r
- {\r
- $attributes = 'method="post"';\r
- }\r
-\r
- $action = ( strpos($action, '://') === FALSE) ? $CI->config->site_url($action) : $action;\r
-\r
- $form = '<form action="'.$action.'"';\r
- \r
- $form .= _attributes_to_string($attributes, TRUE);\r
- \r
- $form .= '>';\r
-\r
- if (is_array($hidden) AND count($hidden) > 0)\r
- {\r
- $form .= form_hidden($hidden);\r
- }\r
-\r
- return $form;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Form Declaration - Multipart type\r
- *\r
- * Creates the opening portion of the form, but with "multipart/form-data".\r
- *\r
- * @access public\r
- * @param string the URI segments of the form destination\r
- * @param array a key/value pair of attributes\r
- * @param array a key/value pair hidden data\r
- * @return string\r
- */\r
-if ( ! function_exists('form_open_multipart'))\r
-{\r
- function form_open_multipart($action, $attributes = array(), $hidden = array())\r
- {\r
- $attributes['enctype'] = 'multipart/form-data';\r
- return form_open($action, $attributes, $hidden);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Hidden Input Field\r
- *\r
- * Generates hidden fields. You can pass a simple key/value string or an associative\r
- * array with multiple values.\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_hidden'))\r
-{\r
- function form_hidden($name, $value = '')\r
- {\r
- if ( ! is_array($name))\r
- {\r
- return '<input type="hidden" name="'.$name.'" value="'.form_prep($value).'" />';\r
- }\r
-\r
- $form = '';\r
-\r
- foreach ($name as $name => $value)\r
- {\r
- $form .= "\n";\r
- $form .= '<input type="hidden" name="'.$name.'" value="'.form_prep($value).'" />';\r
- }\r
-\r
- return $form;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Text Input Field\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_input'))\r
-{\r
- function form_input($data = '', $value = '', $extra = '')\r
- {\r
- $defaults = array('type' => 'text', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value);\r
-\r
- return "<input "._parse_form_attributes($data, $defaults).$extra." />";\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Password Field\r
- *\r
- * Identical to the input function but adds the "password" type\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_password'))\r
-{\r
- function form_password($data = '', $value = '', $extra = '')\r
- {\r
- if ( ! is_array($data))\r
- {\r
- $data = array('name' => $data);\r
- }\r
-\r
- $data['type'] = 'password';\r
- return form_input($data, $value, $extra);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Upload Field\r
- *\r
- * Identical to the input function but adds the "file" type\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_upload'))\r
-{\r
- function form_upload($data = '', $value = '', $extra = '')\r
- {\r
- if ( ! is_array($data))\r
- {\r
- $data = array('name' => $data);\r
- }\r
-\r
- $data['type'] = 'file';\r
- return form_input($data, $value, $extra);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Textarea field\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_textarea'))\r
-{\r
- function form_textarea($data = '', $value = '', $extra = '')\r
- {\r
- $defaults = array('name' => (( ! is_array($data)) ? $data : ''), 'cols' => '90', 'rows' => '12');\r
-\r
- if ( ! is_array($data) OR ! isset($data['value']))\r
- {\r
- $val = $value;\r
- }\r
- else\r
- {\r
- $val = $data['value']; \r
- unset($data['value']); // textareas don't use the value attribute\r
- }\r
-\r
- return "<textarea "._parse_form_attributes($data, $defaults).$extra.">".$val."</textarea>";\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Drop-down Menu\r
- *\r
- * @access public\r
- * @param string\r
- * @param array\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_dropdown'))\r
-{\r
- function form_dropdown($name = '', $options = array(), $selected = array(), $extra = '')\r
- {\r
- if ( ! is_array($selected))\r
- {\r
- $selected = array($selected);\r
- }\r
-\r
- // If no selected state was submitted we will attempt to set it automatically\r
- if (count($selected) === 0)\r
- {\r
- // If the form name appears in the $_POST array we have a winner!\r
- if (isset($_POST[$name]))\r
- {\r
- $selected = array($_POST[$name]);\r
- }\r
- }\r
-\r
- if ($extra != '') $extra = ' '.$extra;\r
-\r
- $multiple = (count($selected) > 1 && strpos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : '';\r
-\r
- $form = '<select name="'.$name.'"'.$extra.$multiple.">\n";\r
- \r
- foreach ($options as $key => $val)\r
- {\r
- $key = (string) $key;\r
- $val = (string) $val;\r
-\r
- $sel = (in_array($key, $selected))?' selected="selected"':'';\r
-\r
- $form .= '<option value="'.$key.'"'.$sel.'>'.$val."</option>\n";\r
- }\r
-\r
- $form .= '</select>';\r
-\r
- return $form;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Checkbox Field\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @param bool\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_checkbox'))\r
-{\r
- function form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '')\r
- {\r
- $defaults = array('type' => 'checkbox', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value);\r
-\r
- if (is_array($data) AND array_key_exists('checked', $data))\r
- {\r
- $checked = $data['checked'];\r
-\r
- if ($checked == FALSE)\r
- {\r
- unset($data['checked']);\r
- }\r
- else\r
- {\r
- $data['checked'] = 'checked';\r
- }\r
- }\r
-\r
- if ($checked == TRUE)\r
- {\r
- $defaults['checked'] = 'checked';\r
- }\r
- else\r
- {\r
- unset($defaults['checked']);\r
- }\r
-\r
- return "<input "._parse_form_attributes($data, $defaults).$extra." />";\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Radio Button\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @param bool\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_radio'))\r
-{\r
- function form_radio($data = '', $value = '', $checked = FALSE, $extra = '')\r
- {\r
- if ( ! is_array($data))\r
- { \r
- $data = array('name' => $data);\r
- }\r
-\r
- $data['type'] = 'radio';\r
- return form_checkbox($data, $value, $checked, $extra);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Submit Button\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_submit'))\r
-{ \r
- function form_submit($data = '', $value = '', $extra = '')\r
- {\r
- $defaults = array('type' => 'submit', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value);\r
-\r
- return "<input "._parse_form_attributes($data, $defaults).$extra." />";\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Reset Button\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_reset'))\r
-{\r
- function form_reset($data = '', $value = '', $extra = '')\r
- {\r
- $defaults = array('type' => 'reset', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value);\r
-\r
- return "<input "._parse_form_attributes($data, $defaults).$extra." />";\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Form Button\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_button'))\r
-{\r
- function form_button($data = '', $content = '', $extra = '')\r
- {\r
- $defaults = array('name' => (( ! is_array($data)) ? $data : ''), 'type' => 'submit');\r
-\r
- if ( is_array($data) AND isset($data['content']))\r
- {\r
- $content = $data['content'];\r
- unset($data['content']); // content is not an attribute\r
- }\r
-\r
- return "<button "._parse_form_attributes($data, $defaults).$extra.">".$content."</button>";\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Form Label Tag\r
- *\r
- * @access public\r
- * @param string The text to appear onscreen\r
- * @param string The id the label applies to\r
- * @param string Additional attributes\r
- * @return string\r
- */\r
-if ( ! function_exists('form_label'))\r
-{\r
- function form_label($label_text = '', $id = '', $attributes = array())\r
- {\r
-\r
- $label = '<label';\r
-\r
- if ($id != '')\r
- {\r
- $label .= " for=\"$id\"";\r
- }\r
-\r
- if (is_array($attributes) AND count($attributes) > 0)\r
- {\r
- foreach ($attributes as $key => $val)\r
- {\r
- $label .= ' '.$key.'="'.$val.'"';\r
- }\r
- }\r
-\r
- $label .= ">$label_text</label>";\r
-\r
- return $label;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-/**\r
- * Fieldset Tag\r
- *\r
- * Used to produce <fieldset><legend>text</legend>. To close fieldset\r
- * use form_fieldset_close()\r
- *\r
- * @access public\r
- * @param string The legend text\r
- * @param string Additional attributes\r
- * @return string\r
- */\r
-if ( ! function_exists('form_fieldset'))\r
-{\r
- function form_fieldset($legend_text = '', $attributes = array())\r
- {\r
- $fieldset = "<fieldset";\r
-\r
- $fieldset .= _attributes_to_string($attributes, FALSE);\r
-\r
- $fieldset .= ">\n";\r
-\r
- if ($legend_text != '')\r
- {\r
- $fieldset .= "<legend>$legend_text</legend>\n";\r
- }\r
-\r
- return $fieldset;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Fieldset Close Tag\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_fieldset_close'))\r
-{\r
- function form_fieldset_close($extra = '')\r
- {\r
- return "</fieldset>".$extra;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Form Close Tag\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_close'))\r
-{\r
- function form_close($extra = '')\r
- {\r
- return "</form>".$extra;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Form Prep\r
- *\r
- * Formats text so that it can be safely placed in a form field in the event it has HTML tags.\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_prep'))\r
-{\r
- function form_prep($str = '')\r
- {\r
- // if the field name is an array we do this recursively\r
- if (is_array($str))\r
- {\r
- foreach ($str as $key => $val)\r
- {\r
- $str[$key] = form_prep($val);\r
- }\r
-\r
- return $str;\r
- }\r
-\r
- if ($str === '')\r
- {\r
- return '';\r
- }\r
-\r
- $temp = '__TEMP_AMPERSANDS__';\r
-\r
- // Replace entities to temporary markers so that \r
- // htmlspecialchars won't mess them up\r
- $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str);\r
- $str = preg_replace("/&(\w+);/", "$temp\\1;", $str);\r
-\r
- $str = htmlspecialchars($str);\r
-\r
- // In case htmlspecialchars misses these.\r
- $str = str_replace(array("'", '"'), array("'", """), $str);\r
-\r
- // Decode the temp markers back to entities\r
- $str = preg_replace("/$temp(\d+);/","&#\\1;",$str);\r
- $str = preg_replace("/$temp(\w+);/","&\\1;",$str);\r
-\r
- return $str;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Form Value\r
- *\r
- * Grabs a value from the POST array for the specified field so you can\r
- * re-populate an input field or textarea. If Form Validation\r
- * is active it retrieves the info from the validation class\r
- *\r
- * @access public\r
- * @param string\r
- * @return mixed\r
- */\r
-if ( ! function_exists('set_value'))\r
-{\r
- function set_value($field = '', $default = '')\r
- {\r
- if (FALSE === ($OBJ =& _get_validation_object()))\r
- {\r
- if ( ! isset($_POST[$field]))\r
- {\r
- return $default;\r
- }\r
-\r
- return form_prep($_POST[$field]);\r
- }\r
-\r
- return form_prep($OBJ->set_value($field, $default));\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Set Select\r
- *\r
- * Let's you set the selected value of a <select> menu via data in the POST array.\r
- * If Form Validation is active it retrieves the info from the validation class\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @param bool\r
- * @return string\r
- */\r
-if ( ! function_exists('set_select'))\r
-{\r
- function set_select($field = '', $value = '', $default = FALSE)\r
- {\r
- $OBJ =& _get_validation_object();\r
-\r
- if ($OBJ === FALSE)\r
- {\r
- if ( ! isset($_POST[$field]))\r
- {\r
- if (count($_POST) === 0)\r
- {\r
- return ' selected="selected"';\r
- }\r
- return '';\r
- }\r
-\r
- $field = $_POST[$field];\r
-\r
- if (is_array($field))\r
- {\r
- if ( ! in_array($value, $field))\r
- {\r
- return '';\r
- }\r
- }\r
- else\r
- {\r
- if (($field == '' OR $value == '') OR ($field != $value))\r
- {\r
- return '';\r
- }\r
- }\r
-\r
- return ' selected="selected"';\r
- }\r
-\r
- return $OBJ->set_select($field, $value, $default);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Set Checkbox\r
- *\r
- * Let's you set the selected value of a checkbox via the value in the POST array.\r
- * If Form Validation is active it retrieves the info from the validation class\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @param bool\r
- * @return string\r
- */\r
-if ( ! function_exists('set_checkbox'))\r
-{\r
- function set_checkbox($field = '', $value = '', $default = FALSE)\r
- {\r
- $OBJ =& _get_validation_object();\r
-\r
- if ($OBJ === FALSE)\r
- { \r
- if ( ! isset($_POST[$field]))\r
- {\r
- if (count($_POST) === 0)\r
- {\r
- return ' checked="checked"';\r
- }\r
- return '';\r
- }\r
-\r
- $field = $_POST[$field];\r
- \r
- if (is_array($field))\r
- {\r
- if ( ! in_array($value, $field))\r
- {\r
- return '';\r
- }\r
- }\r
- else\r
- {\r
- if (($field == '' OR $value == '') OR ($field != $value))\r
- {\r
- return '';\r
- }\r
- }\r
-\r
- return ' checked="checked"';\r
- }\r
-\r
- return $OBJ->set_checkbox($field, $value, $default);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Set Radio\r
- *\r
- * Let's you set the selected value of a radio field via info in the POST array.\r
- * If Form Validation is active it retrieves the info from the validation class\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @param bool\r
- * @return string\r
- */\r
-if ( ! function_exists('set_radio'))\r
-{\r
- function set_radio($field = '', $value = '', $default = FALSE)\r
- {\r
- $OBJ =& _get_validation_object();\r
-\r
- if ($OBJ === FALSE)\r
- {\r
- if ( ! isset($_POST[$field]))\r
- {\r
- if (count($_POST) === 0)\r
- {\r
- return ' checked="checked"';\r
- }\r
- return '';\r
- }\r
-\r
- $field = $_POST[$field];\r
- \r
- if (is_array($field))\r
- {\r
- if ( ! in_array($value, $field))\r
- {\r
- return '';\r
- }\r
- }\r
- else\r
- {\r
- if (($field == '' OR $value == '') OR ($field != $value))\r
- {\r
- return '';\r
- }\r
- }\r
-\r
- return ' checked="checked"';\r
- }\r
-\r
- return $OBJ->set_radio($field, $value, $default);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Form Error\r
- *\r
- * Returns the error for a specific form field. This is a helper for the\r
- * form validation class.\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('form_error'))\r
-{\r
- function form_error($field = '', $prefix = '', $suffix = '')\r
- {\r
- if (FALSE === ($OBJ =& _get_validation_object()))\r
- {\r
- return '';\r
- }\r
-\r
- return $OBJ->error($field, $prefix, $suffix);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Validation Error String\r
- *\r
- * Returns all the errors associated with a form submission. This is a helper\r
- * function for the form validation class.\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('validation_errors'))\r
-{\r
- function validation_errors($prefix = '', $suffix = '')\r
- {\r
- if (FALSE === ($OBJ =& _get_validation_object()))\r
- {\r
- return '';\r
- }\r
-\r
- return $OBJ->error_string($prefix, $suffix);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Parse the form attributes\r
- *\r
- * Helper function used by some of the form helpers\r
- *\r
- * @access private\r
- * @param array\r
- * @param array\r
- * @return string\r
- */\r
-if ( ! function_exists('_parse_form_attributes'))\r
-{\r
- function _parse_form_attributes($attributes, $default)\r
- {\r
- if (is_array($attributes))\r
- {\r
- foreach ($default as $key => $val)\r
- {\r
- if (isset($attributes[$key]))\r
- {\r
- $default[$key] = $attributes[$key];\r
- unset($attributes[$key]);\r
- }\r
- }\r
-\r
- if (count($attributes) > 0)\r
- {\r
- $default = array_merge($default, $attributes);\r
- }\r
- }\r
-\r
- $att = '';\r
-\r
- foreach ($default as $key => $val)\r
- {\r
- if ($key == 'value')\r
- {\r
- $val = form_prep($val);\r
- }\r
-\r
- $att .= $key . '="' . $val . '" ';\r
- }\r
-\r
- return $att;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Attributes To String\r
- *\r
- * Helper function used by some of the form helpers\r
- *\r
- * @access private\r
- * @param mixed\r
- * @param bool\r
- * @return string\r
- */\r
-if ( ! function_exists('_attributes_to_string'))\r
-{\r
- function _attributes_to_string($attributes, $formtag = FALSE)\r
- {\r
- if (is_string($attributes) AND strlen($attributes) > 0)\r
- {\r
- if ($formtag == TRUE AND strpos($attributes, 'method=') === FALSE)\r
- {\r
- $attributes .= ' method="post"';\r
- }\r
-\r
- return ' '.$attributes;\r
- }\r
- \r
- if (is_object($attributes) AND count($attributes) > 0)\r
- {\r
- $attributes = (array)$attributes;\r
- }\r
-\r
- if (is_array($attributes) AND count($attributes) > 0)\r
- {\r
- $atts = '';\r
-\r
- if ( ! isset($attributes['method']) AND $formtag === TRUE)\r
- {\r
- $atts .= ' method="post"';\r
- }\r
-\r
- foreach ($attributes as $key => $val)\r
- {\r
- $atts .= ' '.$key.'="'.$val.'"';\r
- }\r
-\r
- return $atts;\r
- }\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Validation Object\r
- *\r
- * Determines what the form validation class was instantiated as, fetches\r
- * the object and returns it.\r
- *\r
- * @access private\r
- * @return mixed\r
- */\r
-if ( ! function_exists('_get_validation_object'))\r
-{\r
- function &_get_validation_object()\r
- {\r
- $CI =& get_instance();\r
-\r
- // We set this as a variable since we're returning by reference\r
- $return = FALSE;\r
-\r
- if ( ! isset($CI->load->_ci_classes) OR ! isset($CI->load->_ci_classes['form_validation']))\r
- {\r
- return $return;\r
- }\r
-\r
- $object = $CI->load->_ci_classes['form_validation'];\r
-\r
- if ( ! isset($CI->$object) OR ! is_object($CI->$object))\r
- {\r
- return $return;\r
- }\r
-\r
- return $CI->$object;\r
- }\r
-}\r
-\r
-\r
-/* End of file form_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Form Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/form_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Form Declaration
+ *
+ * Creates the opening portion of the form.
+ *
+ * @access public
+ * @param string the URI segments of the form destination
+ * @param array a key/value pair of attributes
+ * @param array a key/value pair hidden data
+ * @return string
+ */
+if ( ! function_exists('form_open'))
+{
+ function form_open($action = '', $attributes = '', $hidden = array())
+ {
+ $CI =& get_instance();
+
+ if ($attributes == '')
+ {
+ $attributes = 'method="post"';
+ }
+
+ $action = ( strpos($action, '://') === FALSE) ? $CI->config->site_url($action) : $action;
+
+ $form = '<form action="'.$action.'"';
+
+ $form .= _attributes_to_string($attributes, TRUE);
+
+ $form .= '>';
+
+ if (is_array($hidden) AND count($hidden) > 0)
+ {
+ $form .= form_hidden($hidden);
+ }
+
+ return $form;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Form Declaration - Multipart type
+ *
+ * Creates the opening portion of the form, but with "multipart/form-data".
+ *
+ * @access public
+ * @param string the URI segments of the form destination
+ * @param array a key/value pair of attributes
+ * @param array a key/value pair hidden data
+ * @return string
+ */
+if ( ! function_exists('form_open_multipart'))
+{
+ function form_open_multipart($action, $attributes = array(), $hidden = array())
+ {
+ $attributes['enctype'] = 'multipart/form-data';
+ return form_open($action, $attributes, $hidden);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Hidden Input Field
+ *
+ * Generates hidden fields. You can pass a simple key/value string or an associative
+ * array with multiple values.
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_hidden'))
+{
+ function form_hidden($name, $value = '')
+ {
+ if ( ! is_array($name))
+ {
+ return '<input type="hidden" name="'.$name.'" value="'.form_prep($value).'" />';
+ }
+
+ $form = '';
+
+ foreach ($name as $name => $value)
+ {
+ $form .= "\n";
+ $form .= '<input type="hidden" name="'.$name.'" value="'.form_prep($value).'" />';
+ }
+
+ return $form;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Text Input Field
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_input'))
+{
+ function form_input($data = '', $value = '', $extra = '')
+ {
+ $defaults = array('type' => 'text', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value);
+
+ return "<input "._parse_form_attributes($data, $defaults).$extra." />";
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Password Field
+ *
+ * Identical to the input function but adds the "password" type
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_password'))
+{
+ function form_password($data = '', $value = '', $extra = '')
+ {
+ if ( ! is_array($data))
+ {
+ $data = array('name' => $data);
+ }
+
+ $data['type'] = 'password';
+ return form_input($data, $value, $extra);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Upload Field
+ *
+ * Identical to the input function but adds the "file" type
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_upload'))
+{
+ function form_upload($data = '', $value = '', $extra = '')
+ {
+ if ( ! is_array($data))
+ {
+ $data = array('name' => $data);
+ }
+
+ $data['type'] = 'file';
+ return form_input($data, $value, $extra);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Textarea field
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_textarea'))
+{
+ function form_textarea($data = '', $value = '', $extra = '')
+ {
+ $defaults = array('name' => (( ! is_array($data)) ? $data : ''), 'cols' => '90', 'rows' => '12');
+
+ if ( ! is_array($data) OR ! isset($data['value']))
+ {
+ $val = $value;
+ }
+ else
+ {
+ $val = $data['value'];
+ unset($data['value']); // textareas don't use the value attribute
+ }
+
+ return "<textarea "._parse_form_attributes($data, $defaults).$extra.">".$val."</textarea>";
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Drop-down Menu
+ *
+ * @access public
+ * @param string
+ * @param array
+ * @param string
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_dropdown'))
+{
+ function form_dropdown($name = '', $options = array(), $selected = array(), $extra = '')
+ {
+ if ( ! is_array($selected))
+ {
+ $selected = array($selected);
+ }
+
+ // If no selected state was submitted we will attempt to set it automatically
+ if (count($selected) === 0)
+ {
+ // If the form name appears in the $_POST array we have a winner!
+ if (isset($_POST[$name]))
+ {
+ $selected = array($_POST[$name]);
+ }
+ }
+
+ if ($extra != '') $extra = ' '.$extra;
+
+ $multiple = (count($selected) > 1 && strpos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : '';
+
+ $form = '<select name="'.$name.'"'.$extra.$multiple.">\n";
+
+ foreach ($options as $key => $val)
+ {
+ $key = (string) $key;
+ $val = (string) $val;
+
+ $sel = (in_array($key, $selected))?' selected="selected"':'';
+
+ $form .= '<option value="'.$key.'"'.$sel.'>'.$val."</option>\n";
+ }
+
+ $form .= '</select>';
+
+ return $form;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Checkbox Field
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @param bool
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_checkbox'))
+{
+ function form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '')
+ {
+ $defaults = array('type' => 'checkbox', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value);
+
+ if (is_array($data) AND array_key_exists('checked', $data))
+ {
+ $checked = $data['checked'];
+
+ if ($checked == FALSE)
+ {
+ unset($data['checked']);
+ }
+ else
+ {
+ $data['checked'] = 'checked';
+ }
+ }
+
+ if ($checked == TRUE)
+ {
+ $defaults['checked'] = 'checked';
+ }
+ else
+ {
+ unset($defaults['checked']);
+ }
+
+ return "<input "._parse_form_attributes($data, $defaults).$extra." />";
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Radio Button
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @param bool
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_radio'))
+{
+ function form_radio($data = '', $value = '', $checked = FALSE, $extra = '')
+ {
+ if ( ! is_array($data))
+ {
+ $data = array('name' => $data);
+ }
+
+ $data['type'] = 'radio';
+ return form_checkbox($data, $value, $checked, $extra);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Submit Button
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_submit'))
+{
+ function form_submit($data = '', $value = '', $extra = '')
+ {
+ $defaults = array('type' => 'submit', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value);
+
+ return "<input "._parse_form_attributes($data, $defaults).$extra." />";
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Reset Button
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_reset'))
+{
+ function form_reset($data = '', $value = '', $extra = '')
+ {
+ $defaults = array('type' => 'reset', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value);
+
+ return "<input "._parse_form_attributes($data, $defaults).$extra." />";
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Form Button
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_button'))
+{
+ function form_button($data = '', $content = '', $extra = '')
+ {
+ $defaults = array('name' => (( ! is_array($data)) ? $data : ''), 'type' => 'submit');
+
+ if ( is_array($data) AND isset($data['content']))
+ {
+ $content = $data['content'];
+ unset($data['content']); // content is not an attribute
+ }
+
+ return "<button "._parse_form_attributes($data, $defaults).$extra.">".$content."</button>";
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Form Label Tag
+ *
+ * @access public
+ * @param string The text to appear onscreen
+ * @param string The id the label applies to
+ * @param string Additional attributes
+ * @return string
+ */
+if ( ! function_exists('form_label'))
+{
+ function form_label($label_text = '', $id = '', $attributes = array())
+ {
+
+ $label = '<label';
+
+ if ($id != '')
+ {
+ $label .= " for=\"$id\"";
+ }
+
+ if (is_array($attributes) AND count($attributes) > 0)
+ {
+ foreach ($attributes as $key => $val)
+ {
+ $label .= ' '.$key.'="'.$val.'"';
+ }
+ }
+
+ $label .= ">$label_text</label>";
+
+ return $label;
+ }
+}
+
+// ------------------------------------------------------------------------
+/**
+ * Fieldset Tag
+ *
+ * Used to produce <fieldset><legend>text</legend>. To close fieldset
+ * use form_fieldset_close()
+ *
+ * @access public
+ * @param string The legend text
+ * @param string Additional attributes
+ * @return string
+ */
+if ( ! function_exists('form_fieldset'))
+{
+ function form_fieldset($legend_text = '', $attributes = array())
+ {
+ $fieldset = "<fieldset";
+
+ $fieldset .= _attributes_to_string($attributes, FALSE);
+
+ $fieldset .= ">\n";
+
+ if ($legend_text != '')
+ {
+ $fieldset .= "<legend>$legend_text</legend>\n";
+ }
+
+ return $fieldset;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Fieldset Close Tag
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_fieldset_close'))
+{
+ function form_fieldset_close($extra = '')
+ {
+ return "</fieldset>".$extra;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Form Close Tag
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_close'))
+{
+ function form_close($extra = '')
+ {
+ return "</form>".$extra;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Form Prep
+ *
+ * Formats text so that it can be safely placed in a form field in the event it has HTML tags.
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_prep'))
+{
+ function form_prep($str = '')
+ {
+ // if the field name is an array we do this recursively
+ if (is_array($str))
+ {
+ foreach ($str as $key => $val)
+ {
+ $str[$key] = form_prep($val);
+ }
+
+ return $str;
+ }
+
+ if ($str === '')
+ {
+ return '';
+ }
+
+ $temp = '__TEMP_AMPERSANDS__';
+
+ // Replace entities to temporary markers so that
+ // htmlspecialchars won't mess them up
+ $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str);
+ $str = preg_replace("/&(\w+);/", "$temp\\1;", $str);
+
+ $str = htmlspecialchars($str);
+
+ // In case htmlspecialchars misses these.
+ $str = str_replace(array("'", '"'), array("'", """), $str);
+
+ // Decode the temp markers back to entities
+ $str = preg_replace("/$temp(\d+);/","&#\\1;",$str);
+ $str = preg_replace("/$temp(\w+);/","&\\1;",$str);
+
+ return $str;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Form Value
+ *
+ * Grabs a value from the POST array for the specified field so you can
+ * re-populate an input field or textarea. If Form Validation
+ * is active it retrieves the info from the validation class
+ *
+ * @access public
+ * @param string
+ * @return mixed
+ */
+if ( ! function_exists('set_value'))
+{
+ function set_value($field = '', $default = '')
+ {
+ if (FALSE === ($OBJ =& _get_validation_object()))
+ {
+ if ( ! isset($_POST[$field]))
+ {
+ return $default;
+ }
+
+ return form_prep($_POST[$field]);
+ }
+
+ return form_prep($OBJ->set_value($field, $default));
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Set Select
+ *
+ * Let's you set the selected value of a <select> menu via data in the POST array.
+ * If Form Validation is active it retrieves the info from the validation class
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @param bool
+ * @return string
+ */
+if ( ! function_exists('set_select'))
+{
+ function set_select($field = '', $value = '', $default = FALSE)
+ {
+ $OBJ =& _get_validation_object();
+
+ if ($OBJ === FALSE)
+ {
+ if ( ! isset($_POST[$field]))
+ {
+ if (count($_POST) === 0)
+ {
+ return ' selected="selected"';
+ }
+ return '';
+ }
+
+ $field = $_POST[$field];
+
+ if (is_array($field))
+ {
+ if ( ! in_array($value, $field))
+ {
+ return '';
+ }
+ }
+ else
+ {
+ if (($field == '' OR $value == '') OR ($field != $value))
+ {
+ return '';
+ }
+ }
+
+ return ' selected="selected"';
+ }
+
+ return $OBJ->set_select($field, $value, $default);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Set Checkbox
+ *
+ * Let's you set the selected value of a checkbox via the value in the POST array.
+ * If Form Validation is active it retrieves the info from the validation class
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @param bool
+ * @return string
+ */
+if ( ! function_exists('set_checkbox'))
+{
+ function set_checkbox($field = '', $value = '', $default = FALSE)
+ {
+ $OBJ =& _get_validation_object();
+
+ if ($OBJ === FALSE)
+ {
+ if ( ! isset($_POST[$field]))
+ {
+ if (count($_POST) === 0)
+ {
+ return ' checked="checked"';
+ }
+ return '';
+ }
+
+ $field = $_POST[$field];
+
+ if (is_array($field))
+ {
+ if ( ! in_array($value, $field))
+ {
+ return '';
+ }
+ }
+ else
+ {
+ if (($field == '' OR $value == '') OR ($field != $value))
+ {
+ return '';
+ }
+ }
+
+ return ' checked="checked"';
+ }
+
+ return $OBJ->set_checkbox($field, $value, $default);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Set Radio
+ *
+ * Let's you set the selected value of a radio field via info in the POST array.
+ * If Form Validation is active it retrieves the info from the validation class
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @param bool
+ * @return string
+ */
+if ( ! function_exists('set_radio'))
+{
+ function set_radio($field = '', $value = '', $default = FALSE)
+ {
+ $OBJ =& _get_validation_object();
+
+ if ($OBJ === FALSE)
+ {
+ if ( ! isset($_POST[$field]))
+ {
+ if (count($_POST) === 0)
+ {
+ return ' checked="checked"';
+ }
+ return '';
+ }
+
+ $field = $_POST[$field];
+
+ if (is_array($field))
+ {
+ if ( ! in_array($value, $field))
+ {
+ return '';
+ }
+ }
+ else
+ {
+ if (($field == '' OR $value == '') OR ($field != $value))
+ {
+ return '';
+ }
+ }
+
+ return ' checked="checked"';
+ }
+
+ return $OBJ->set_radio($field, $value, $default);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Form Error
+ *
+ * Returns the error for a specific form field. This is a helper for the
+ * form validation class.
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('form_error'))
+{
+ function form_error($field = '', $prefix = '', $suffix = '')
+ {
+ if (FALSE === ($OBJ =& _get_validation_object()))
+ {
+ return '';
+ }
+
+ return $OBJ->error($field, $prefix, $suffix);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Validation Error String
+ *
+ * Returns all the errors associated with a form submission. This is a helper
+ * function for the form validation class.
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('validation_errors'))
+{
+ function validation_errors($prefix = '', $suffix = '')
+ {
+ if (FALSE === ($OBJ =& _get_validation_object()))
+ {
+ return '';
+ }
+
+ return $OBJ->error_string($prefix, $suffix);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Parse the form attributes
+ *
+ * Helper function used by some of the form helpers
+ *
+ * @access private
+ * @param array
+ * @param array
+ * @return string
+ */
+if ( ! function_exists('_parse_form_attributes'))
+{
+ function _parse_form_attributes($attributes, $default)
+ {
+ if (is_array($attributes))
+ {
+ foreach ($default as $key => $val)
+ {
+ if (isset($attributes[$key]))
+ {
+ $default[$key] = $attributes[$key];
+ unset($attributes[$key]);
+ }
+ }
+
+ if (count($attributes) > 0)
+ {
+ $default = array_merge($default, $attributes);
+ }
+ }
+
+ $att = '';
+
+ foreach ($default as $key => $val)
+ {
+ if ($key == 'value')
+ {
+ $val = form_prep($val);
+ }
+
+ $att .= $key . '="' . $val . '" ';
+ }
+
+ return $att;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Attributes To String
+ *
+ * Helper function used by some of the form helpers
+ *
+ * @access private
+ * @param mixed
+ * @param bool
+ * @return string
+ */
+if ( ! function_exists('_attributes_to_string'))
+{
+ function _attributes_to_string($attributes, $formtag = FALSE)
+ {
+ if (is_string($attributes) AND strlen($attributes) > 0)
+ {
+ if ($formtag == TRUE AND strpos($attributes, 'method=') === FALSE)
+ {
+ $attributes .= ' method="post"';
+ }
+
+ return ' '.$attributes;
+ }
+
+ if (is_object($attributes) AND count($attributes) > 0)
+ {
+ $attributes = (array)$attributes;
+ }
+
+ if (is_array($attributes) AND count($attributes) > 0)
+ {
+ $atts = '';
+
+ if ( ! isset($attributes['method']) AND $formtag === TRUE)
+ {
+ $atts .= ' method="post"';
+ }
+
+ foreach ($attributes as $key => $val)
+ {
+ $atts .= ' '.$key.'="'.$val.'"';
+ }
+
+ return $atts;
+ }
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Validation Object
+ *
+ * Determines what the form validation class was instantiated as, fetches
+ * the object and returns it.
+ *
+ * @access private
+ * @return mixed
+ */
+if ( ! function_exists('_get_validation_object'))
+{
+ function &_get_validation_object()
+ {
+ $CI =& get_instance();
+
+ // We set this as a variable since we're returning by reference
+ $return = FALSE;
+
+ if ( ! isset($CI->load->_ci_classes) OR ! isset($CI->load->_ci_classes['form_validation']))
+ {
+ return $return;
+ }
+
+ $object = $CI->load->_ci_classes['form_validation'];
+
+ if ( ! isset($CI->$object) OR ! is_object($CI->$object))
+ {
+ return $return;
+ }
+
+ return $CI->$object;
+ }
+}
+
+
+/* End of file form_helper.php */
/* Location: ./system/helpers/form_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter HTML Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/html_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Heading\r
- *\r
- * Generates an HTML heading tag. First param is the data.\r
- * Second param is the size of the heading tag.\r
- *\r
- * @access public\r
- * @param string\r
- * @param integer\r
- * @return string\r
- */ \r
-if ( ! function_exists('heading'))\r
-{\r
- function heading($data = '', $h = '1')\r
- {\r
- return "<h".$h.">".$data."</h".$h.">";\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Unordered List\r
- *\r
- * Generates an HTML unordered list from an single or multi-dimensional array.\r
- *\r
- * @access public\r
- * @param array\r
- * @param mixed\r
- * @return string\r
- */ \r
-if ( ! function_exists('ul'))\r
-{\r
- function ul($list, $attributes = '')\r
- {\r
- return _list('ul', $list, $attributes);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Ordered List\r
- *\r
- * Generates an HTML ordered list from an single or multi-dimensional array.\r
- *\r
- * @access public\r
- * @param array\r
- * @param mixed\r
- * @return string\r
- */ \r
-if ( ! function_exists('ol'))\r
-{\r
- function ol($list, $attributes = '')\r
- {\r
- return _list('ol', $list, $attributes);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Generates the list\r
- *\r
- * Generates an HTML ordered list from an single or multi-dimensional array.\r
- *\r
- * @access private\r
- * @param string\r
- * @param mixed \r
- * @param mixed \r
- * @param intiger \r
- * @return string\r
- */ \r
-if ( ! function_exists('_list'))\r
-{\r
- function _list($type = 'ul', $list, $attributes = '', $depth = 0)\r
- {\r
- // If an array wasn't submitted there's nothing to do...\r
- if ( ! is_array($list))\r
- {\r
- return $list;\r
- }\r
- \r
- // Set the indentation based on the depth\r
- $out = str_repeat(" ", $depth);\r
- \r
- // Were any attributes submitted? If so generate a string\r
- if (is_array($attributes))\r
- {\r
- $atts = '';\r
- foreach ($attributes as $key => $val)\r
- {\r
- $atts .= ' ' . $key . '="' . $val . '"';\r
- }\r
- $attributes = $atts;\r
- }\r
- \r
- // Write the opening list tag\r
- $out .= "<".$type.$attributes.">\n";\r
-\r
- // Cycle through the list elements. If an array is \r
- // encountered we will recursively call _list()\r
-\r
- static $_last_list_item = '';\r
- foreach ($list as $key => $val)\r
- { \r
- $_last_list_item = $key;\r
-\r
- $out .= str_repeat(" ", $depth + 2);\r
- $out .= "<li>";\r
- \r
- if ( ! is_array($val))\r
- {\r
- $out .= $val;\r
- }\r
- else\r
- {\r
- $out .= $_last_list_item."\n";\r
- $out .= _list($type, $val, '', $depth + 4);\r
- $out .= str_repeat(" ", $depth + 2);\r
- }\r
-\r
- $out .= "</li>\n"; \r
- }\r
-\r
- // Set the indentation for the closing tag\r
- $out .= str_repeat(" ", $depth);\r
- \r
- // Write the closing list tag\r
- $out .= "</".$type.">\n";\r
-\r
- return $out;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Generates HTML BR tags based on number supplied\r
- *\r
- * @access public\r
- * @param integer\r
- * @return string\r
- */ \r
-if ( ! function_exists('br'))\r
-{\r
- function br($num = 1)\r
- {\r
- return str_repeat("<br />", $num);\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Image\r
- *\r
- * Generates an <img /> element\r
- *\r
- * @access public\r
- * @param mixed\r
- * @return string\r
- */ \r
-if ( ! function_exists('img'))\r
-{\r
- function img($src = '', $index_page = FALSE)\r
- {\r
- if ( ! is_array($src) )\r
- {\r
- $src = array('src' => $src);\r
- }\r
-\r
- $img = '<img';\r
- \r
- foreach ($src as $k=>$v)\r
- {\r
-\r
- if ($k == 'src' AND strpos($v, '://') === FALSE)\r
- {\r
- $CI =& get_instance();\r
-\r
- if ($index_page === TRUE)\r
- {\r
- $img .= ' src="'.$CI->config->site_url($v).'" ';\r
- }\r
- else\r
- {\r
- $img .= ' src="'.$CI->config->slash_item('base_url').$v.'" ';\r
- }\r
- }\r
- else\r
- {\r
- $img .= " $k=\"$v\" ";\r
- }\r
- }\r
-\r
- $img .= '/>';\r
-\r
- return $img;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Link\r
- *\r
- * Generates link to a CSS file\r
- *\r
- * @access public\r
- * @param mixed stylesheet hrefs or an array\r
- * @param string rel\r
- * @param string type\r
- * @param string title\r
- * @param string media\r
- * @param boolean should index_page be added to the css path \r
- * @return string\r
- */ \r
-if ( ! function_exists('link_tag'))\r
-{\r
- function link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = '', $media = '', $index_page = FALSE)\r
- {\r
- $CI =& get_instance();\r
-\r
- $link = '<link ';\r
-\r
- if (is_array($href))\r
- {\r
- foreach ($href as $k=>$v)\r
- {\r
- if ($k == 'href' AND strpos($v, '://') === FALSE)\r
- {\r
- if ($index_page === TRUE)\r
- {\r
- $link .= ' href="'.$CI->config->site_url($v).'" ';\r
- }\r
- else\r
- {\r
- $link .= ' href="'.$CI->config->slash_item('base_url').$v.'" ';\r
- }\r
- }\r
- else\r
- {\r
- $link .= "$k=\"$v\" ";\r
- }\r
- }\r
- \r
- $link .= "/>";\r
- }\r
- else\r
- {\r
- if ( strpos($href, '://') !== FALSE)\r
- {\r
- $link .= ' href="'.$href.'" ';\r
- }\r
- elseif ($index_page === TRUE)\r
- {\r
- $link .= ' href="'.$CI->config->site_url($href).'" ';\r
- }\r
- else\r
- {\r
- $link .= ' href="'.$CI->config->slash_item('base_url').$href.'" ';\r
- }\r
- \r
- $link .= 'rel="'.$rel.'" type="'.$type.'" ';\r
- \r
- if ($media != '')\r
- {\r
- $link .= 'media="'.$media.'" ';\r
- }\r
-\r
- if ($title != '')\r
- {\r
- $link .= 'title="'.$title.'" ';\r
- }\r
- \r
- $link .= '/>';\r
- }\r
-\r
- \r
- return $link;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Generates meta tags from an array of key/values\r
- *\r
- * @access public\r
- * @param array\r
- * @return string\r
- */ \r
-if ( ! function_exists('meta'))\r
-{\r
- function meta($name = '', $content = '', $type = 'name', $newline = "\n")\r
- {\r
- // Since we allow the data to be passes as a string, a simple array\r
- // or a multidimensional one, we need to do a little prepping.\r
- if ( ! is_array($name))\r
- {\r
- $name = array(array('name' => $name, 'content' => $content, 'type' => $type, 'newline' => $newline));\r
- }\r
- else\r
- {\r
- // Turn single array into multidimensional\r
- if (isset($name['name']))\r
- {\r
- $name = array($name);\r
- }\r
- }\r
- \r
- $str = '';\r
- foreach ($name as $meta)\r
- {\r
- $type = ( ! isset($meta['type']) OR $meta['type'] == 'name') ? 'name' : 'http-equiv';\r
- $name = ( ! isset($meta['name'])) ? '' : $meta['name'];\r
- $content = ( ! isset($meta['content'])) ? '' : $meta['content'];\r
- $newline = ( ! isset($meta['newline'])) ? "\n" : $meta['newline'];\r
- \r
- $str .= '<meta '.$type.'="'.$name.'" content="'.$content.'" />'.$newline;\r
- }\r
-\r
- return $str;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Generates non-breaking space entities based on number supplied\r
- *\r
- * @access public\r
- * @param integer\r
- * @return string\r
- */ \r
-if ( ! function_exists('nbs'))\r
-{\r
- function nbs($num = 1)\r
- {\r
- return str_repeat(" ", $num);\r
- }\r
-}\r
-\r
-\r
-/* End of file html_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter HTML Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/html_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Heading
+ *
+ * Generates an HTML heading tag. First param is the data.
+ * Second param is the size of the heading tag.
+ *
+ * @access public
+ * @param string
+ * @param integer
+ * @return string
+ */
+if ( ! function_exists('heading'))
+{
+ function heading($data = '', $h = '1')
+ {
+ return "<h".$h.">".$data."</h".$h.">";
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Unordered List
+ *
+ * Generates an HTML unordered list from an single or multi-dimensional array.
+ *
+ * @access public
+ * @param array
+ * @param mixed
+ * @return string
+ */
+if ( ! function_exists('ul'))
+{
+ function ul($list, $attributes = '')
+ {
+ return _list('ul', $list, $attributes);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Ordered List
+ *
+ * Generates an HTML ordered list from an single or multi-dimensional array.
+ *
+ * @access public
+ * @param array
+ * @param mixed
+ * @return string
+ */
+if ( ! function_exists('ol'))
+{
+ function ol($list, $attributes = '')
+ {
+ return _list('ol', $list, $attributes);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Generates the list
+ *
+ * Generates an HTML ordered list from an single or multi-dimensional array.
+ *
+ * @access private
+ * @param string
+ * @param mixed
+ * @param mixed
+ * @param intiger
+ * @return string
+ */
+if ( ! function_exists('_list'))
+{
+ function _list($type = 'ul', $list, $attributes = '', $depth = 0)
+ {
+ // If an array wasn't submitted there's nothing to do...
+ if ( ! is_array($list))
+ {
+ return $list;
+ }
+
+ // Set the indentation based on the depth
+ $out = str_repeat(" ", $depth);
+
+ // Were any attributes submitted? If so generate a string
+ if (is_array($attributes))
+ {
+ $atts = '';
+ foreach ($attributes as $key => $val)
+ {
+ $atts .= ' ' . $key . '="' . $val . '"';
+ }
+ $attributes = $atts;
+ }
+
+ // Write the opening list tag
+ $out .= "<".$type.$attributes.">\n";
+
+ // Cycle through the list elements. If an array is
+ // encountered we will recursively call _list()
+
+ static $_last_list_item = '';
+ foreach ($list as $key => $val)
+ {
+ $_last_list_item = $key;
+
+ $out .= str_repeat(" ", $depth + 2);
+ $out .= "<li>";
+
+ if ( ! is_array($val))
+ {
+ $out .= $val;
+ }
+ else
+ {
+ $out .= $_last_list_item."\n";
+ $out .= _list($type, $val, '', $depth + 4);
+ $out .= str_repeat(" ", $depth + 2);
+ }
+
+ $out .= "</li>\n";
+ }
+
+ // Set the indentation for the closing tag
+ $out .= str_repeat(" ", $depth);
+
+ // Write the closing list tag
+ $out .= "</".$type.">\n";
+
+ return $out;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Generates HTML BR tags based on number supplied
+ *
+ * @access public
+ * @param integer
+ * @return string
+ */
+if ( ! function_exists('br'))
+{
+ function br($num = 1)
+ {
+ return str_repeat("<br />", $num);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Image
+ *
+ * Generates an <img /> element
+ *
+ * @access public
+ * @param mixed
+ * @return string
+ */
+if ( ! function_exists('img'))
+{
+ function img($src = '', $index_page = FALSE)
+ {
+ if ( ! is_array($src) )
+ {
+ $src = array('src' => $src);
+ }
+
+ $img = '<img';
+
+ foreach ($src as $k=>$v)
+ {
+
+ if ($k == 'src' AND strpos($v, '://') === FALSE)
+ {
+ $CI =& get_instance();
+
+ if ($index_page === TRUE)
+ {
+ $img .= ' src="'.$CI->config->site_url($v).'" ';
+ }
+ else
+ {
+ $img .= ' src="'.$CI->config->slash_item('base_url').$v.'" ';
+ }
+ }
+ else
+ {
+ $img .= " $k=\"$v\" ";
+ }
+ }
+
+ $img .= '/>';
+
+ return $img;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Link
+ *
+ * Generates link to a CSS file
+ *
+ * @access public
+ * @param mixed stylesheet hrefs or an array
+ * @param string rel
+ * @param string type
+ * @param string title
+ * @param string media
+ * @param boolean should index_page be added to the css path
+ * @return string
+ */
+if ( ! function_exists('link_tag'))
+{
+ function link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = '', $media = '', $index_page = FALSE)
+ {
+ $CI =& get_instance();
+
+ $link = '<link ';
+
+ if (is_array($href))
+ {
+ foreach ($href as $k=>$v)
+ {
+ if ($k == 'href' AND strpos($v, '://') === FALSE)
+ {
+ if ($index_page === TRUE)
+ {
+ $link .= ' href="'.$CI->config->site_url($v).'" ';
+ }
+ else
+ {
+ $link .= ' href="'.$CI->config->slash_item('base_url').$v.'" ';
+ }
+ }
+ else
+ {
+ $link .= "$k=\"$v\" ";
+ }
+ }
+
+ $link .= "/>";
+ }
+ else
+ {
+ if ( strpos($href, '://') !== FALSE)
+ {
+ $link .= ' href="'.$href.'" ';
+ }
+ elseif ($index_page === TRUE)
+ {
+ $link .= ' href="'.$CI->config->site_url($href).'" ';
+ }
+ else
+ {
+ $link .= ' href="'.$CI->config->slash_item('base_url').$href.'" ';
+ }
+
+ $link .= 'rel="'.$rel.'" type="'.$type.'" ';
+
+ if ($media != '')
+ {
+ $link .= 'media="'.$media.'" ';
+ }
+
+ if ($title != '')
+ {
+ $link .= 'title="'.$title.'" ';
+ }
+
+ $link .= '/>';
+ }
+
+
+ return $link;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Generates meta tags from an array of key/values
+ *
+ * @access public
+ * @param array
+ * @return string
+ */
+if ( ! function_exists('meta'))
+{
+ function meta($name = '', $content = '', $type = 'name', $newline = "\n")
+ {
+ // Since we allow the data to be passes as a string, a simple array
+ // or a multidimensional one, we need to do a little prepping.
+ if ( ! is_array($name))
+ {
+ $name = array(array('name' => $name, 'content' => $content, 'type' => $type, 'newline' => $newline));
+ }
+ else
+ {
+ // Turn single array into multidimensional
+ if (isset($name['name']))
+ {
+ $name = array($name);
+ }
+ }
+
+ $str = '';
+ foreach ($name as $meta)
+ {
+ $type = ( ! isset($meta['type']) OR $meta['type'] == 'name') ? 'name' : 'http-equiv';
+ $name = ( ! isset($meta['name'])) ? '' : $meta['name'];
+ $content = ( ! isset($meta['content'])) ? '' : $meta['content'];
+ $newline = ( ! isset($meta['newline'])) ? "\n" : $meta['newline'];
+
+ $str .= '<meta '.$type.'="'.$name.'" content="'.$content.'" />'.$newline;
+ }
+
+ return $str;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Generates non-breaking space entities based on number supplied
+ *
+ * @access public
+ * @param integer
+ * @return string
+ */
+if ( ! function_exists('nbs'))
+{
+ function nbs($num = 1)
+ {
+ return str_repeat(" ", $num);
+ }
+}
+
+
+/* End of file html_helper.php */
/* Location: ./system/helpers/html_helper.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Inflector Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/directory_helper.html\r
- */\r
-\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Singular\r
- *\r
- * Takes a plural word and makes it singular\r
- *\r
- * @access public\r
- * @param string\r
- * @return str\r
- */ \r
-if ( ! function_exists('singular'))\r
-{ \r
- function singular($str)\r
- {\r
- $str = strtolower(trim($str));\r
- $end = substr($str, -3);\r
- \r
- if ($end == 'ies')\r
- {\r
- $str = substr($str, 0, strlen($str)-3).'y';\r
- }\r
- elseif ($end == 'ses')\r
- {\r
- $str = substr($str, 0, strlen($str)-2);\r
- }\r
- else\r
- {\r
- $end = substr($str, -1);\r
- \r
- if ($end == 's')\r
- {\r
- $str = substr($str, 0, strlen($str)-1);\r
- }\r
- }\r
- \r
- return $str;\r
- }\r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Plural\r
- *\r
- * Takes a singular word and makes it plural\r
- *\r
- * @access public\r
- * @param string\r
- * @param bool\r
- * @return str\r
- */ \r
-if ( ! function_exists('plural'))\r
-{ \r
- function plural($str, $force = FALSE)\r
- {\r
- $str = strtolower(trim($str));\r
- $end = substr($str, -1);\r
-\r
- if ($end == 'y')\r
- {\r
- $str = substr($str, 0, strlen($str)-1).'ies';\r
- }\r
- elseif ($end == 's')\r
- {\r
- if ($force == TRUE)\r
- {\r
- $str .= 'es';\r
- }\r
- }\r
- else\r
- {\r
- $str .= 's';\r
- }\r
-\r
- return $str;\r
- }\r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Camelize\r
- *\r
- * Takes multiple words separated by spaces or underscores and camelizes them\r
- *\r
- * @access public\r
- * @param string\r
- * @return str\r
- */ \r
-if ( ! function_exists('camelize'))\r
-{ \r
- function camelize($str)\r
- { \r
- $str = 'x'.strtolower(trim($str));\r
- $str = ucwords(preg_replace('/[\s_]+/', ' ', $str));\r
- return substr(str_replace(' ', '', $str), 1);\r
- }\r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Underscore\r
- *\r
- * Takes multiple words separated by spaces and underscores them\r
- *\r
- * @access public\r
- * @param string\r
- * @return str\r
- */ \r
-if ( ! function_exists('underscore'))\r
-{\r
- function underscore($str)\r
- {\r
- return preg_replace('/[\s]+/', '_', strtolower(trim($str)));\r
- }\r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Humanize\r
- *\r
- * Takes multiple words separated by underscores and changes them to spaces\r
- *\r
- * @access public\r
- * @param string\r
- * @return str\r
- */ \r
-if ( ! function_exists('humanize'))\r
-{ \r
- function humanize($str)\r
- {\r
- return ucwords(preg_replace('/[_]+/', ' ', strtolower(trim($str))));\r
- }\r
-}\r
- \r
-\r
-/* End of file inflector_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Inflector Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/directory_helper.html
+ */
+
+
+// --------------------------------------------------------------------
+
+/**
+ * Singular
+ *
+ * Takes a plural word and makes it singular
+ *
+ * @access public
+ * @param string
+ * @return str
+ */
+if ( ! function_exists('singular'))
+{
+ function singular($str)
+ {
+ $str = strtolower(trim($str));
+ $end = substr($str, -3);
+
+ if ($end == 'ies')
+ {
+ $str = substr($str, 0, strlen($str)-3).'y';
+ }
+ elseif ($end == 'ses')
+ {
+ $str = substr($str, 0, strlen($str)-2);
+ }
+ else
+ {
+ $end = substr($str, -1);
+
+ if ($end == 's')
+ {
+ $str = substr($str, 0, strlen($str)-1);
+ }
+ }
+
+ return $str;
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Plural
+ *
+ * Takes a singular word and makes it plural
+ *
+ * @access public
+ * @param string
+ * @param bool
+ * @return str
+ */
+if ( ! function_exists('plural'))
+{
+ function plural($str, $force = FALSE)
+ {
+ $str = strtolower(trim($str));
+ $end = substr($str, -1);
+
+ if ($end == 'y')
+ {
+ $str = substr($str, 0, strlen($str)-1).'ies';
+ }
+ elseif ($end == 's')
+ {
+ if ($force == TRUE)
+ {
+ $str .= 'es';
+ }
+ }
+ else
+ {
+ $str .= 's';
+ }
+
+ return $str;
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Camelize
+ *
+ * Takes multiple words separated by spaces or underscores and camelizes them
+ *
+ * @access public
+ * @param string
+ * @return str
+ */
+if ( ! function_exists('camelize'))
+{
+ function camelize($str)
+ {
+ $str = 'x'.strtolower(trim($str));
+ $str = ucwords(preg_replace('/[\s_]+/', ' ', $str));
+ return substr(str_replace(' ', '', $str), 1);
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Underscore
+ *
+ * Takes multiple words separated by spaces and underscores them
+ *
+ * @access public
+ * @param string
+ * @return str
+ */
+if ( ! function_exists('underscore'))
+{
+ function underscore($str)
+ {
+ return preg_replace('/[\s]+/', '_', strtolower(trim($str)));
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Humanize
+ *
+ * Takes multiple words separated by underscores and changes them to spaces
+ *
+ * @access public
+ * @param string
+ * @return str
+ */
+if ( ! function_exists('humanize'))
+{
+ function humanize($str)
+ {
+ return ucwords(preg_replace('/[_]+/', ' ', strtolower(trim($str))));
+ }
+}
+
+
+/* End of file inflector_helper.php */
/* Location: ./system/helpers/inflector_helper.php */
\ No newline at end of file
-<?php if (!defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Number Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/number_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Formats a numbers as bytes, based on size, and adds the appropriate suffix\r
- *\r
- * @access public\r
- * @param mixed // will be cast as int\r
- * @return string\r
- */\r
-if ( ! function_exists('byte_format'))\r
-{\r
- function byte_format($num)\r
- {\r
- $CI =& get_instance();\r
- $CI->lang->load('number');\r
- \r
- if ($num >= 1000000000000) \r
- {\r
- $num = round($num / 1099511627776, 1);\r
- $unit = $CI->lang->line('terabyte_abbr');\r
- }\r
- elseif ($num >= 1000000000) \r
- {\r
- $num = round($num / 1073741824, 1);\r
- $unit = $CI->lang->line('gigabyte_abbr');\r
- }\r
- elseif ($num >= 1000000) \r
- {\r
- $num = round($num / 1048576, 1);\r
- $unit = $CI->lang->line('megabyte_abbr');\r
- }\r
- elseif ($num >= 1000) \r
- {\r
- $num = round($num / 1024, 1);\r
- $unit = $CI->lang->line('kilobyte_abbr');\r
- }\r
- else\r
- {\r
- $unit = $CI->lang->line('bytes');\r
- return number_format($num).' '.$unit;\r
- }\r
-\r
- return number_format($num, 1).' '.$unit;\r
- } \r
-}\r
-\r
-/* End of file number_helper.php */\r
+<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Number Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/number_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Formats a numbers as bytes, based on size, and adds the appropriate suffix
+ *
+ * @access public
+ * @param mixed // will be cast as int
+ * @return string
+ */
+if ( ! function_exists('byte_format'))
+{
+ function byte_format($num)
+ {
+ $CI =& get_instance();
+ $CI->lang->load('number');
+
+ if ($num >= 1000000000000)
+ {
+ $num = round($num / 1099511627776, 1);
+ $unit = $CI->lang->line('terabyte_abbr');
+ }
+ elseif ($num >= 1000000000)
+ {
+ $num = round($num / 1073741824, 1);
+ $unit = $CI->lang->line('gigabyte_abbr');
+ }
+ elseif ($num >= 1000000)
+ {
+ $num = round($num / 1048576, 1);
+ $unit = $CI->lang->line('megabyte_abbr');
+ }
+ elseif ($num >= 1000)
+ {
+ $num = round($num / 1024, 1);
+ $unit = $CI->lang->line('kilobyte_abbr');
+ }
+ else
+ {
+ $unit = $CI->lang->line('bytes');
+ return number_format($num).' '.$unit;
+ }
+
+ return number_format($num, 1).' '.$unit;
+ }
+}
+
+/* End of file number_helper.php */
/* Location: ./system/helpers/number_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Path Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/xml_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Set Realpath\r
- *\r
- * @access public\r
- * @param string\r
- * @param bool checks to see if the path exists\r
- * @return string\r
- */ \r
-if ( ! function_exists('set_realpath'))\r
-{\r
- function set_realpath($path, $check_existance = FALSE)\r
- {\r
- // Security check to make sure the path is NOT a URL. No remote file inclusion!\r
- if (preg_match("#^(http:\/\/|https:\/\/|www\.|ftp|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})#i", $path))\r
- {\r
- show_error('The path you submitted must be a local server path, not a URL');\r
- }\r
- \r
- // Resolve the path\r
- if (function_exists('realpath') AND @realpath($path) !== FALSE)\r
- {\r
- $path = realpath($path).'/';\r
- }\r
- \r
- // Add a trailing slash\r
- $path = preg_replace("#([^/])/*$#", "\\1/", $path);\r
- \r
- // Make sure the path exists\r
- if ($check_existance == TRUE)\r
- {\r
- if ( ! is_dir($path))\r
- {\r
- show_error('Not a valid path: '.$path);\r
- }\r
- }\r
- \r
- return $path;\r
- }\r
-}\r
-\r
-\r
-/* End of file path_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Path Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/xml_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Set Realpath
+ *
+ * @access public
+ * @param string
+ * @param bool checks to see if the path exists
+ * @return string
+ */
+if ( ! function_exists('set_realpath'))
+{
+ function set_realpath($path, $check_existance = FALSE)
+ {
+ // Security check to make sure the path is NOT a URL. No remote file inclusion!
+ if (preg_match("#^(http:\/\/|https:\/\/|www\.|ftp|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})#i", $path))
+ {
+ show_error('The path you submitted must be a local server path, not a URL');
+ }
+
+ // Resolve the path
+ if (function_exists('realpath') AND @realpath($path) !== FALSE)
+ {
+ $path = realpath($path).'/';
+ }
+
+ // Add a trailing slash
+ $path = preg_replace("#([^/])/*$#", "\\1/", $path);
+
+ // Make sure the path exists
+ if ($check_existance == TRUE)
+ {
+ if ( ! is_dir($path))
+ {
+ show_error('Not a valid path: '.$path);
+ }
+ }
+
+ return $path;
+ }
+}
+
+
+/* End of file path_helper.php */
/* Location: ./system/helpers/path_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Security Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/security_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * XSS Filtering\r
- *\r
- * @access public\r
- * @param string\r
- * @param string the character set of your data\r
- * @return string\r
- */ \r
-if ( ! function_exists('xss_clean'))\r
-{\r
- function xss_clean($str, $charset = 'ISO-8859-1')\r
- {\r
- $CI =& get_instance();\r
- return $CI->input->xss_clean($str, $charset);\r
- }\r
-}\r
-\r
-// --------------------------------------------------------------------\r
-\r
-/**\r
- * Hash encode a string\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
-if ( ! function_exists('dohash'))\r
-{ \r
- function dohash($str, $type = 'sha1')\r
- {\r
- if ($type == 'sha1')\r
- {\r
- if ( ! function_exists('sha1'))\r
- {\r
- if ( ! function_exists('mhash'))\r
- { \r
- require_once(BASEPATH.'libraries/Sha1'.EXT);\r
- $SH = new CI_SHA;\r
- return $SH->generate($str);\r
- }\r
- else\r
- {\r
- return bin2hex(mhash(MHASH_SHA1, $str));\r
- }\r
- }\r
- else\r
- {\r
- return sha1($str);\r
- } \r
- }\r
- else\r
- {\r
- return md5($str);\r
- }\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Strip Image Tags\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
-if ( ! function_exists('strip_image_tags'))\r
-{\r
- function strip_image_tags($str)\r
- {\r
- $str = preg_replace("#<img\s+.*?src\s*=\s*[\"'](.+?)[\"'].*?\>#", "\\1", $str);\r
- $str = preg_replace("#<img\s+.*?src\s*=\s*(.+?).*?\>#", "\\1", $str);\r
- \r
- return $str;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Convert PHP tags to entities\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
-if ( ! function_exists('encode_php_tags'))\r
-{\r
- function encode_php_tags($str)\r
- {\r
- return str_replace(array('<?php', '<?PHP', '<?', '?>'), array('<?php', '<?PHP', '<?', '?>'), $str);\r
- }\r
-}\r
-\r
-\r
-/* End of file security_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Security Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/security_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * XSS Filtering
+ *
+ * @access public
+ * @param string
+ * @param string the character set of your data
+ * @return string
+ */
+if ( ! function_exists('xss_clean'))
+{
+ function xss_clean($str, $charset = 'ISO-8859-1')
+ {
+ $CI =& get_instance();
+ return $CI->input->xss_clean($str, $charset);
+ }
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Hash encode a string
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('dohash'))
+{
+ function dohash($str, $type = 'sha1')
+ {
+ if ($type == 'sha1')
+ {
+ if ( ! function_exists('sha1'))
+ {
+ if ( ! function_exists('mhash'))
+ {
+ require_once(BASEPATH.'libraries/Sha1'.EXT);
+ $SH = new CI_SHA;
+ return $SH->generate($str);
+ }
+ else
+ {
+ return bin2hex(mhash(MHASH_SHA1, $str));
+ }
+ }
+ else
+ {
+ return sha1($str);
+ }
+ }
+ else
+ {
+ return md5($str);
+ }
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Strip Image Tags
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('strip_image_tags'))
+{
+ function strip_image_tags($str)
+ {
+ $str = preg_replace("#<img\s+.*?src\s*=\s*[\"'](.+?)[\"'].*?\>#", "\\1", $str);
+ $str = preg_replace("#<img\s+.*?src\s*=\s*(.+?).*?\>#", "\\1", $str);
+
+ return $str;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Convert PHP tags to entities
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('encode_php_tags'))
+{
+ function encode_php_tags($str)
+ {
+ return str_replace(array('<?php', '<?PHP', '<?', '?>'), array('<?php', '<?PHP', '<?', '?>'), $str);
+ }
+}
+
+
+/* End of file security_helper.php */
/* Location: ./system/helpers/security_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Smiley Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/smiley_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * JS Insert Smiley\r
- *\r
- * Generates the javascrip function needed to insert smileys into a form field\r
- *\r
- * @access public\r
- * @param string form name\r
- * @param string field name\r
- * @return string\r
- */\r
-if ( ! function_exists('js_insert_smiley'))\r
-{\r
- function js_insert_smiley($form_name = '', $form_field = '')\r
- {\r
- return <<<EOF\r
-<script type="text/javascript">\r
- function insert_smiley(smiley)\r
- {\r
- document.{$form_name}.{$form_field}.value += " " + smiley;\r
- }\r
-</script>\r
-EOF;\r
- }\r
-}\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Get Clickable Smileys\r
- *\r
- * Returns an array of image tag links that can be clicked to be inserted \r
- * into a form field. \r
- *\r
- * @access public\r
- * @param string the URL to the folder containing the smiley images\r
- * @return array\r
- */\r
-if ( ! function_exists('get_clickable_smileys'))\r
-{\r
- function get_clickable_smileys($image_url = '', $smileys = NULL)\r
- {\r
- if ( ! is_array($smileys))\r
- {\r
- if (FALSE === ($smileys = _get_smiley_array()))\r
- {\r
- return $smileys;\r
- }\r
- }\r
-\r
- // Add a trailing slash to the file path if needed\r
- $image_url = preg_replace("/(.+?)\/*$/", "\\1/", $image_url);\r
-\r
- $used = array();\r
- foreach ($smileys as $key => $val)\r
- {\r
- // Keep duplicates from being used, which can happen if the\r
- // mapping array contains multiple identical replacements. For example:\r
- // :-) and :) might be replaced with the same image so both smileys\r
- // will be in the array.\r
- if (isset($used[$smileys[$key][0]]))\r
- {\r
- continue;\r
- }\r
-\r
- $link[] = "<a href=\"javascript:void(0);\" onClick=\"insert_smiley('".$key."')\"><img src=\"".$image_url.$smileys[$key][0]."\" width=\"".$smileys[$key][1]."\" height=\"".$smileys[$key][2]."\" alt=\"".$smileys[$key][3]."\" style=\"border:0;\" /></a>";\r
-\r
- $used[$smileys[$key][0]] = TRUE;\r
- }\r
-\r
- return $link;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Parse Smileys\r
- *\r
- * Takes a string as input and swaps any contained smileys for the actual image\r
- *\r
- * @access public\r
- * @param string the text to be parsed\r
- * @param string the URL to the folder containing the smiley images\r
- * @return string\r
- */\r
-if ( ! function_exists('parse_smileys'))\r
-{\r
- function parse_smileys($str = '', $image_url = '', $smileys = NULL)\r
- {\r
- if ($image_url == '')\r
- {\r
- return $str;\r
- }\r
-\r
- if ( ! is_array($smileys))\r
- {\r
- if (FALSE === ($smileys = _get_smiley_array()))\r
- {\r
- return $str;\r
- }\r
- }\r
-\r
- // Add a trailing slash to the file path if needed\r
- $image_url = preg_replace("/(.+?)\/*$/", "\\1/", $image_url);\r
-\r
- foreach ($smileys as $key => $val)\r
- {\r
- $str = str_replace($key, "<img src=\"".$image_url.$smileys[$key][0]."\" width=\"".$smileys[$key][1]."\" height=\"".$smileys[$key][2]."\" alt=\"".$smileys[$key][3]."\" style=\"border:0;\" />", $str);\r
- }\r
-\r
- return $str;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Get Smiley Array\r
- *\r
- * Fetches the config/smiley.php file\r
- *\r
- * @access private\r
- * @return mixed\r
- */\r
-if ( ! function_exists('_get_smiley_array'))\r
-{\r
- function _get_smiley_array()\r
- {\r
- if ( ! file_exists(APPPATH.'config/smileys'.EXT))\r
- {\r
- return FALSE;\r
- }\r
-\r
- include(APPPATH.'config/smileys'.EXT);\r
-\r
- if ( ! isset($smileys) OR ! is_array($smileys))\r
- {\r
- return FALSE;\r
- }\r
-\r
- return $smileys;\r
- }\r
-}\r
-\r
-\r
-/* End of file smiley_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Smiley Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/smiley_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * JS Insert Smiley
+ *
+ * Generates the javascrip function needed to insert smileys into a form field
+ *
+ * @access public
+ * @param string form name
+ * @param string field name
+ * @return string
+ */
+if ( ! function_exists('js_insert_smiley'))
+{
+ function js_insert_smiley($form_name = '', $form_field = '')
+ {
+ return <<<EOF
+<script type="text/javascript">
+ function insert_smiley(smiley)
+ {
+ document.{$form_name}.{$form_field}.value += " " + smiley;
+ }
+</script>
+EOF;
+ }
+}
+// ------------------------------------------------------------------------
+
+/**
+ * Get Clickable Smileys
+ *
+ * Returns an array of image tag links that can be clicked to be inserted
+ * into a form field.
+ *
+ * @access public
+ * @param string the URL to the folder containing the smiley images
+ * @return array
+ */
+if ( ! function_exists('get_clickable_smileys'))
+{
+ function get_clickable_smileys($image_url = '', $smileys = NULL)
+ {
+ if ( ! is_array($smileys))
+ {
+ if (FALSE === ($smileys = _get_smiley_array()))
+ {
+ return $smileys;
+ }
+ }
+
+ // Add a trailing slash to the file path if needed
+ $image_url = preg_replace("/(.+?)\/*$/", "\\1/", $image_url);
+
+ $used = array();
+ foreach ($smileys as $key => $val)
+ {
+ // Keep duplicates from being used, which can happen if the
+ // mapping array contains multiple identical replacements. For example:
+ // :-) and :) might be replaced with the same image so both smileys
+ // will be in the array.
+ if (isset($used[$smileys[$key][0]]))
+ {
+ continue;
+ }
+
+ $link[] = "<a href=\"javascript:void(0);\" onClick=\"insert_smiley('".$key."')\"><img src=\"".$image_url.$smileys[$key][0]."\" width=\"".$smileys[$key][1]."\" height=\"".$smileys[$key][2]."\" alt=\"".$smileys[$key][3]."\" style=\"border:0;\" /></a>";
+
+ $used[$smileys[$key][0]] = TRUE;
+ }
+
+ return $link;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Parse Smileys
+ *
+ * Takes a string as input and swaps any contained smileys for the actual image
+ *
+ * @access public
+ * @param string the text to be parsed
+ * @param string the URL to the folder containing the smiley images
+ * @return string
+ */
+if ( ! function_exists('parse_smileys'))
+{
+ function parse_smileys($str = '', $image_url = '', $smileys = NULL)
+ {
+ if ($image_url == '')
+ {
+ return $str;
+ }
+
+ if ( ! is_array($smileys))
+ {
+ if (FALSE === ($smileys = _get_smiley_array()))
+ {
+ return $str;
+ }
+ }
+
+ // Add a trailing slash to the file path if needed
+ $image_url = preg_replace("/(.+?)\/*$/", "\\1/", $image_url);
+
+ foreach ($smileys as $key => $val)
+ {
+ $str = str_replace($key, "<img src=\"".$image_url.$smileys[$key][0]."\" width=\"".$smileys[$key][1]."\" height=\"".$smileys[$key][2]."\" alt=\"".$smileys[$key][3]."\" style=\"border:0;\" />", $str);
+ }
+
+ return $str;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Get Smiley Array
+ *
+ * Fetches the config/smiley.php file
+ *
+ * @access private
+ * @return mixed
+ */
+if ( ! function_exists('_get_smiley_array'))
+{
+ function _get_smiley_array()
+ {
+ if ( ! file_exists(APPPATH.'config/smileys'.EXT))
+ {
+ return FALSE;
+ }
+
+ include(APPPATH.'config/smileys'.EXT);
+
+ if ( ! isset($smileys) OR ! is_array($smileys))
+ {
+ return FALSE;
+ }
+
+ return $smileys;
+ }
+}
+
+
+/* End of file smiley_helper.php */
/* Location: ./system/helpers/smiley_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter String Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/string_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Trim Slashes\r
- *\r
- * Removes any leading/traling slashes from a string:\r
- *\r
- * /this/that/theother/\r
- *\r
- * becomes:\r
- *\r
- * this/that/theother\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
-if ( ! function_exists('trim_slashes'))\r
-{\r
- function trim_slashes($str)\r
- {\r
- return trim($str, '/');\r
- } \r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Strip Slashes\r
- *\r
- * Removes slashes contained in a string or in an array\r
- *\r
- * @access public\r
- * @param mixed string or array\r
- * @return mixed string or array\r
- */ \r
-if ( ! function_exists('strip_slashes'))\r
-{\r
- function strip_slashes($str)\r
- {\r
- if (is_array($str))\r
- { \r
- foreach ($str as $key => $val)\r
- {\r
- $str[$key] = strip_slashes($val);\r
- }\r
- }\r
- else\r
- {\r
- $str = stripslashes($str);\r
- }\r
- \r
- return $str;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Strip Quotes\r
- *\r
- * Removes single and double quotes from a string\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
-if ( ! function_exists('strip_quotes'))\r
-{\r
- function strip_quotes($str)\r
- {\r
- return str_replace(array('"', "'"), '', $str);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Quotes to Entities\r
- *\r
- * Converts single and double quotes to entities\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
-if ( ! function_exists('quotes_to_entities'))\r
-{\r
- function quotes_to_entities($str)\r
- { \r
- return str_replace(array("\'","\"","'",'"'), array("'",""","'","""), $str);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-/**\r
- * Reduce Double Slashes\r
- *\r
- * Converts double slashes in a string to a single slash,\r
- * except those found in http://\r
- *\r
- * http://www.some-site.com//index.php\r
- *\r
- * becomes:\r
- *\r
- * http://www.some-site.com/index.php\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
-if ( ! function_exists('reduce_double_slashes'))\r
-{\r
- function reduce_double_slashes($str)\r
- {\r
- return preg_replace("#([^:])//+#", "\\1/", $str);\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Reduce Multiples\r
- *\r
- * Reduces multiple instances of a particular character. Example:\r
- *\r
- * Fred, Bill,, Joe, Jimmy\r
- *\r
- * becomes:\r
- *\r
- * Fred, Bill, Joe, Jimmy\r
- *\r
- * @access public\r
- * @param string\r
- * @param string the character you wish to reduce\r
- * @param bool TRUE/FALSE - whether to trim the character from the beginning/end\r
- * @return string\r
- */ \r
-if ( ! function_exists('reduce_multiples'))\r
-{\r
- function reduce_multiples($str, $character = ',', $trim = FALSE)\r
- {\r
- $str = preg_replace('#'.preg_quote($character, '#').'{2,}#', $character, $str);\r
-\r
- if ($trim === TRUE)\r
- {\r
- $str = trim($str, $character);\r
- }\r
-\r
- return $str;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Create a Random String\r
- *\r
- * Useful for generating passwords or hashes.\r
- *\r
- * @access public\r
- * @param string type of random string. Options: alunum, numeric, nozero, unique\r
- * @param integer number of characters\r
- * @return string\r
- */\r
-if ( ! function_exists('random_string'))\r
-{ \r
- function random_string($type = 'alnum', $len = 8)\r
- { \r
- switch($type)\r
- {\r
- case 'alnum' :\r
- case 'numeric' :\r
- case 'nozero' :\r
- \r
- switch ($type)\r
- {\r
- case 'alnum' : $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\r
- break;\r
- case 'numeric' : $pool = '0123456789';\r
- break;\r
- case 'nozero' : $pool = '123456789';\r
- break;\r
- }\r
-\r
- $str = '';\r
- for ($i=0; $i < $len; $i++)\r
- {\r
- $str .= substr($pool, mt_rand(0, strlen($pool) -1), 1);\r
- }\r
- return $str;\r
- break;\r
- case 'unique' : return md5(uniqid(mt_rand()));\r
- break;\r
- }\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Alternator\r
- *\r
- * Allows strings to be alternated. See docs...\r
- *\r
- * @access public\r
- * @param string (as many parameters as needed)\r
- * @return string\r
- */ \r
-if ( ! function_exists('alternator'))\r
-{\r
- function alternator()\r
- {\r
- static $i; \r
-\r
- if (func_num_args() == 0)\r
- {\r
- $i = 0;\r
- return '';\r
- }\r
- $args = func_get_args();\r
- return $args[($i++ % count($args))];\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Repeater function\r
- *\r
- * @access public\r
- * @param string\r
- * @param integer number of repeats\r
- * @return string\r
- */ \r
-if ( ! function_exists('repeater'))\r
-{\r
- function repeater($data, $num = 1)\r
- {\r
- return (($num > 0) ? str_repeat($data, $num) : '');\r
- } \r
-}\r
-\r
-\r
-/* End of file string_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter String Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/string_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Trim Slashes
+ *
+ * Removes any leading/traling slashes from a string:
+ *
+ * /this/that/theother/
+ *
+ * becomes:
+ *
+ * this/that/theother
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('trim_slashes'))
+{
+ function trim_slashes($str)
+ {
+ return trim($str, '/');
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Strip Slashes
+ *
+ * Removes slashes contained in a string or in an array
+ *
+ * @access public
+ * @param mixed string or array
+ * @return mixed string or array
+ */
+if ( ! function_exists('strip_slashes'))
+{
+ function strip_slashes($str)
+ {
+ if (is_array($str))
+ {
+ foreach ($str as $key => $val)
+ {
+ $str[$key] = strip_slashes($val);
+ }
+ }
+ else
+ {
+ $str = stripslashes($str);
+ }
+
+ return $str;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Strip Quotes
+ *
+ * Removes single and double quotes from a string
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('strip_quotes'))
+{
+ function strip_quotes($str)
+ {
+ return str_replace(array('"', "'"), '', $str);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Quotes to Entities
+ *
+ * Converts single and double quotes to entities
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('quotes_to_entities'))
+{
+ function quotes_to_entities($str)
+ {
+ return str_replace(array("\'","\"","'",'"'), array("'",""","'","""), $str);
+ }
+}
+
+// ------------------------------------------------------------------------
+/**
+ * Reduce Double Slashes
+ *
+ * Converts double slashes in a string to a single slash,
+ * except those found in http://
+ *
+ * http://www.some-site.com//index.php
+ *
+ * becomes:
+ *
+ * http://www.some-site.com/index.php
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('reduce_double_slashes'))
+{
+ function reduce_double_slashes($str)
+ {
+ return preg_replace("#([^:])//+#", "\\1/", $str);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Reduce Multiples
+ *
+ * Reduces multiple instances of a particular character. Example:
+ *
+ * Fred, Bill,, Joe, Jimmy
+ *
+ * becomes:
+ *
+ * Fred, Bill, Joe, Jimmy
+ *
+ * @access public
+ * @param string
+ * @param string the character you wish to reduce
+ * @param bool TRUE/FALSE - whether to trim the character from the beginning/end
+ * @return string
+ */
+if ( ! function_exists('reduce_multiples'))
+{
+ function reduce_multiples($str, $character = ',', $trim = FALSE)
+ {
+ $str = preg_replace('#'.preg_quote($character, '#').'{2,}#', $character, $str);
+
+ if ($trim === TRUE)
+ {
+ $str = trim($str, $character);
+ }
+
+ return $str;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Create a Random String
+ *
+ * Useful for generating passwords or hashes.
+ *
+ * @access public
+ * @param string type of random string. Options: alunum, numeric, nozero, unique
+ * @param integer number of characters
+ * @return string
+ */
+if ( ! function_exists('random_string'))
+{
+ function random_string($type = 'alnum', $len = 8)
+ {
+ switch($type)
+ {
+ case 'alnum' :
+ case 'numeric' :
+ case 'nozero' :
+
+ switch ($type)
+ {
+ case 'alnum' : $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+ break;
+ case 'numeric' : $pool = '0123456789';
+ break;
+ case 'nozero' : $pool = '123456789';
+ break;
+ }
+
+ $str = '';
+ for ($i=0; $i < $len; $i++)
+ {
+ $str .= substr($pool, mt_rand(0, strlen($pool) -1), 1);
+ }
+ return $str;
+ break;
+ case 'unique' : return md5(uniqid(mt_rand()));
+ break;
+ }
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Alternator
+ *
+ * Allows strings to be alternated. See docs...
+ *
+ * @access public
+ * @param string (as many parameters as needed)
+ * @return string
+ */
+if ( ! function_exists('alternator'))
+{
+ function alternator()
+ {
+ static $i;
+
+ if (func_num_args() == 0)
+ {
+ $i = 0;
+ return '';
+ }
+ $args = func_get_args();
+ return $args[($i++ % count($args))];
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Repeater function
+ *
+ * @access public
+ * @param string
+ * @param integer number of repeats
+ * @return string
+ */
+if ( ! function_exists('repeater'))
+{
+ function repeater($data, $num = 1)
+ {
+ return (($num > 0) ? str_repeat($data, $num) : '');
+ }
+}
+
+
+/* End of file string_helper.php */
/* Location: ./system/helpers/string_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Text Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/text_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Word Limiter\r
- *\r
- * Limits a string to X number of words.\r
- *\r
- * @access public\r
- * @param string\r
- * @param integer\r
- * @param string the end character. Usually an ellipsis\r
- * @return string\r
- */ \r
-if ( ! function_exists('word_limiter'))\r
-{\r
- function word_limiter($str, $limit = 100, $end_char = '…')\r
- {\r
- if (trim($str) == '')\r
- {\r
- return $str;\r
- }\r
- \r
- preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);\r
- \r
- if (strlen($str) == strlen($matches[0]))\r
- {\r
- $end_char = '';\r
- }\r
- \r
- return rtrim($matches[0]).$end_char;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Character Limiter\r
- *\r
- * Limits the string based on the character count. Preserves complete words\r
- * so the character count may not be exactly as specified.\r
- *\r
- * @access public\r
- * @param string\r
- * @param integer\r
- * @param string the end character. Usually an ellipsis\r
- * @return string\r
- */ \r
-if ( ! function_exists('character_limiter'))\r
-{\r
- function character_limiter($str, $n = 500, $end_char = '…')\r
- {\r
- if (strlen($str) < $n)\r
- {\r
- return $str;\r
- }\r
- \r
- $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));\r
-\r
- if (strlen($str) <= $n)\r
- {\r
- return $str;\r
- }\r
- \r
- $out = "";\r
- foreach (explode(' ', trim($str)) as $val)\r
- {\r
- $out .= $val.' '; \r
- if (strlen($out) >= $n)\r
- {\r
- return trim($out).$end_char;\r
- } \r
- }\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * High ASCII to Entities\r
- *\r
- * Converts High ascii text and MS Word special characters to character entities\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
-if ( ! function_exists('ascii_to_entities'))\r
-{\r
- function ascii_to_entities($str)\r
- {\r
- $count = 1;\r
- $out = '';\r
- $temp = array();\r
- \r
- for ($i = 0, $s = strlen($str); $i < $s; $i++)\r
- {\r
- $ordinal = ord($str[$i]);\r
- \r
- if ($ordinal < 128)\r
- {\r
- $out .= $str[$i];\r
- }\r
- else\r
- {\r
- if (count($temp) == 0)\r
- {\r
- $count = ($ordinal < 224) ? 2 : 3;\r
- }\r
- \r
- $temp[] = $ordinal;\r
- \r
- if (count($temp) == $count)\r
- {\r
- $number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64);\r
-\r
- $out .= '&#'.$number.';';\r
- $count = 1;\r
- $temp = array();\r
- }\r
- }\r
- }\r
-\r
- return $out;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Entities to ASCII\r
- *\r
- * Converts character entities back to ASCII\r
- *\r
- * @access public\r
- * @param string\r
- * @param bool\r
- * @return string\r
- */ \r
-if ( ! function_exists('entities_to_ascii'))\r
-{\r
- function entities_to_ascii($str, $all = TRUE)\r
- {\r
- if (preg_match_all('/\&#(\d+)\;/', $str, $matches))\r
- {\r
- for ($i = 0, $s = count($matches['0']); $i < $s; $i++)\r
- { \r
- $digits = $matches['1'][$i];\r
-\r
- $out = '';\r
-\r
- if ($digits < 128)\r
- {\r
- $out .= chr($digits);\r
- \r
- }\r
- elseif ($digits < 2048)\r
- {\r
- $out .= chr(192 + (($digits - ($digits % 64)) / 64));\r
- $out .= chr(128 + ($digits % 64));\r
- }\r
- else\r
- {\r
- $out .= chr(224 + (($digits - ($digits % 4096)) / 4096));\r
- $out .= chr(128 + ((($digits % 4096) - ($digits % 64)) / 64));\r
- $out .= chr(128 + ($digits % 64));\r
- }\r
-\r
- $str = str_replace($matches['0'][$i], $out, $str); \r
- }\r
- }\r
-\r
- if ($all)\r
- {\r
- $str = str_replace(array("&", "<", ">", """, "'", "-"),\r
- array("&","<",">","\"", "'", "-"),\r
- $str);\r
- }\r
-\r
- return $str;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Word Censoring Function\r
- *\r
- * Supply a string and an array of disallowed words and any\r
- * matched words will be converted to #### or to the replacement\r
- * word you've submitted.\r
- *\r
- * @access public\r
- * @param string the text string\r
- * @param string the array of censoered words\r
- * @param string the optional replacement value\r
- * @return string\r
- */ \r
-if ( ! function_exists('word_censor'))\r
-{\r
- function word_censor($str, $censored, $replacement = '')\r
- {\r
- if ( ! is_array($censored))\r
- {\r
- return $str;\r
- }\r
-\r
- $str = ' '.$str.' ';\r
- foreach ($censored as $badword)\r
- {\r
- if ($replacement != '')\r
- {\r
- $str = preg_replace("/\b(".str_replace('\*', '\w*?', preg_quote($badword, '/')).")\b/i", $replacement, $str);\r
- }\r
- else\r
- {\r
- $str = preg_replace("/\b(".str_replace('\*', '\w*?', preg_quote($badword, '/')).")\b/ie", "str_repeat('#', strlen('\\1'))", $str);\r
- }\r
- }\r
- \r
- return trim($str);\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Code Highlighter\r
- *\r
- * Colorizes code strings\r
- *\r
- * @access public\r
- * @param string the text string\r
- * @return string\r
- */ \r
-if ( ! function_exists('highlight_code'))\r
-{\r
- function highlight_code($str)\r
- { \r
- // The highlight string function encodes and highlights\r
- // brackets so we need them to start raw\r
- $str = str_replace(array('<', '>'), array('<', '>'), $str);\r
- \r
- // Replace any existing PHP tags to temporary markers so they don't accidentally\r
- // break the string out of PHP, and thus, thwart the highlighting.\r
- \r
- $str = str_replace(array('<?', '?>', '<%', '%>', '\\', '</script>'), \r
- array('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'), $str);\r
-\r
- // The highlight_string function requires that the text be surrounded\r
- // by PHP tags, which we will remove later\r
- $str = '<?php '.$str.' ?>'; // <?\r
-\r
- // All the magic happens here, baby! \r
- $str = highlight_string($str, TRUE);\r
-\r
- // Prior to PHP 5, the highligh function used icky <font> tags\r
- // so we'll replace them with <span> tags.\r
-\r
- if (abs(PHP_VERSION) < 5)\r
- {\r
- $str = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $str);\r
- $str = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $str);\r
- }\r
- \r
- // Remove our artificially added PHP, and the syntax highlighting that came with it\r
- $str = preg_replace('/<span style="color: #([A-Z0-9]+)"><\?php( | )/i', '<span style="color: #$1">', $str);\r
- $str = preg_replace('/(<span style="color: #[A-Z0-9]+">.*?)\?><\/span>\n<\/span>\n<\/code>/is', "$1</span>\n</span>\n</code>", $str);\r
- $str = preg_replace('/<span style="color: #[A-Z0-9]+"\><\/span>/i', '', $str);\r
- \r
- // Replace our markers back to PHP tags.\r
- $str = str_replace(array('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'),\r
- array('<?', '?>', '<%', '%>', '\\', '</script>'), $str);\r
- \r
- return $str;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Phrase Highlighter\r
- *\r
- * Highlights a phrase within a text string\r
- *\r
- * @access public\r
- * @param string the text string\r
- * @param string the phrase you'd like to highlight\r
- * @param string the openging tag to precede the phrase with\r
- * @param string the closing tag to end the phrase with\r
- * @return string\r
- */ \r
-if ( ! function_exists('highlight_phrase'))\r
-{\r
- function highlight_phrase($str, $phrase, $tag_open = '<strong>', $tag_close = '</strong>')\r
- {\r
- if ($str == '')\r
- {\r
- return '';\r
- }\r
- \r
- if ($phrase != '')\r
- {\r
- return preg_replace('/('.preg_quote($phrase, '/').')/i', $tag_open."\\1".$tag_close, $str);\r
- }\r
-\r
- return $str;\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Word Wrap\r
- *\r
- * Wraps text at the specified character. Maintains the integrity of words.\r
- * Anything placed between {unwrap}{/unwrap} will not be word wrapped, nor\r
- * will URLs.\r
- *\r
- * @access public\r
- * @param string the text string\r
- * @param integer the number of characters to wrap at\r
- * @return string\r
- */ \r
-if ( ! function_exists('word_wrap'))\r
-{\r
- function word_wrap($str, $charlim = '76')\r
- {\r
- // Se the character limit\r
- if ( ! is_numeric($charlim))\r
- $charlim = 76;\r
- \r
- // Reduce multiple spaces\r
- $str = preg_replace("| +|", " ", $str);\r
- \r
- // Standardize newlines\r
- if (strpos($str, "\r") !== FALSE)\r
- {\r
- $str = str_replace(array("\r\n", "\r"), "\n", $str); \r
- }\r
- \r
- // If the current word is surrounded by {unwrap} tags we'll \r
- // strip the entire chunk and replace it with a marker.\r
- $unwrap = array();\r
- if (preg_match_all("|(\{unwrap\}.+?\{/unwrap\})|s", $str, $matches))\r
- {\r
- for ($i = 0; $i < count($matches['0']); $i++)\r
- {\r
- $unwrap[] = $matches['1'][$i]; \r
- $str = str_replace($matches['1'][$i], "{{unwrapped".$i."}}", $str);\r
- }\r
- }\r
- \r
- // Use PHP's native function to do the initial wordwrap. \r
- // We set the cut flag to FALSE so that any individual words that are \r
- // too long get left alone. In the next step we'll deal with them.\r
- $str = wordwrap($str, $charlim, "\n", FALSE);\r
- \r
- // Split the string into individual lines of text and cycle through them\r
- $output = "";\r
- foreach (explode("\n", $str) as $line) \r
- {\r
- // Is the line within the allowed character count?\r
- // If so we'll join it to the output and continue\r
- if (strlen($line) <= $charlim)\r
- {\r
- $output .= $line."\n"; \r
- continue;\r
- }\r
- \r
- $temp = '';\r
- while((strlen($line)) > $charlim) \r
- {\r
- // If the over-length word is a URL we won't wrap it\r
- if (preg_match("!\[url.+\]|://|wwww.!", $line))\r
- {\r
- break;\r
- }\r
-\r
- // Trim the word down\r
- $temp .= substr($line, 0, $charlim-1);\r
- $line = substr($line, $charlim-1);\r
- }\r
- \r
- // If $temp contains data it means we had to split up an over-length \r
- // word into smaller chunks so we'll add it back to our current line\r
- if ($temp != '')\r
- {\r
- $output .= $temp . "\n" . $line; \r
- }\r
- else\r
- {\r
- $output .= $line;\r
- }\r
-\r
- $output .= "\n";\r
- }\r
-\r
- // Put our markers back\r
- if (count($unwrap) > 0)\r
- { \r
- foreach ($unwrap as $key => $val)\r
- {\r
- $output = str_replace("{{unwrapped".$key."}}", $val, $output);\r
- }\r
- }\r
-\r
- // Remove the unwrap tags\r
- $output = str_replace(array('{unwrap}', '{/unwrap}'), '', $output);\r
-\r
- return $output; \r
- }\r
-}\r
-\r
-\r
-/* End of file text_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Text Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/text_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Word Limiter
+ *
+ * Limits a string to X number of words.
+ *
+ * @access public
+ * @param string
+ * @param integer
+ * @param string the end character. Usually an ellipsis
+ * @return string
+ */
+if ( ! function_exists('word_limiter'))
+{
+ function word_limiter($str, $limit = 100, $end_char = '…')
+ {
+ if (trim($str) == '')
+ {
+ return $str;
+ }
+
+ preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);
+
+ if (strlen($str) == strlen($matches[0]))
+ {
+ $end_char = '';
+ }
+
+ return rtrim($matches[0]).$end_char;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Character Limiter
+ *
+ * Limits the string based on the character count. Preserves complete words
+ * so the character count may not be exactly as specified.
+ *
+ * @access public
+ * @param string
+ * @param integer
+ * @param string the end character. Usually an ellipsis
+ * @return string
+ */
+if ( ! function_exists('character_limiter'))
+{
+ function character_limiter($str, $n = 500, $end_char = '…')
+ {
+ if (strlen($str) < $n)
+ {
+ return $str;
+ }
+
+ $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
+
+ if (strlen($str) <= $n)
+ {
+ return $str;
+ }
+
+ $out = "";
+ foreach (explode(' ', trim($str)) as $val)
+ {
+ $out .= $val.' ';
+ if (strlen($out) >= $n)
+ {
+ return trim($out).$end_char;
+ }
+ }
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * High ASCII to Entities
+ *
+ * Converts High ascii text and MS Word special characters to character entities
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('ascii_to_entities'))
+{
+ function ascii_to_entities($str)
+ {
+ $count = 1;
+ $out = '';
+ $temp = array();
+
+ for ($i = 0, $s = strlen($str); $i < $s; $i++)
+ {
+ $ordinal = ord($str[$i]);
+
+ if ($ordinal < 128)
+ {
+ $out .= $str[$i];
+ }
+ else
+ {
+ if (count($temp) == 0)
+ {
+ $count = ($ordinal < 224) ? 2 : 3;
+ }
+
+ $temp[] = $ordinal;
+
+ if (count($temp) == $count)
+ {
+ $number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64);
+
+ $out .= '&#'.$number.';';
+ $count = 1;
+ $temp = array();
+ }
+ }
+ }
+
+ return $out;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Entities to ASCII
+ *
+ * Converts character entities back to ASCII
+ *
+ * @access public
+ * @param string
+ * @param bool
+ * @return string
+ */
+if ( ! function_exists('entities_to_ascii'))
+{
+ function entities_to_ascii($str, $all = TRUE)
+ {
+ if (preg_match_all('/\&#(\d+)\;/', $str, $matches))
+ {
+ for ($i = 0, $s = count($matches['0']); $i < $s; $i++)
+ {
+ $digits = $matches['1'][$i];
+
+ $out = '';
+
+ if ($digits < 128)
+ {
+ $out .= chr($digits);
+
+ }
+ elseif ($digits < 2048)
+ {
+ $out .= chr(192 + (($digits - ($digits % 64)) / 64));
+ $out .= chr(128 + ($digits % 64));
+ }
+ else
+ {
+ $out .= chr(224 + (($digits - ($digits % 4096)) / 4096));
+ $out .= chr(128 + ((($digits % 4096) - ($digits % 64)) / 64));
+ $out .= chr(128 + ($digits % 64));
+ }
+
+ $str = str_replace($matches['0'][$i], $out, $str);
+ }
+ }
+
+ if ($all)
+ {
+ $str = str_replace(array("&", "<", ">", """, "'", "-"),
+ array("&","<",">","\"", "'", "-"),
+ $str);
+ }
+
+ return $str;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Word Censoring Function
+ *
+ * Supply a string and an array of disallowed words and any
+ * matched words will be converted to #### or to the replacement
+ * word you've submitted.
+ *
+ * @access public
+ * @param string the text string
+ * @param string the array of censoered words
+ * @param string the optional replacement value
+ * @return string
+ */
+if ( ! function_exists('word_censor'))
+{
+ function word_censor($str, $censored, $replacement = '')
+ {
+ if ( ! is_array($censored))
+ {
+ return $str;
+ }
+
+ $str = ' '.$str.' ';
+ foreach ($censored as $badword)
+ {
+ if ($replacement != '')
+ {
+ $str = preg_replace("/\b(".str_replace('\*', '\w*?', preg_quote($badword, '/')).")\b/i", $replacement, $str);
+ }
+ else
+ {
+ $str = preg_replace("/\b(".str_replace('\*', '\w*?', preg_quote($badword, '/')).")\b/ie", "str_repeat('#', strlen('\\1'))", $str);
+ }
+ }
+
+ return trim($str);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Code Highlighter
+ *
+ * Colorizes code strings
+ *
+ * @access public
+ * @param string the text string
+ * @return string
+ */
+if ( ! function_exists('highlight_code'))
+{
+ function highlight_code($str)
+ {
+ // The highlight string function encodes and highlights
+ // brackets so we need them to start raw
+ $str = str_replace(array('<', '>'), array('<', '>'), $str);
+
+ // Replace any existing PHP tags to temporary markers so they don't accidentally
+ // break the string out of PHP, and thus, thwart the highlighting.
+
+ $str = str_replace(array('<?', '?>', '<%', '%>', '\\', '</script>'),
+ array('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'), $str);
+
+ // The highlight_string function requires that the text be surrounded
+ // by PHP tags, which we will remove later
+ $str = '<?php '.$str.' ?>'; // <?
+
+ // All the magic happens here, baby!
+ $str = highlight_string($str, TRUE);
+
+ // Prior to PHP 5, the highligh function used icky <font> tags
+ // so we'll replace them with <span> tags.
+
+ if (abs(PHP_VERSION) < 5)
+ {
+ $str = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $str);
+ $str = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $str);
+ }
+
+ // Remove our artificially added PHP, and the syntax highlighting that came with it
+ $str = preg_replace('/<span style="color: #([A-Z0-9]+)"><\?php( | )/i', '<span style="color: #$1">', $str);
+ $str = preg_replace('/(<span style="color: #[A-Z0-9]+">.*?)\?><\/span>\n<\/span>\n<\/code>/is', "$1</span>\n</span>\n</code>", $str);
+ $str = preg_replace('/<span style="color: #[A-Z0-9]+"\><\/span>/i', '', $str);
+
+ // Replace our markers back to PHP tags.
+ $str = str_replace(array('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'),
+ array('<?', '?>', '<%', '%>', '\\', '</script>'), $str);
+
+ return $str;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Phrase Highlighter
+ *
+ * Highlights a phrase within a text string
+ *
+ * @access public
+ * @param string the text string
+ * @param string the phrase you'd like to highlight
+ * @param string the openging tag to precede the phrase with
+ * @param string the closing tag to end the phrase with
+ * @return string
+ */
+if ( ! function_exists('highlight_phrase'))
+{
+ function highlight_phrase($str, $phrase, $tag_open = '<strong>', $tag_close = '</strong>')
+ {
+ if ($str == '')
+ {
+ return '';
+ }
+
+ if ($phrase != '')
+ {
+ return preg_replace('/('.preg_quote($phrase, '/').')/i', $tag_open."\\1".$tag_close, $str);
+ }
+
+ return $str;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Word Wrap
+ *
+ * Wraps text at the specified character. Maintains the integrity of words.
+ * Anything placed between {unwrap}{/unwrap} will not be word wrapped, nor
+ * will URLs.
+ *
+ * @access public
+ * @param string the text string
+ * @param integer the number of characters to wrap at
+ * @return string
+ */
+if ( ! function_exists('word_wrap'))
+{
+ function word_wrap($str, $charlim = '76')
+ {
+ // Se the character limit
+ if ( ! is_numeric($charlim))
+ $charlim = 76;
+
+ // Reduce multiple spaces
+ $str = preg_replace("| +|", " ", $str);
+
+ // Standardize newlines
+ if (strpos($str, "\r") !== FALSE)
+ {
+ $str = str_replace(array("\r\n", "\r"), "\n", $str);
+ }
+
+ // If the current word is surrounded by {unwrap} tags we'll
+ // strip the entire chunk and replace it with a marker.
+ $unwrap = array();
+ if (preg_match_all("|(\{unwrap\}.+?\{/unwrap\})|s", $str, $matches))
+ {
+ for ($i = 0; $i < count($matches['0']); $i++)
+ {
+ $unwrap[] = $matches['1'][$i];
+ $str = str_replace($matches['1'][$i], "{{unwrapped".$i."}}", $str);
+ }
+ }
+
+ // Use PHP's native function to do the initial wordwrap.
+ // We set the cut flag to FALSE so that any individual words that are
+ // too long get left alone. In the next step we'll deal with them.
+ $str = wordwrap($str, $charlim, "\n", FALSE);
+
+ // Split the string into individual lines of text and cycle through them
+ $output = "";
+ foreach (explode("\n", $str) as $line)
+ {
+ // Is the line within the allowed character count?
+ // If so we'll join it to the output and continue
+ if (strlen($line) <= $charlim)
+ {
+ $output .= $line."\n";
+ continue;
+ }
+
+ $temp = '';
+ while((strlen($line)) > $charlim)
+ {
+ // If the over-length word is a URL we won't wrap it
+ if (preg_match("!\[url.+\]|://|wwww.!", $line))
+ {
+ break;
+ }
+
+ // Trim the word down
+ $temp .= substr($line, 0, $charlim-1);
+ $line = substr($line, $charlim-1);
+ }
+
+ // If $temp contains data it means we had to split up an over-length
+ // word into smaller chunks so we'll add it back to our current line
+ if ($temp != '')
+ {
+ $output .= $temp . "\n" . $line;
+ }
+ else
+ {
+ $output .= $line;
+ }
+
+ $output .= "\n";
+ }
+
+ // Put our markers back
+ if (count($unwrap) > 0)
+ {
+ foreach ($unwrap as $key => $val)
+ {
+ $output = str_replace("{{unwrapped".$key."}}", $val, $output);
+ }
+ }
+
+ // Remove the unwrap tags
+ $output = str_replace(array('{unwrap}', '{/unwrap}'), '', $output);
+
+ return $output;
+ }
+}
+
+
+/* End of file text_helper.php */
/* Location: ./system/helpers/text_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Typography Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/typography_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Convert newlines to HTML line breaks except within PRE tags\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
-if ( ! function_exists('nl2br_except_pre'))\r
-{\r
- function nl2br_except_pre($str)\r
- {\r
- $CI =& get_instance();\r
- \r
- $CI->load->library('typography');\r
- \r
- return $CI->typography->nl2br_except_pre($str);\r
- }\r
-}\r
- \r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Auto Typography Wrapper Function\r
- *\r
- *\r
- * @access public\r
- * @param string\r
- * @param bool whether to allow javascript event handlers\r
- * @param bool whether to reduce multiple instances of double newlines to two\r
- * @return string\r
- */\r
-if ( ! function_exists('auto_typography'))\r
-{\r
- function auto_typography($str, $strip_js_event_handlers = TRUE, $reduce_linebreaks = FALSE)\r
- {\r
- $CI =& get_instance(); \r
- $CI->load->library('typography');\r
- return $CI->typography->auto_typography($str, $strip_js_event_handlers, $reduce_linebreaks);\r
- }\r
-}\r
-\r
-/* End of file typography_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Typography Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/typography_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Convert newlines to HTML line breaks except within PRE tags
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('nl2br_except_pre'))
+{
+ function nl2br_except_pre($str)
+ {
+ $CI =& get_instance();
+
+ $CI->load->library('typography');
+
+ return $CI->typography->nl2br_except_pre($str);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Auto Typography Wrapper Function
+ *
+ *
+ * @access public
+ * @param string
+ * @param bool whether to allow javascript event handlers
+ * @param bool whether to reduce multiple instances of double newlines to two
+ * @return string
+ */
+if ( ! function_exists('auto_typography'))
+{
+ function auto_typography($str, $strip_js_event_handlers = TRUE, $reduce_linebreaks = FALSE)
+ {
+ $CI =& get_instance();
+ $CI->load->library('typography');
+ return $CI->typography->auto_typography($str, $strip_js_event_handlers, $reduce_linebreaks);
+ }
+}
+
+/* End of file typography_helper.php */
/* Location: ./system/helpers/typography_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter URL Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/url_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Site URL\r
- *\r
- * Create a local URL based on your basepath. Segments can be passed via the\r
- * first parameter either as a string or an array.\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
-if ( ! function_exists('site_url'))\r
-{\r
- function site_url($uri = '')\r
- {\r
- $CI =& get_instance();\r
- return $CI->config->site_url($uri);\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Base URL\r
- *\r
- * Returns the "base_url" item from your config file\r
- *\r
- * @access public\r
- * @return string\r
- */\r
-if ( ! function_exists('base_url'))\r
-{\r
- function base_url()\r
- {\r
- $CI =& get_instance();\r
- return $CI->config->slash_item('base_url');\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Current URL\r
- *\r
- * Returns the full URL (including segments) of the page where this \r
- * function is placed\r
- *\r
- * @access public\r
- * @return string\r
- */\r
-if ( ! function_exists('current_url'))\r
-{\r
- function current_url()\r
- {\r
- $CI =& get_instance();\r
- return $CI->config->site_url($CI->uri->uri_string());\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-/**\r
- * URL String\r
- *\r
- * Returns the URI segments.\r
- *\r
- * @access public\r
- * @return string\r
- */\r
-if ( ! function_exists('uri_string'))\r
-{\r
- function uri_string()\r
- {\r
- $CI =& get_instance();\r
- return $CI->uri->uri_string();\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Index page\r
- *\r
- * Returns the "index_page" from your config file\r
- *\r
- * @access public\r
- * @return string\r
- */\r
-if ( ! function_exists('index_page'))\r
-{\r
- function index_page()\r
- {\r
- $CI =& get_instance();\r
- return $CI->config->item('index_page');\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Anchor Link\r
- *\r
- * Creates an anchor based on the local URL.\r
- *\r
- * @access public\r
- * @param string the URL\r
- * @param string the link title\r
- * @param mixed any attributes\r
- * @return string\r
- */\r
-if ( ! function_exists('anchor'))\r
-{\r
- function anchor($uri = '', $title = '', $attributes = '')\r
- {\r
- $title = (string) $title;\r
-\r
- if ( ! is_array($uri))\r
- {\r
- $site_url = ( ! preg_match('!^\w+://! i', $uri)) ? site_url($uri) : $uri;\r
- }\r
- else\r
- {\r
- $site_url = site_url($uri);\r
- }\r
-\r
- if ($title == '')\r
- {\r
- $title = $site_url;\r
- }\r
-\r
- if ($attributes != '')\r
- {\r
- $attributes = _parse_attributes($attributes);\r
- }\r
-\r
- return '<a href="'.$site_url.'"'.$attributes.'>'.$title.'</a>';\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Anchor Link - Pop-up version\r
- *\r
- * Creates an anchor based on the local URL. The link\r
- * opens a new window based on the attributes specified.\r
- *\r
- * @access public\r
- * @param string the URL\r
- * @param string the link title\r
- * @param mixed any attributes\r
- * @return string\r
- */\r
-if ( ! function_exists('anchor_popup'))\r
-{\r
- function anchor_popup($uri = '', $title = '', $attributes = FALSE)\r
- {\r
- $title = (string) $title;\r
-\r
- $site_url = ( ! preg_match('!^\w+://! i', $uri)) ? site_url($uri) : $uri;\r
-\r
- if ($title == '')\r
- {\r
- $title = $site_url;\r
- }\r
-\r
- if ($attributes === FALSE)\r
- {\r
- return "<a href='javascript:void(0);' onclick=\"window.open('".$site_url."', '_blank');\">".$title."</a>";\r
- }\r
-\r
- if ( ! is_array($attributes))\r
- {\r
- $attributes = array();\r
- }\r
-\r
- foreach (array('width' => '800', 'height' => '600', 'scrollbars' => 'yes', 'status' => 'yes', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0', ) as $key => $val)\r
- {\r
- $atts[$key] = ( ! isset($attributes[$key])) ? $val : $attributes[$key];\r
- unset($attributes[$key]);\r
- }\r
-\r
- if ($attributes != '')\r
- {\r
- $attributes = _parse_attributes($attributes);\r
- }\r
-\r
- return "<a href='javascript:void(0);' onclick=\"window.open('".$site_url."', '_blank', '"._parse_attributes($atts, TRUE)."');\"$attributes>".$title."</a>";\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Mailto Link\r
- *\r
- * @access public\r
- * @param string the email address\r
- * @param string the link title\r
- * @param mixed any attributes\r
- * @return string\r
- */\r
-if ( ! function_exists('mailto'))\r
-{\r
- function mailto($email, $title = '', $attributes = '')\r
- {\r
- $title = (string) $title;\r
-\r
- if ($title == "")\r
- {\r
- $title = $email;\r
- }\r
-\r
- $attributes = _parse_attributes($attributes);\r
-\r
- return '<a href="mailto:'.$email.'"'.$attributes.'>'.$title.'</a>';\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Encoded Mailto Link\r
- *\r
- * Create a spam-protected mailto link written in Javascript\r
- *\r
- * @access public\r
- * @param string the email address\r
- * @param string the link title\r
- * @param mixed any attributes\r
- * @return string\r
- */\r
-if ( ! function_exists('safe_mailto'))\r
-{\r
- function safe_mailto($email, $title = '', $attributes = '')\r
- {\r
- $title = (string) $title;\r
-\r
- if ($title == "")\r
- {\r
- $title = $email;\r
- }\r
-\r
- for ($i = 0; $i < 16; $i++)\r
- {\r
- $x[] = substr('<a href="mailto:', $i, 1);\r
- }\r
-\r
- for ($i = 0; $i < strlen($email); $i++)\r
- {\r
- $x[] = "|".ord(substr($email, $i, 1));\r
- }\r
-\r
- $x[] = '"';\r
-\r
- if ($attributes != '')\r
- {\r
- if (is_array($attributes))\r
- {\r
- foreach ($attributes as $key => $val)\r
- {\r
- $x[] = ' '.$key.'="';\r
- for ($i = 0; $i < strlen($val); $i++)\r
- {\r
- $x[] = "|".ord(substr($val, $i, 1));\r
- }\r
- $x[] = '"';\r
- }\r
- }\r
- else\r
- {\r
- for ($i = 0; $i < strlen($attributes); $i++)\r
- {\r
- $x[] = substr($attributes, $i, 1);\r
- }\r
- }\r
- }\r
-\r
- $x[] = '>';\r
-\r
- $temp = array();\r
- for ($i = 0; $i < strlen($title); $i++)\r
- {\r
- $ordinal = ord($title[$i]);\r
-\r
- if ($ordinal < 128)\r
- {\r
- $x[] = "|".$ordinal;\r
- }\r
- else\r
- {\r
- if (count($temp) == 0)\r
- {\r
- $count = ($ordinal < 224) ? 2 : 3;\r
- }\r
- \r
- $temp[] = $ordinal;\r
- if (count($temp) == $count)\r
- {\r
- $number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64);\r
- $x[] = "|".$number;\r
- $count = 1;\r
- $temp = array();\r
- }\r
- }\r
- }\r
-\r
- $x[] = '<'; $x[] = '/'; $x[] = 'a'; $x[] = '>';\r
-\r
- $x = array_reverse($x);\r
- ob_start();\r
-\r
- ?><script type="text/javascript">\r
- //<![CDATA[\r
- var l=new Array();\r
- <?php\r
- $i = 0;\r
- foreach ($x as $val){ ?>l[<?php echo $i++; ?>]='<?php echo $val; ?>';<?php } ?>\r
-\r
- for (var i = l.length-1; i >= 0; i=i-1){\r
- if (l[i].substring(0, 1) == '|') document.write("&#"+unescape(l[i].substring(1))+";");\r
- else document.write(unescape(l[i]));}\r
- //]]>\r
- </script><?php\r
-\r
- $buffer = ob_get_contents();\r
- ob_end_clean();\r
- return $buffer;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Auto-linker\r
- *\r
- * Automatically links URL and Email addresses.\r
- * Note: There's a bit of extra code here to deal with\r
- * URLs or emails that end in a period. We'll strip these\r
- * off and add them after the link.\r
- *\r
- * @access public\r
- * @param string the string\r
- * @param string the type: email, url, or both\r
- * @param bool whether to create pop-up links\r
- * @return string\r
- */\r
-if ( ! function_exists('auto_link'))\r
-{\r
- function auto_link($str, $type = 'both', $popup = FALSE)\r
- {\r
- if ($type != 'email')\r
- {\r
- if (preg_match_all("#(^|\s|\()((http(s?)://)|(www\.))(\w+[^\s\)\<]+)#i", $str, $matches))\r
- {\r
- $pop = ($popup == TRUE) ? " target=\"_blank\" " : "";\r
- \r
- for ($i = 0; $i < sizeof($matches['0']); $i++)\r
- {\r
- $period = '';\r
- if (preg_match("|\.$|", $matches['6'][$i]))\r
- {\r
- $period = '.';\r
- $matches['6'][$i] = substr($matches['6'][$i], 0, -1);\r
- }\r
- \r
- $str = str_replace($matches['0'][$i],\r
- $matches['1'][$i].'<a href="http'.\r
- $matches['4'][$i].'://'.\r
- $matches['5'][$i].\r
- $matches['6'][$i].'"'.$pop.'>http'.\r
- $matches['4'][$i].'://'.\r
- $matches['5'][$i].\r
- $matches['6'][$i].'</a>'.\r
- $period, $str);\r
- }\r
- }\r
- }\r
-\r
- if ($type != 'url')\r
- {\r
- if (preg_match_all("/([a-zA-Z0-9_\.\-\+Ã…]+)@([a-zA-Z0-9\-]+)\.([a-zA-Z0-9\-\.]*)/i", $str, $matches))\r
- {\r
- for ($i = 0; $i < sizeof($matches['0']); $i++)\r
- {\r
- $period = '';\r
- if (preg_match("|\.$|", $matches['3'][$i]))\r
- {\r
- $period = '.';\r
- $matches['3'][$i] = substr($matches['3'][$i], 0, -1);\r
- }\r
- \r
- $str = str_replace($matches['0'][$i], safe_mailto($matches['1'][$i].'@'.$matches['2'][$i].'.'.$matches['3'][$i]).$period, $str);\r
- }\r
- }\r
- }\r
-\r
- return $str;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Prep URL\r
- *\r
- * Simply adds the http:// part if missing\r
- *\r
- * @access public\r
- * @param string the URL\r
- * @return string\r
- */\r
-if ( ! function_exists('prep_url'))\r
-{\r
- function prep_url($str = '')\r
- {\r
- if ($str == 'http://' OR $str == '')\r
- {\r
- return '';\r
- }\r
-\r
- if (substr($str, 0, 7) != 'http://' && substr($str, 0, 8) != 'https://')\r
- {\r
- $str = 'http://'.$str;\r
- }\r
-\r
- return $str;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Create URL Title\r
- *\r
- * Takes a "title" string as input and creates a\r
- * human-friendly URL string with either a dash\r
- * or an underscore as the word separator.\r
- *\r
- * @access public\r
- * @param string the string\r
- * @param string the separator: dash, or underscore\r
- * @return string\r
- */\r
-if ( ! function_exists('url_title'))\r
-{\r
- function url_title($str, $separator = 'dash')\r
- {\r
- if ($separator == 'dash')\r
- {\r
- $search = '_';\r
- $replace = '-';\r
- }\r
- else\r
- {\r
- $search = '-';\r
- $replace = '_';\r
- }\r
-\r
- $trans = array(\r
- '&\#\d+?;' => '',\r
- '&\S+?;' => '',\r
- '\s+' => $replace,\r
- '[^a-z0-9\-\._]' => '',\r
- $replace.'+' => $replace,\r
- $replace.'$' => $replace,\r
- '^'.$replace => $replace\r
- );\r
-\r
- $str = strip_tags($str);\r
-\r
- foreach ($trans as $key => $val)\r
- {\r
- $str = preg_replace("#".$key."#i", $val, $str);\r
- }\r
-\r
- return trim(stripslashes($str));\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Header Redirect\r
- *\r
- * Header redirect in two flavors\r
- * For very fine grained control over headers, you could use the Output\r
- * Library's set_header() function.\r
- *\r
- * @access public\r
- * @param string the URL\r
- * @param string the method: location or redirect\r
- * @return string\r
- */\r
-if ( ! function_exists('redirect'))\r
-{\r
- function redirect($uri = '', $method = 'location', $http_response_code = 302)\r
- {\r
- switch($method)\r
- {\r
- case 'refresh' : header("Refresh:0;url=".site_url($uri));\r
- break;\r
- default : header("Location: ".site_url($uri), TRUE, $http_response_code);\r
- break;\r
- }\r
- exit;\r
- }\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Parse out the attributes\r
- *\r
- * Some of the functions use this\r
- *\r
- * @access private\r
- * @param array\r
- * @param bool\r
- * @return string\r
- */\r
-if ( ! function_exists('_parse_attributes'))\r
-{\r
- function _parse_attributes($attributes, $javascript = FALSE)\r
- {\r
- if (is_string($attributes))\r
- {\r
- return ($attributes != '') ? ' '.$attributes : '';\r
- }\r
-\r
- $att = '';\r
- foreach ($attributes as $key => $val)\r
- {\r
- if ($javascript == TRUE)\r
- {\r
- $att .= $key . '=' . $val . ',';\r
- }\r
- else\r
- {\r
- $att .= ' ' . $key . '="' . $val . '"';\r
- }\r
- }\r
-\r
- if ($javascript == TRUE AND $att != '')\r
- {\r
- $att = substr($att, 0, -1);\r
- }\r
-\r
- return $att;\r
- }\r
-}\r
-\r
-\r
-/* End of file url_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter URL Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/url_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Site URL
+ *
+ * Create a local URL based on your basepath. Segments can be passed via the
+ * first parameter either as a string or an array.
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('site_url'))
+{
+ function site_url($uri = '')
+ {
+ $CI =& get_instance();
+ return $CI->config->site_url($uri);
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Base URL
+ *
+ * Returns the "base_url" item from your config file
+ *
+ * @access public
+ * @return string
+ */
+if ( ! function_exists('base_url'))
+{
+ function base_url()
+ {
+ $CI =& get_instance();
+ return $CI->config->slash_item('base_url');
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Current URL
+ *
+ * Returns the full URL (including segments) of the page where this
+ * function is placed
+ *
+ * @access public
+ * @return string
+ */
+if ( ! function_exists('current_url'))
+{
+ function current_url()
+ {
+ $CI =& get_instance();
+ return $CI->config->site_url($CI->uri->uri_string());
+ }
+}
+
+// ------------------------------------------------------------------------
+/**
+ * URL String
+ *
+ * Returns the URI segments.
+ *
+ * @access public
+ * @return string
+ */
+if ( ! function_exists('uri_string'))
+{
+ function uri_string()
+ {
+ $CI =& get_instance();
+ return $CI->uri->uri_string();
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Index page
+ *
+ * Returns the "index_page" from your config file
+ *
+ * @access public
+ * @return string
+ */
+if ( ! function_exists('index_page'))
+{
+ function index_page()
+ {
+ $CI =& get_instance();
+ return $CI->config->item('index_page');
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Anchor Link
+ *
+ * Creates an anchor based on the local URL.
+ *
+ * @access public
+ * @param string the URL
+ * @param string the link title
+ * @param mixed any attributes
+ * @return string
+ */
+if ( ! function_exists('anchor'))
+{
+ function anchor($uri = '', $title = '', $attributes = '')
+ {
+ $title = (string) $title;
+
+ if ( ! is_array($uri))
+ {
+ $site_url = ( ! preg_match('!^\w+://! i', $uri)) ? site_url($uri) : $uri;
+ }
+ else
+ {
+ $site_url = site_url($uri);
+ }
+
+ if ($title == '')
+ {
+ $title = $site_url;
+ }
+
+ if ($attributes != '')
+ {
+ $attributes = _parse_attributes($attributes);
+ }
+
+ return '<a href="'.$site_url.'"'.$attributes.'>'.$title.'</a>';
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Anchor Link - Pop-up version
+ *
+ * Creates an anchor based on the local URL. The link
+ * opens a new window based on the attributes specified.
+ *
+ * @access public
+ * @param string the URL
+ * @param string the link title
+ * @param mixed any attributes
+ * @return string
+ */
+if ( ! function_exists('anchor_popup'))
+{
+ function anchor_popup($uri = '', $title = '', $attributes = FALSE)
+ {
+ $title = (string) $title;
+
+ $site_url = ( ! preg_match('!^\w+://! i', $uri)) ? site_url($uri) : $uri;
+
+ if ($title == '')
+ {
+ $title = $site_url;
+ }
+
+ if ($attributes === FALSE)
+ {
+ return "<a href='javascript:void(0);' onclick=\"window.open('".$site_url."', '_blank');\">".$title."</a>";
+ }
+
+ if ( ! is_array($attributes))
+ {
+ $attributes = array();
+ }
+
+ foreach (array('width' => '800', 'height' => '600', 'scrollbars' => 'yes', 'status' => 'yes', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0', ) as $key => $val)
+ {
+ $atts[$key] = ( ! isset($attributes[$key])) ? $val : $attributes[$key];
+ unset($attributes[$key]);
+ }
+
+ if ($attributes != '')
+ {
+ $attributes = _parse_attributes($attributes);
+ }
+
+ return "<a href='javascript:void(0);' onclick=\"window.open('".$site_url."', '_blank', '"._parse_attributes($atts, TRUE)."');\"$attributes>".$title."</a>";
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Mailto Link
+ *
+ * @access public
+ * @param string the email address
+ * @param string the link title
+ * @param mixed any attributes
+ * @return string
+ */
+if ( ! function_exists('mailto'))
+{
+ function mailto($email, $title = '', $attributes = '')
+ {
+ $title = (string) $title;
+
+ if ($title == "")
+ {
+ $title = $email;
+ }
+
+ $attributes = _parse_attributes($attributes);
+
+ return '<a href="mailto:'.$email.'"'.$attributes.'>'.$title.'</a>';
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Encoded Mailto Link
+ *
+ * Create a spam-protected mailto link written in Javascript
+ *
+ * @access public
+ * @param string the email address
+ * @param string the link title
+ * @param mixed any attributes
+ * @return string
+ */
+if ( ! function_exists('safe_mailto'))
+{
+ function safe_mailto($email, $title = '', $attributes = '')
+ {
+ $title = (string) $title;
+
+ if ($title == "")
+ {
+ $title = $email;
+ }
+
+ for ($i = 0; $i < 16; $i++)
+ {
+ $x[] = substr('<a href="mailto:', $i, 1);
+ }
+
+ for ($i = 0; $i < strlen($email); $i++)
+ {
+ $x[] = "|".ord(substr($email, $i, 1));
+ }
+
+ $x[] = '"';
+
+ if ($attributes != '')
+ {
+ if (is_array($attributes))
+ {
+ foreach ($attributes as $key => $val)
+ {
+ $x[] = ' '.$key.'="';
+ for ($i = 0; $i < strlen($val); $i++)
+ {
+ $x[] = "|".ord(substr($val, $i, 1));
+ }
+ $x[] = '"';
+ }
+ }
+ else
+ {
+ for ($i = 0; $i < strlen($attributes); $i++)
+ {
+ $x[] = substr($attributes, $i, 1);
+ }
+ }
+ }
+
+ $x[] = '>';
+
+ $temp = array();
+ for ($i = 0; $i < strlen($title); $i++)
+ {
+ $ordinal = ord($title[$i]);
+
+ if ($ordinal < 128)
+ {
+ $x[] = "|".$ordinal;
+ }
+ else
+ {
+ if (count($temp) == 0)
+ {
+ $count = ($ordinal < 224) ? 2 : 3;
+ }
+
+ $temp[] = $ordinal;
+ if (count($temp) == $count)
+ {
+ $number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64);
+ $x[] = "|".$number;
+ $count = 1;
+ $temp = array();
+ }
+ }
+ }
+
+ $x[] = '<'; $x[] = '/'; $x[] = 'a'; $x[] = '>';
+
+ $x = array_reverse($x);
+ ob_start();
+
+ ?><script type="text/javascript">
+ //<![CDATA[
+ var l=new Array();
+ <?php
+ $i = 0;
+ foreach ($x as $val){ ?>l[<?php echo $i++; ?>]='<?php echo $val; ?>';<?php } ?>
+
+ for (var i = l.length-1; i >= 0; i=i-1){
+ if (l[i].substring(0, 1) == '|') document.write("&#"+unescape(l[i].substring(1))+";");
+ else document.write(unescape(l[i]));}
+ //]]>
+ </script><?php
+
+ $buffer = ob_get_contents();
+ ob_end_clean();
+ return $buffer;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Auto-linker
+ *
+ * Automatically links URL and Email addresses.
+ * Note: There's a bit of extra code here to deal with
+ * URLs or emails that end in a period. We'll strip these
+ * off and add them after the link.
+ *
+ * @access public
+ * @param string the string
+ * @param string the type: email, url, or both
+ * @param bool whether to create pop-up links
+ * @return string
+ */
+if ( ! function_exists('auto_link'))
+{
+ function auto_link($str, $type = 'both', $popup = FALSE)
+ {
+ if ($type != 'email')
+ {
+ if (preg_match_all("#(^|\s|\()((http(s?)://)|(www\.))(\w+[^\s\)\<]+)#i", $str, $matches))
+ {
+ $pop = ($popup == TRUE) ? " target=\"_blank\" " : "";
+
+ for ($i = 0; $i < sizeof($matches['0']); $i++)
+ {
+ $period = '';
+ if (preg_match("|\.$|", $matches['6'][$i]))
+ {
+ $period = '.';
+ $matches['6'][$i] = substr($matches['6'][$i], 0, -1);
+ }
+
+ $str = str_replace($matches['0'][$i],
+ $matches['1'][$i].'<a href="http'.
+ $matches['4'][$i].'://'.
+ $matches['5'][$i].
+ $matches['6'][$i].'"'.$pop.'>http'.
+ $matches['4'][$i].'://'.
+ $matches['5'][$i].
+ $matches['6'][$i].'</a>'.
+ $period, $str);
+ }
+ }
+ }
+
+ if ($type != 'url')
+ {
+ if (preg_match_all("/([a-zA-Z0-9_\.\-\+Ã…]+)@([a-zA-Z0-9\-]+)\.([a-zA-Z0-9\-\.]*)/i", $str, $matches))
+ {
+ for ($i = 0; $i < sizeof($matches['0']); $i++)
+ {
+ $period = '';
+ if (preg_match("|\.$|", $matches['3'][$i]))
+ {
+ $period = '.';
+ $matches['3'][$i] = substr($matches['3'][$i], 0, -1);
+ }
+
+ $str = str_replace($matches['0'][$i], safe_mailto($matches['1'][$i].'@'.$matches['2'][$i].'.'.$matches['3'][$i]).$period, $str);
+ }
+ }
+ }
+
+ return $str;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Prep URL
+ *
+ * Simply adds the http:// part if missing
+ *
+ * @access public
+ * @param string the URL
+ * @return string
+ */
+if ( ! function_exists('prep_url'))
+{
+ function prep_url($str = '')
+ {
+ if ($str == 'http://' OR $str == '')
+ {
+ return '';
+ }
+
+ if (substr($str, 0, 7) != 'http://' && substr($str, 0, 8) != 'https://')
+ {
+ $str = 'http://'.$str;
+ }
+
+ return $str;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Create URL Title
+ *
+ * Takes a "title" string as input and creates a
+ * human-friendly URL string with either a dash
+ * or an underscore as the word separator.
+ *
+ * @access public
+ * @param string the string
+ * @param string the separator: dash, or underscore
+ * @return string
+ */
+if ( ! function_exists('url_title'))
+{
+ function url_title($str, $separator = 'dash')
+ {
+ if ($separator == 'dash')
+ {
+ $search = '_';
+ $replace = '-';
+ }
+ else
+ {
+ $search = '-';
+ $replace = '_';
+ }
+
+ $trans = array(
+ '&\#\d+?;' => '',
+ '&\S+?;' => '',
+ '\s+' => $replace,
+ '[^a-z0-9\-\._]' => '',
+ $replace.'+' => $replace,
+ $replace.'$' => $replace,
+ '^'.$replace => $replace
+ );
+
+ $str = strip_tags($str);
+
+ foreach ($trans as $key => $val)
+ {
+ $str = preg_replace("#".$key."#i", $val, $str);
+ }
+
+ return trim(stripslashes($str));
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Header Redirect
+ *
+ * Header redirect in two flavors
+ * For very fine grained control over headers, you could use the Output
+ * Library's set_header() function.
+ *
+ * @access public
+ * @param string the URL
+ * @param string the method: location or redirect
+ * @return string
+ */
+if ( ! function_exists('redirect'))
+{
+ function redirect($uri = '', $method = 'location', $http_response_code = 302)
+ {
+ switch($method)
+ {
+ case 'refresh' : header("Refresh:0;url=".site_url($uri));
+ break;
+ default : header("Location: ".site_url($uri), TRUE, $http_response_code);
+ break;
+ }
+ exit;
+ }
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * Parse out the attributes
+ *
+ * Some of the functions use this
+ *
+ * @access private
+ * @param array
+ * @param bool
+ * @return string
+ */
+if ( ! function_exists('_parse_attributes'))
+{
+ function _parse_attributes($attributes, $javascript = FALSE)
+ {
+ if (is_string($attributes))
+ {
+ return ($attributes != '') ? ' '.$attributes : '';
+ }
+
+ $att = '';
+ foreach ($attributes as $key => $val)
+ {
+ if ($javascript == TRUE)
+ {
+ $att .= $key . '=' . $val . ',';
+ }
+ else
+ {
+ $att .= ' ' . $key . '="' . $val . '"';
+ }
+ }
+
+ if ($javascript == TRUE AND $att != '')
+ {
+ $att = substr($att, 0, -1);
+ }
+
+ return $att;
+ }
+}
+
+
+/* End of file url_helper.php */
/* Location: ./system/helpers/url_helper.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter XML Helpers\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Helpers\r
- * @category Helpers\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/helpers/xml_helper.html\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Convert Reserved XML characters to Entities\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
-if ( ! function_exists('xml_convert'))\r
-{\r
- function xml_convert($str)\r
- {\r
- $temp = '__TEMP_AMPERSANDS__';\r
-\r
- // Replace entities to temporary markers so that \r
- // ampersands won't get messed up\r
- $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str);\r
- $str = preg_replace("/&(\w+);/", "$temp\\1;", $str);\r
- \r
- $str = str_replace(array("&","<",">","\"", "'", "-"),\r
- array("&", "<", ">", """, "'", "-"),\r
- $str);\r
-\r
- // Decode the temp markers back to entities \r
- $str = preg_replace("/$temp(\d+);/","&#\\1;",$str);\r
- $str = preg_replace("/$temp(\w+);/","&\\1;", $str);\r
- \r
- return $str;\r
- }\r
-}\r
-\r
-\r
-/* End of file xml_helper.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter XML Helpers
+ *
+ * @package CodeIgniter
+ * @subpackage Helpers
+ * @category Helpers
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/helpers/xml_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Convert Reserved XML characters to Entities
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+if ( ! function_exists('xml_convert'))
+{
+ function xml_convert($str)
+ {
+ $temp = '__TEMP_AMPERSANDS__';
+
+ // Replace entities to temporary markers so that
+ // ampersands won't get messed up
+ $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str);
+ $str = preg_replace("/&(\w+);/", "$temp\\1;", $str);
+
+ $str = str_replace(array("&","<",">","\"", "'", "-"),
+ array("&", "<", ">", """, "'", "-"),
+ $str);
+
+ // Decode the temp markers back to entities
+ $str = preg_replace("/$temp(\d+);/","&#\\1;",$str);
+ $str = preg_replace("/$temp(\w+);/","&\\1;", $str);
+
+ return $str;
+ }
+}
+
+
+/* End of file xml_helper.php */
/* Location: ./system/helpers/xml_helper.php */
\ No newline at end of file
-<?php\r
-\r
-$lang['cal_su'] = "Su";\r
-$lang['cal_mo'] = "Mo";\r
-$lang['cal_tu'] = "Tu";\r
-$lang['cal_we'] = "We";\r
-$lang['cal_th'] = "Th";\r
-$lang['cal_fr'] = "Fr";\r
-$lang['cal_sa'] = "Sa";\r
-$lang['cal_sun'] = "Sun";\r
-$lang['cal_mon'] = "Mon";\r
-$lang['cal_tue'] = "Tue";\r
-$lang['cal_wed'] = "Wed";\r
-$lang['cal_thu'] = "Thu";\r
-$lang['cal_fri'] = "Fri";\r
-$lang['cal_sat'] = "Sat";\r
-$lang['cal_sunday'] = "Sunday";\r
-$lang['cal_monday'] = "Monday";\r
-$lang['cal_tuesday'] = "Tuesday";\r
-$lang['cal_wednesday'] = "Wednesday";\r
-$lang['cal_thursday'] = "Thursday";\r
-$lang['cal_friday'] = "Friday";\r
-$lang['cal_saturday'] = "Saturday";\r
-$lang['cal_jan'] = "Jan";\r
-$lang['cal_feb'] = "Feb";\r
-$lang['cal_mar'] = "Mar";\r
-$lang['cal_apr'] = "Apr";\r
-$lang['cal_may'] = "May";\r
-$lang['cal_jun'] = "Jun";\r
-$lang['cal_jul'] = "Jul";\r
-$lang['cal_aug'] = "Aug";\r
-$lang['cal_sep'] = "Sep";\r
-$lang['cal_oct'] = "Oct";\r
-$lang['cal_nov'] = "Nov";\r
-$lang['cal_dec'] = "Dec";\r
-$lang['cal_january'] = "January";\r
-$lang['cal_february'] = "February";\r
-$lang['cal_march'] = "March";\r
-$lang['cal_april'] = "April";\r
-$lang['cal_mayl'] = "May";\r
-$lang['cal_june'] = "June";\r
-$lang['cal_july'] = "July";\r
-$lang['cal_august'] = "August";\r
-$lang['cal_september'] = "September";\r
-$lang['cal_october'] = "October";\r
-$lang['cal_november'] = "November";\r
-$lang['cal_december'] = "December";\r
-\r
+<?php
+
+$lang['cal_su'] = "Su";
+$lang['cal_mo'] = "Mo";
+$lang['cal_tu'] = "Tu";
+$lang['cal_we'] = "We";
+$lang['cal_th'] = "Th";
+$lang['cal_fr'] = "Fr";
+$lang['cal_sa'] = "Sa";
+$lang['cal_sun'] = "Sun";
+$lang['cal_mon'] = "Mon";
+$lang['cal_tue'] = "Tue";
+$lang['cal_wed'] = "Wed";
+$lang['cal_thu'] = "Thu";
+$lang['cal_fri'] = "Fri";
+$lang['cal_sat'] = "Sat";
+$lang['cal_sunday'] = "Sunday";
+$lang['cal_monday'] = "Monday";
+$lang['cal_tuesday'] = "Tuesday";
+$lang['cal_wednesday'] = "Wednesday";
+$lang['cal_thursday'] = "Thursday";
+$lang['cal_friday'] = "Friday";
+$lang['cal_saturday'] = "Saturday";
+$lang['cal_jan'] = "Jan";
+$lang['cal_feb'] = "Feb";
+$lang['cal_mar'] = "Mar";
+$lang['cal_apr'] = "Apr";
+$lang['cal_may'] = "May";
+$lang['cal_jun'] = "Jun";
+$lang['cal_jul'] = "Jul";
+$lang['cal_aug'] = "Aug";
+$lang['cal_sep'] = "Sep";
+$lang['cal_oct'] = "Oct";
+$lang['cal_nov'] = "Nov";
+$lang['cal_dec'] = "Dec";
+$lang['cal_january'] = "January";
+$lang['cal_february'] = "February";
+$lang['cal_march'] = "March";
+$lang['cal_april'] = "April";
+$lang['cal_mayl'] = "May";
+$lang['cal_june'] = "June";
+$lang['cal_july'] = "July";
+$lang['cal_august'] = "August";
+$lang['cal_september'] = "September";
+$lang['cal_october'] = "October";
+$lang['cal_november'] = "November";
+$lang['cal_december'] = "December";
+
/* End of file calendar_lang.php */
/* Location: ./system/language/english/calendar_lang.php */
\ No newline at end of file
-<?php\r
-\r
-$lang['date_year'] = "Year";\r
-$lang['date_years'] = "Years";\r
-$lang['date_month'] = "Month";\r
-$lang['date_months'] = "Months";\r
-$lang['date_week'] = "Week";\r
-$lang['date_weeks'] = "Weeks";\r
-$lang['date_day'] = "Day";\r
-$lang['date_days'] = "Days";\r
-$lang['date_hour'] = "Hour";\r
-$lang['date_hours'] = "Hours";\r
-$lang['date_minute'] = "Minute";\r
-$lang['date_minutes'] = "Minutes";\r
-$lang['date_second'] = "Second";\r
-$lang['date_seconds'] = "Seconds";\r
-\r
-$lang['UM12'] = '(UTC -12:00) Baker/Howland Island';\r
-$lang['UM11'] = '(UTC -11:00) Samoa Time Zone, Niue';\r
-$lang['UM10'] = '(UTC -10:00) Hawaii-Aleutian Standard Time, Cook Islands, Tahiti';\r
-$lang['UM95'] = '(UTC -9:30) Marquesas Islands';\r
-$lang['UM9'] = '(UTC -9:00) Alaska Standard Time, Gambier Islands';\r
-$lang['UM8'] = '(UTC -8:00) Pacific Standard Time, Clipperton Island';\r
-$lang['UM7'] = '(UTC -7:00) Mountain Standard Time';\r
-$lang['UM6'] = '(UTC -6:00) Central Standard Time';\r
-$lang['UM5'] = '(UTC -5:00) Eastern Standard Time, Western Caribbean Standard Time';\r
-$lang['UM45'] = '(UTC -4:30) Venezuelan Standard Time';\r
-$lang['UM4'] = '(UTC -4:00) Atlantic Standard Time, Eastern Caribbean Standard Time';\r
-$lang['UM35'] = '(UTC -3:30) Newfoundland Standard Time';\r
-$lang['UM3'] = '(UTC -3:00) Argentina, Brazil, French Guiana, Uruguay';\r
-$lang['UM2'] = '(UTC -2:00) South Georgia/South Sandwich Islands';\r
-$lang['UM1'] = '(UTC -1:00) Azores, Cape Verde Islands';\r
-$lang['UTC'] = '(UTC) Greenwich Mean Time, Western European Time';\r
-$lang['UP1'] = '(UTC +1:00) Central European Time, West Africa Time';\r
-$lang['UP2'] = '(UTC +2:00) Central Africa Time, Eastern European Time, Kaliningrad Time';\r
-$lang['UP3'] = '(UTC +3:00) Moscow Time, East Africa Time';\r
-$lang['UP35'] = '(UTC +3:30) Iran Standard Time';\r
-$lang['UP4'] = '(UTC +4:00) Azerbaijan Standard Time, Samara Time';\r
-$lang['UP45'] = '(UTC +4:30) Afghanistan';\r
-$lang['UP5'] = '(UTC +5:00) Pakistan Standard Time, Yekaterinburg Time';\r
-$lang['UP55'] = '(UTC +5:30) Indian Standard Time, Sri Lanka Time';\r
-$lang['UP575'] = '(UTC +5:45) Nepal Time';\r
-$lang['UP6'] = '(UTC +6:00) Bangladesh Standard Time, Bhutan Time, Omsk Time';\r
-$lang['UP65'] = '(UTC +6:30) Cocos Islands, Myanmar';\r
-$lang['UP7'] = '(UTC +7:00) Krasnoyarsk Time, Cambodia, Laos, Thailand, Vietnam';\r
-$lang['UP8'] = '(UTC +8:00) Australian Western Standard Time, Beijing Time, Irkutsk Time';\r
-$lang['UP875'] = '(UTC +8:45) Australian Central Western Standard Time';\r
-$lang['UP9'] = '(UTC +9:00) Japan Standard Time, Korea Standard Time, Yakutsk Time';\r
-$lang['UP95'] = '(UTC +9:30) Australian Central Standard Time';\r
-$lang['UP10'] = '(UTC +10:00) Australian Eastern Standard Time, Vladivostok Time';\r
-$lang['UP105'] = '(UTC +10:30) Lord Howe Island';\r
-$lang['UP11'] = '(UTC +11:00) Magadan Time, Solomon Islands, Vanuatu';\r
-$lang['UP115'] = '(UTC +11:30) Norfolk Island';\r
-$lang['UP12'] = '(UTC +12:00) Fiji, Gilbert Islands, Kamchatka Time, New Zealand Standard Time';\r
-$lang['UP1275'] = '(UTC +12:45) Chatham Islands Standard Time';\r
-$lang['UP13'] = '(UTC +13:00) Phoenix Islands Time, Tonga';\r
-$lang['UP14'] = '(UTC +14:00) Line Islands';\r
-\r
-/* End of file date_lang.php */\r
+<?php
+
+$lang['date_year'] = "Year";
+$lang['date_years'] = "Years";
+$lang['date_month'] = "Month";
+$lang['date_months'] = "Months";
+$lang['date_week'] = "Week";
+$lang['date_weeks'] = "Weeks";
+$lang['date_day'] = "Day";
+$lang['date_days'] = "Days";
+$lang['date_hour'] = "Hour";
+$lang['date_hours'] = "Hours";
+$lang['date_minute'] = "Minute";
+$lang['date_minutes'] = "Minutes";
+$lang['date_second'] = "Second";
+$lang['date_seconds'] = "Seconds";
+
+$lang['UM12'] = '(UTC -12:00) Baker/Howland Island';
+$lang['UM11'] = '(UTC -11:00) Samoa Time Zone, Niue';
+$lang['UM10'] = '(UTC -10:00) Hawaii-Aleutian Standard Time, Cook Islands, Tahiti';
+$lang['UM95'] = '(UTC -9:30) Marquesas Islands';
+$lang['UM9'] = '(UTC -9:00) Alaska Standard Time, Gambier Islands';
+$lang['UM8'] = '(UTC -8:00) Pacific Standard Time, Clipperton Island';
+$lang['UM7'] = '(UTC -7:00) Mountain Standard Time';
+$lang['UM6'] = '(UTC -6:00) Central Standard Time';
+$lang['UM5'] = '(UTC -5:00) Eastern Standard Time, Western Caribbean Standard Time';
+$lang['UM45'] = '(UTC -4:30) Venezuelan Standard Time';
+$lang['UM4'] = '(UTC -4:00) Atlantic Standard Time, Eastern Caribbean Standard Time';
+$lang['UM35'] = '(UTC -3:30) Newfoundland Standard Time';
+$lang['UM3'] = '(UTC -3:00) Argentina, Brazil, French Guiana, Uruguay';
+$lang['UM2'] = '(UTC -2:00) South Georgia/South Sandwich Islands';
+$lang['UM1'] = '(UTC -1:00) Azores, Cape Verde Islands';
+$lang['UTC'] = '(UTC) Greenwich Mean Time, Western European Time';
+$lang['UP1'] = '(UTC +1:00) Central European Time, West Africa Time';
+$lang['UP2'] = '(UTC +2:00) Central Africa Time, Eastern European Time, Kaliningrad Time';
+$lang['UP3'] = '(UTC +3:00) Moscow Time, East Africa Time';
+$lang['UP35'] = '(UTC +3:30) Iran Standard Time';
+$lang['UP4'] = '(UTC +4:00) Azerbaijan Standard Time, Samara Time';
+$lang['UP45'] = '(UTC +4:30) Afghanistan';
+$lang['UP5'] = '(UTC +5:00) Pakistan Standard Time, Yekaterinburg Time';
+$lang['UP55'] = '(UTC +5:30) Indian Standard Time, Sri Lanka Time';
+$lang['UP575'] = '(UTC +5:45) Nepal Time';
+$lang['UP6'] = '(UTC +6:00) Bangladesh Standard Time, Bhutan Time, Omsk Time';
+$lang['UP65'] = '(UTC +6:30) Cocos Islands, Myanmar';
+$lang['UP7'] = '(UTC +7:00) Krasnoyarsk Time, Cambodia, Laos, Thailand, Vietnam';
+$lang['UP8'] = '(UTC +8:00) Australian Western Standard Time, Beijing Time, Irkutsk Time';
+$lang['UP875'] = '(UTC +8:45) Australian Central Western Standard Time';
+$lang['UP9'] = '(UTC +9:00) Japan Standard Time, Korea Standard Time, Yakutsk Time';
+$lang['UP95'] = '(UTC +9:30) Australian Central Standard Time';
+$lang['UP10'] = '(UTC +10:00) Australian Eastern Standard Time, Vladivostok Time';
+$lang['UP105'] = '(UTC +10:30) Lord Howe Island';
+$lang['UP11'] = '(UTC +11:00) Magadan Time, Solomon Islands, Vanuatu';
+$lang['UP115'] = '(UTC +11:30) Norfolk Island';
+$lang['UP12'] = '(UTC +12:00) Fiji, Gilbert Islands, Kamchatka Time, New Zealand Standard Time';
+$lang['UP1275'] = '(UTC +12:45) Chatham Islands Standard Time';
+$lang['UP13'] = '(UTC +13:00) Phoenix Islands Time, Tonga';
+$lang['UP14'] = '(UTC +14:00) Line Islands';
+
+/* End of file date_lang.php */
/* Location: ./system/language/english/date_lang.php */
\ No newline at end of file
-<?php\r
-\r
-$lang['db_invalid_connection_str'] = 'Unable to determine the database settings based on the connection string you submitted.';\r
-$lang['db_unable_to_connect'] = 'Unable to connect to your database server using the provided settings.';\r
-$lang['db_unable_to_select'] = 'Unable to select the specified database: %s';\r
-$lang['db_unable_to_create'] = 'Unable to create the specified database: %s';\r
-$lang['db_invalid_query'] = 'The query you submitted is not valid.';\r
-$lang['db_must_set_table'] = 'You must set the database table to be used with your query.';\r
-$lang['db_must_set_database'] = 'You must set the database name in your database config file.';\r
-$lang['db_must_use_set'] = 'You must use the "set" method to update an entry.';\r
-$lang['db_must_use_where'] = 'Updates are not allowed unless they contain a "where" clause.';\r
-$lang['db_del_must_use_where'] = 'Deletes are not allowed unless they contain a "where" or "like" clause.';\r
-$lang['db_field_param_missing'] = 'To fetch fields requires the name of the table as a parameter.';\r
-$lang['db_unsupported_function'] = 'This feature is not available for the database you are using.';\r
-$lang['db_transaction_failure'] = 'Transaction failure: Rollback performed.';\r
-$lang['db_unable_to_drop'] = 'Unable to drop the specified database.';\r
-$lang['db_unsuported_feature'] = 'Unsupported feature of the database platform you are using.';\r
-$lang['db_unsuported_compression'] = 'The file compression format you chose is not supported by your server.';\r
-$lang['db_filepath_error'] = 'Unable to write data to the file path you have submitted.';\r
-$lang['db_invalid_cache_path'] = 'The cache path you submitted is not valid or writable.';\r
-$lang['db_table_name_required'] = 'A table name is required for that operation.';\r
-$lang['db_column_name_required'] = 'A column name is required for that operation.';\r
-$lang['db_column_definition_required'] = 'A column definition is required for that operation.';\r
-$lang['db_unable_to_set_charset'] = 'Unable to set client connection character set: %s';\r
-$lang['db_error_heading'] = 'A Database Error Occurred';\r
-\r
-/* End of file db_lang.php */\r
+<?php
+
+$lang['db_invalid_connection_str'] = 'Unable to determine the database settings based on the connection string you submitted.';
+$lang['db_unable_to_connect'] = 'Unable to connect to your database server using the provided settings.';
+$lang['db_unable_to_select'] = 'Unable to select the specified database: %s';
+$lang['db_unable_to_create'] = 'Unable to create the specified database: %s';
+$lang['db_invalid_query'] = 'The query you submitted is not valid.';
+$lang['db_must_set_table'] = 'You must set the database table to be used with your query.';
+$lang['db_must_set_database'] = 'You must set the database name in your database config file.';
+$lang['db_must_use_set'] = 'You must use the "set" method to update an entry.';
+$lang['db_must_use_where'] = 'Updates are not allowed unless they contain a "where" clause.';
+$lang['db_del_must_use_where'] = 'Deletes are not allowed unless they contain a "where" or "like" clause.';
+$lang['db_field_param_missing'] = 'To fetch fields requires the name of the table as a parameter.';
+$lang['db_unsupported_function'] = 'This feature is not available for the database you are using.';
+$lang['db_transaction_failure'] = 'Transaction failure: Rollback performed.';
+$lang['db_unable_to_drop'] = 'Unable to drop the specified database.';
+$lang['db_unsuported_feature'] = 'Unsupported feature of the database platform you are using.';
+$lang['db_unsuported_compression'] = 'The file compression format you chose is not supported by your server.';
+$lang['db_filepath_error'] = 'Unable to write data to the file path you have submitted.';
+$lang['db_invalid_cache_path'] = 'The cache path you submitted is not valid or writable.';
+$lang['db_table_name_required'] = 'A table name is required for that operation.';
+$lang['db_column_name_required'] = 'A column name is required for that operation.';
+$lang['db_column_definition_required'] = 'A column definition is required for that operation.';
+$lang['db_unable_to_set_charset'] = 'Unable to set client connection character set: %s';
+$lang['db_error_heading'] = 'A Database Error Occurred';
+
+/* End of file db_lang.php */
/* Location: ./system/language/english/db_lang.php */
\ No newline at end of file
-<?php\r
-\r
-$lang['email_must_be_array'] = "The email validation method must be passed an array.";\r
-$lang['email_invalid_address'] = "Invalid email address: %s";\r
-$lang['email_attachment_missing'] = "Unable to locate the following email attachment: %s";\r
-$lang['email_attachment_unreadable'] = "Unable to open this attachment: %s";\r
-$lang['email_no_recipients'] = "You must include recipients: To, Cc, or Bcc";\r
-$lang['email_send_failure_phpmail'] = "Unable to send email using PHP mail(). Your server might not be configured to send mail using this method.";\r
-$lang['email_send_failure_sendmail'] = "Unable to send email using PHP Sendmail. Your server might not be configured to send mail using this method.";\r
-$lang['email_send_failure_smtp'] = "Unable to send email using PHP SMTP. Your server might not be configured to send mail using this method.";\r
-$lang['email_sent'] = "Your message has been successfully sent using the following protocol: %s";\r
-$lang['email_no_socket'] = "Unable to open a socket to Sendmail. Please check settings.";\r
-$lang['email_no_hostname'] = "You did not specify a SMTP hostname.";\r
-$lang['email_smtp_error'] = "The following SMTP error was encountered: %s";\r
-$lang['email_no_smtp_unpw'] = "Error: You must assign a SMTP username and password.";\r
-$lang['email_failed_smtp_login'] = "Failed to send AUTH LOGIN command. Error: %s";\r
-$lang['email_smtp_auth_un'] = "Failed to authenticate username. Error: %s";\r
-$lang['email_smtp_auth_pw'] = "Failed to authenticate password. Error: %s";\r
-$lang['email_smtp_data_failure'] = "Unable to send data: %s";\r
-\r
+<?php
+
+$lang['email_must_be_array'] = "The email validation method must be passed an array.";
+$lang['email_invalid_address'] = "Invalid email address: %s";
+$lang['email_attachment_missing'] = "Unable to locate the following email attachment: %s";
+$lang['email_attachment_unreadable'] = "Unable to open this attachment: %s";
+$lang['email_no_recipients'] = "You must include recipients: To, Cc, or Bcc";
+$lang['email_send_failure_phpmail'] = "Unable to send email using PHP mail(). Your server might not be configured to send mail using this method.";
+$lang['email_send_failure_sendmail'] = "Unable to send email using PHP Sendmail. Your server might not be configured to send mail using this method.";
+$lang['email_send_failure_smtp'] = "Unable to send email using PHP SMTP. Your server might not be configured to send mail using this method.";
+$lang['email_sent'] = "Your message has been successfully sent using the following protocol: %s";
+$lang['email_no_socket'] = "Unable to open a socket to Sendmail. Please check settings.";
+$lang['email_no_hostname'] = "You did not specify a SMTP hostname.";
+$lang['email_smtp_error'] = "The following SMTP error was encountered: %s";
+$lang['email_no_smtp_unpw'] = "Error: You must assign a SMTP username and password.";
+$lang['email_failed_smtp_login'] = "Failed to send AUTH LOGIN command. Error: %s";
+$lang['email_smtp_auth_un'] = "Failed to authenticate username. Error: %s";
+$lang['email_smtp_auth_pw'] = "Failed to authenticate password. Error: %s";
+$lang['email_smtp_data_failure'] = "Unable to send data: %s";
+
/* End of file email_lang.php */
/* Location: ./system/language/english/email_lang.php */
\ No newline at end of file
-<?php\r
-\r
-$lang['required'] = "The %s field is required.";\r
-$lang['isset'] = "The %s field must have a value.";\r
-$lang['valid_email'] = "The %s field must contain a valid email address.";\r
-$lang['valid_emails'] = "The %s field must contain all valid email addresses.";\r
-$lang['valid_url'] = "The %s field must contain a valid URL.";\r
-$lang['valid_ip'] = "The %s field must contain a valid IP.";\r
-$lang['min_length'] = "The %s field must be at least %s characters in length.";\r
-$lang['max_length'] = "The %s field can not exceed %s characters in length.";\r
-$lang['exact_length'] = "The %s field must be exactly %s characters in length.";\r
-$lang['alpha'] = "The %s field may only contain alphabetical characters.";\r
-$lang['alpha_numeric'] = "The %s field may only contain alpha-numeric characters.";\r
-$lang['alpha_dash'] = "The %s field may only contain alpha-numeric characters, underscores, and dashes.";\r
-$lang['numeric'] = "The %s field must contain only numbers.";\r
-$lang['is_numeric'] = "The %s field must contain only numeric characters.";\r
-$lang['integer'] = "The %s field must contain an integer.";\r
-$lang['matches'] = "The %s field does not match the %s field.";\r
-$lang['is_natural'] = "The %s field must contain only positive numbers.";\r
-$lang['is_natural_no_zero'] = "The %s field must contain a number greater than zero.";\r
-\r
-\r
-/* End of file form_validation_lang.php */\r
+<?php
+
+$lang['required'] = "The %s field is required.";
+$lang['isset'] = "The %s field must have a value.";
+$lang['valid_email'] = "The %s field must contain a valid email address.";
+$lang['valid_emails'] = "The %s field must contain all valid email addresses.";
+$lang['valid_url'] = "The %s field must contain a valid URL.";
+$lang['valid_ip'] = "The %s field must contain a valid IP.";
+$lang['min_length'] = "The %s field must be at least %s characters in length.";
+$lang['max_length'] = "The %s field can not exceed %s characters in length.";
+$lang['exact_length'] = "The %s field must be exactly %s characters in length.";
+$lang['alpha'] = "The %s field may only contain alphabetical characters.";
+$lang['alpha_numeric'] = "The %s field may only contain alpha-numeric characters.";
+$lang['alpha_dash'] = "The %s field may only contain alpha-numeric characters, underscores, and dashes.";
+$lang['numeric'] = "The %s field must contain only numbers.";
+$lang['is_numeric'] = "The %s field must contain only numeric characters.";
+$lang['integer'] = "The %s field must contain an integer.";
+$lang['matches'] = "The %s field does not match the %s field.";
+$lang['is_natural'] = "The %s field must contain only positive numbers.";
+$lang['is_natural_no_zero'] = "The %s field must contain a number greater than zero.";
+
+
+/* End of file form_validation_lang.php */
/* Location: ./system/language/english/form_validation_lang.php */
\ No newline at end of file
-<?php\r
-\r
-$lang['ftp_no_connection'] = "Unable to locate a valid connection ID. Please make sure you are connected before peforming any file routines.";\r
-$lang['ftp_unable_to_connect'] = "Unable to connect to your FTP server using the supplied hostname.";\r
-$lang['ftp_unable_to_login'] = "Unable to login to your FTP server. Please check your username and password.";\r
-$lang['ftp_unable_to_makdir'] = "Unable to create the directory you have specified.";\r
-$lang['ftp_unable_to_changedir'] = "Unable to change directories.";\r
-$lang['ftp_unable_to_chmod'] = "Unable to set file permissions. Please check your path. Note: This feature is only available in PHP 5 or higher.";\r
-$lang['ftp_unable_to_upload'] = "Unable to upload the specified file. Please check your path.";\r
-$lang['ftp_no_source_file'] = "Unable to locate the source file. Please check your path.";\r
-$lang['ftp_unable_to_rename'] = "Unable to rename the file.";\r
-$lang['ftp_unable_to_delete'] = "Unable to delete the file.";\r
-$lang['ftp_unable_to_move'] = "Unable to move the file. Please make sure the destination directory exists.";\r
-\r
+<?php
+
+$lang['ftp_no_connection'] = "Unable to locate a valid connection ID. Please make sure you are connected before peforming any file routines.";
+$lang['ftp_unable_to_connect'] = "Unable to connect to your FTP server using the supplied hostname.";
+$lang['ftp_unable_to_login'] = "Unable to login to your FTP server. Please check your username and password.";
+$lang['ftp_unable_to_makdir'] = "Unable to create the directory you have specified.";
+$lang['ftp_unable_to_changedir'] = "Unable to change directories.";
+$lang['ftp_unable_to_chmod'] = "Unable to set file permissions. Please check your path. Note: This feature is only available in PHP 5 or higher.";
+$lang['ftp_unable_to_upload'] = "Unable to upload the specified file. Please check your path.";
+$lang['ftp_no_source_file'] = "Unable to locate the source file. Please check your path.";
+$lang['ftp_unable_to_rename'] = "Unable to rename the file.";
+$lang['ftp_unable_to_delete'] = "Unable to delete the file.";
+$lang['ftp_unable_to_move'] = "Unable to move the file. Please make sure the destination directory exists.";
+
/* End of file ftp_lang.php */
/* Location: ./system/language/english/ftp_lang.php */
\ No newline at end of file
-<?php\r
-\r
-$lang['imglib_source_image_required'] = "You must specify a source image in your preferences.";\r
-$lang['imglib_gd_required'] = "The GD image library is required for this feature.";\r
-$lang['imglib_gd_required_for_props'] = "Your server must support the GD image library in order to determine the image properties.";\r
-$lang['imglib_unsupported_imagecreate'] = "Your server does not support the GD function required to process this type of image.";\r
-$lang['imglib_gif_not_supported'] = "GIF images are often not supported due to licensing restrictions. You may have to use JPG or PNG images instead.";\r
-$lang['imglib_jpg_not_supported'] = "JPG images are not supported.";\r
-$lang['imglib_png_not_supported'] = "PNG images are not supported.";\r
-$lang['imglib_jpg_or_png_required'] = "The image resize protocol specified in your preferences only works with JPEG or PNG image types.";\r
-$lang['imglib_copy_error'] = "An error was encountered while attempting to replace the file. Please make sure your file directory is writable.";\r
-$lang['imglib_rotate_unsupported'] = "Image rotation does not appear to be supported by your server.";\r
-$lang['imglib_libpath_invalid'] = "The path to your image library is not correct. Please set the correct path in your image preferences.";\r
-$lang['imglib_image_process_failed'] = "Image processing failed. Please verify that your server supports the chosen protocol and that the path to your image library is correct.";\r
-$lang['imglib_rotation_angle_required'] = "An angle of rotation is required to rotate the image.";\r
-$lang['imglib_writing_failed_gif'] = "GIF image.";\r
-$lang['imglib_invalid_path'] = "The path to the image is not correct.";\r
-$lang['imglib_copy_failed'] = "The image copy routine failed.";\r
-$lang['imglib_missing_font'] = "Unable to find a font to use.";\r
-\r
+<?php
+
+$lang['imglib_source_image_required'] = "You must specify a source image in your preferences.";
+$lang['imglib_gd_required'] = "The GD image library is required for this feature.";
+$lang['imglib_gd_required_for_props'] = "Your server must support the GD image library in order to determine the image properties.";
+$lang['imglib_unsupported_imagecreate'] = "Your server does not support the GD function required to process this type of image.";
+$lang['imglib_gif_not_supported'] = "GIF images are often not supported due to licensing restrictions. You may have to use JPG or PNG images instead.";
+$lang['imglib_jpg_not_supported'] = "JPG images are not supported.";
+$lang['imglib_png_not_supported'] = "PNG images are not supported.";
+$lang['imglib_jpg_or_png_required'] = "The image resize protocol specified in your preferences only works with JPEG or PNG image types.";
+$lang['imglib_copy_error'] = "An error was encountered while attempting to replace the file. Please make sure your file directory is writable.";
+$lang['imglib_rotate_unsupported'] = "Image rotation does not appear to be supported by your server.";
+$lang['imglib_libpath_invalid'] = "The path to your image library is not correct. Please set the correct path in your image preferences.";
+$lang['imglib_image_process_failed'] = "Image processing failed. Please verify that your server supports the chosen protocol and that the path to your image library is correct.";
+$lang['imglib_rotation_angle_required'] = "An angle of rotation is required to rotate the image.";
+$lang['imglib_writing_failed_gif'] = "GIF image.";
+$lang['imglib_invalid_path'] = "The path to the image is not correct.";
+$lang['imglib_copy_failed'] = "The image copy routine failed.";
+$lang['imglib_missing_font'] = "Unable to find a font to use.";
+
/* End of file imglib_lang.php */
/* Location: ./system/language/english/imglib_lang.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php\r
-\r
-$lang['terabyte_abbr'] = "TB";\r
-$lang['gigabyte_abbr'] = "GB";\r
-$lang['megabyte_abbr'] = "MB";\r
-$lang['kilobyte_abbr'] = "KB";\r
-$lang['bytes'] = "Bytes";\r
-\r
-/* End of file number_lang.php */\r
+<?php
+
+$lang['terabyte_abbr'] = "TB";
+$lang['gigabyte_abbr'] = "GB";
+$lang['megabyte_abbr'] = "MB";
+$lang['kilobyte_abbr'] = "KB";
+$lang['bytes'] = "Bytes";
+
+/* End of file number_lang.php */
/* Location: ./system/language/english/number_lang.php */
\ No newline at end of file
-<?php\r
-\r
-$lang['ut_test_name'] = 'Test Name';\r
-$lang['ut_test_datatype'] = 'Test Datatype';\r
-$lang['ut_res_datatype'] = 'Expected Datatype';\r
-$lang['ut_result'] = 'Result';\r
-$lang['ut_undefined'] = 'Undefined Test Name';\r
-$lang['ut_file'] = 'File Name';\r
-$lang['ut_line'] = 'Line Number';\r
-$lang['ut_passed'] = 'Passed';\r
-$lang['ut_failed'] = 'Failed';\r
-$lang['ut_boolean'] = 'Boolean';\r
-$lang['ut_integer'] = 'Integer';\r
-$lang['ut_float'] = 'Float';\r
-$lang['ut_double'] = 'Float'; // can be the same as float\r
-$lang['ut_string'] = 'String';\r
-$lang['ut_array'] = 'Array';\r
-$lang['ut_object'] = 'Object';\r
-$lang['ut_resource'] = 'Resource';\r
-$lang['ut_null'] = 'Null';\r
-\r
-\r
-/* End of file unit_test_lang.php */\r
+<?php
+
+$lang['ut_test_name'] = 'Test Name';
+$lang['ut_test_datatype'] = 'Test Datatype';
+$lang['ut_res_datatype'] = 'Expected Datatype';
+$lang['ut_result'] = 'Result';
+$lang['ut_undefined'] = 'Undefined Test Name';
+$lang['ut_file'] = 'File Name';
+$lang['ut_line'] = 'Line Number';
+$lang['ut_passed'] = 'Passed';
+$lang['ut_failed'] = 'Failed';
+$lang['ut_boolean'] = 'Boolean';
+$lang['ut_integer'] = 'Integer';
+$lang['ut_float'] = 'Float';
+$lang['ut_double'] = 'Float'; // can be the same as float
+$lang['ut_string'] = 'String';
+$lang['ut_array'] = 'Array';
+$lang['ut_object'] = 'Object';
+$lang['ut_resource'] = 'Resource';
+$lang['ut_null'] = 'Null';
+
+
+/* End of file unit_test_lang.php */
/* Location: ./system/language/english/unit_test_lang.php */
\ No newline at end of file
-<?php\r
-\r
-$lang['upload_userfile_not_set'] = "Unable to find a post variable called userfile.";\r
-$lang['upload_file_exceeds_limit'] = "The uploaded file exceeds the maximum allowed size in your PHP configuration file.";\r
-$lang['upload_file_exceeds_form_limit'] = "The uploaded file exceeds the maximum size allowed by the submission form.";\r
-$lang['upload_file_partial'] = "The file was only partially uploaded.";\r
-$lang['upload_no_temp_directory'] = "The temporary folder is missing.";\r
-$lang['upload_unable_to_write_file'] = "The file could not be written to disk.";\r
-$lang['upload_stopped_by_extension'] = "The file upload was stopped by extension.";\r
-$lang['upload_no_file_selected'] = "You did not select a file to upload.";\r
-$lang['upload_invalid_filetype'] = "The filetype you are attempting to upload is not allowed.";\r
-$lang['upload_invalid_filesize'] = "The file you are attempting to upload is larger than the permitted size.";\r
-$lang['upload_invalid_dimensions'] = "The image you are attempting to upload exceedes the maximum height or width.";\r
-$lang['upload_destination_error'] = "A problem was encountered while attempting to move the uploaded file to the final destination.";\r
-$lang['upload_no_filepath'] = "The upload path does not appear to be valid.";\r
-$lang['upload_no_file_types'] = "You have not specified any allowed file types.";\r
-$lang['upload_bad_filename'] = "The file name you submitted already exists on the server.";\r
-$lang['upload_not_writable'] = "The upload destination folder does not appear to be writable.";\r
-\r
+<?php
+
+$lang['upload_userfile_not_set'] = "Unable to find a post variable called userfile.";
+$lang['upload_file_exceeds_limit'] = "The uploaded file exceeds the maximum allowed size in your PHP configuration file.";
+$lang['upload_file_exceeds_form_limit'] = "The uploaded file exceeds the maximum size allowed by the submission form.";
+$lang['upload_file_partial'] = "The file was only partially uploaded.";
+$lang['upload_no_temp_directory'] = "The temporary folder is missing.";
+$lang['upload_unable_to_write_file'] = "The file could not be written to disk.";
+$lang['upload_stopped_by_extension'] = "The file upload was stopped by extension.";
+$lang['upload_no_file_selected'] = "You did not select a file to upload.";
+$lang['upload_invalid_filetype'] = "The filetype you are attempting to upload is not allowed.";
+$lang['upload_invalid_filesize'] = "The file you are attempting to upload is larger than the permitted size.";
+$lang['upload_invalid_dimensions'] = "The image you are attempting to upload exceedes the maximum height or width.";
+$lang['upload_destination_error'] = "A problem was encountered while attempting to move the uploaded file to the final destination.";
+$lang['upload_no_filepath'] = "The upload path does not appear to be valid.";
+$lang['upload_no_file_types'] = "You have not specified any allowed file types.";
+$lang['upload_bad_filename'] = "The file name you submitted already exists on the server.";
+$lang['upload_not_writable'] = "The upload destination folder does not appear to be writable.";
+
/* End of file upload_lang.php */
/* Location: ./system/language/english/upload_lang.php */
\ No newline at end of file
-<?php\r
-\r
-$lang['required'] = "The %s field is required.";\r
-$lang['isset'] = "The %s field must have a value.";\r
-$lang['valid_email'] = "The %s field must contain a valid email address.";\r
-$lang['valid_emails'] = "The %s field must contain all valid email addresses.";\r
-$lang['valid_url'] = "The %s field must contain a valid URL.";\r
-$lang['valid_ip'] = "The %s field must contain a valid IP.";\r
-$lang['min_length'] = "The %s field must be at least %s characters in length.";\r
-$lang['max_length'] = "The %s field can not exceed %s characters in length.";\r
-$lang['exact_length'] = "The %s field must be exactly %s characters in length.";\r
-$lang['alpha'] = "The %s field may only contain alphabetical characters.";\r
-$lang['alpha_numeric'] = "The %s field may only contain alpha-numeric characters.";\r
-$lang['alpha_dash'] = "The %s field may only contain alpha-numeric characters, underscores, and dashes.";\r
-$lang['numeric'] = "The %s field must contain a number.";\r
-$lang['is_numeric'] = "The %s field must contain a number.";\r
-$lang['integer'] = "The %s field must contain an integer.";\r
-$lang['matches'] = "The %s field does not match the %s field.";\r
-$lang['is_natural'] = "The %s field must contain a number.";\r
-$lang['is_natural_no_zero'] = "The %s field must contain a number greater than zero.";\r
-\r
-\r
-/* End of file validation_lang.php */\r
+<?php
+
+$lang['required'] = "The %s field is required.";
+$lang['isset'] = "The %s field must have a value.";
+$lang['valid_email'] = "The %s field must contain a valid email address.";
+$lang['valid_emails'] = "The %s field must contain all valid email addresses.";
+$lang['valid_url'] = "The %s field must contain a valid URL.";
+$lang['valid_ip'] = "The %s field must contain a valid IP.";
+$lang['min_length'] = "The %s field must be at least %s characters in length.";
+$lang['max_length'] = "The %s field can not exceed %s characters in length.";
+$lang['exact_length'] = "The %s field must be exactly %s characters in length.";
+$lang['alpha'] = "The %s field may only contain alphabetical characters.";
+$lang['alpha_numeric'] = "The %s field may only contain alpha-numeric characters.";
+$lang['alpha_dash'] = "The %s field may only contain alpha-numeric characters, underscores, and dashes.";
+$lang['numeric'] = "The %s field must contain a number.";
+$lang['is_numeric'] = "The %s field must contain a number.";
+$lang['integer'] = "The %s field must contain an integer.";
+$lang['matches'] = "The %s field does not match the %s field.";
+$lang['is_natural'] = "The %s field must contain a number.";
+$lang['is_natural_no_zero'] = "The %s field must contain a number greater than zero.";
+
+
+/* End of file validation_lang.php */
/* Location: ./system/language/english/validation_lang.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Benchmark Class\r
- *\r
- * This class enables you to mark points and calculate the time difference\r
- * between them. Memory consumption can also be displayed.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/benchmark.html\r
- */\r
-class CI_Benchmark {\r
-\r
- var $marker = array();\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set a benchmark marker\r
- *\r
- * Multiple calls to this function can be made so that several\r
- * execution points can be timed\r
- *\r
- * @access public\r
- * @param string $name name of the marker\r
- * @return void\r
- */\r
- function mark($name)\r
- {\r
- $this->marker[$name] = microtime();\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Calculates the time difference between two marked points.\r
- *\r
- * If the first parameter is empty this function instead returns the\r
- * {elapsed_time} pseudo-variable. This permits the full system\r
- * execution time to be shown in a template. The output class will\r
- * swap the real value for this variable.\r
- *\r
- * @access public\r
- * @param string a particular marked point\r
- * @param string a particular marked point\r
- * @param integer the number of decimal places\r
- * @return mixed\r
- */\r
- function elapsed_time($point1 = '', $point2 = '', $decimals = 4)\r
- {\r
- if ($point1 == '')\r
- {\r
- return '{elapsed_time}';\r
- }\r
-\r
- if ( ! isset($this->marker[$point1]))\r
- {\r
- return '';\r
- }\r
-\r
- if ( ! isset($this->marker[$point2]))\r
- {\r
- $this->marker[$point2] = microtime();\r
- }\r
- \r
- list($sm, $ss) = explode(' ', $this->marker[$point1]);\r
- list($em, $es) = explode(' ', $this->marker[$point2]);\r
-\r
- return number_format(($em + $es) - ($sm + $ss), $decimals);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Memory Usage\r
- *\r
- * This function returns the {memory_usage} pseudo-variable.\r
- * This permits it to be put it anywhere in a template\r
- * without the memory being calculated until the end.\r
- * The output class will swap the real value for this variable.\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function memory_usage()\r
- {\r
- return '{memory_usage}';\r
- }\r
-\r
-}\r
-\r
-// END CI_Benchmark class\r
-\r
-/* End of file Benchmark.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Benchmark Class
+ *
+ * This class enables you to mark points and calculate the time difference
+ * between them. Memory consumption can also be displayed.
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/benchmark.html
+ */
+class CI_Benchmark {
+
+ var $marker = array();
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set a benchmark marker
+ *
+ * Multiple calls to this function can be made so that several
+ * execution points can be timed
+ *
+ * @access public
+ * @param string $name name of the marker
+ * @return void
+ */
+ function mark($name)
+ {
+ $this->marker[$name] = microtime();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Calculates the time difference between two marked points.
+ *
+ * If the first parameter is empty this function instead returns the
+ * {elapsed_time} pseudo-variable. This permits the full system
+ * execution time to be shown in a template. The output class will
+ * swap the real value for this variable.
+ *
+ * @access public
+ * @param string a particular marked point
+ * @param string a particular marked point
+ * @param integer the number of decimal places
+ * @return mixed
+ */
+ function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
+ {
+ if ($point1 == '')
+ {
+ return '{elapsed_time}';
+ }
+
+ if ( ! isset($this->marker[$point1]))
+ {
+ return '';
+ }
+
+ if ( ! isset($this->marker[$point2]))
+ {
+ $this->marker[$point2] = microtime();
+ }
+
+ list($sm, $ss) = explode(' ', $this->marker[$point1]);
+ list($em, $es) = explode(' ', $this->marker[$point2]);
+
+ return number_format(($em + $es) - ($sm + $ss), $decimals);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Memory Usage
+ *
+ * This function returns the {memory_usage} pseudo-variable.
+ * This permits it to be put it anywhere in a template
+ * without the memory being calculated until the end.
+ * The output class will swap the real value for this variable.
+ *
+ * @access public
+ * @return string
+ */
+ function memory_usage()
+ {
+ return '{memory_usage}';
+ }
+
+}
+
+// END CI_Benchmark class
+
+/* End of file Benchmark.php */
/* Location: ./system/libraries/Benchmark.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Calendar Class\r
- *\r
- * This class enables the creation of calendars\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/calendar.html\r
- */\r
-class CI_Calendar {\r
-\r
- var $CI;\r
- var $lang;\r
- var $local_time;\r
- var $template = '';\r
- var $start_day = 'sunday';\r
- var $month_type = 'long';\r
- var $day_type = 'abr';\r
- var $show_next_prev = FALSE;\r
- var $next_prev_url = '';\r
-\r
- /**\r
- * Constructor\r
- *\r
- * Loads the calendar language file and sets the default time reference\r
- *\r
- * @access public\r
- */\r
- function CI_Calendar($config = array())\r
- { \r
- $this->CI =& get_instance();\r
- \r
- if ( ! in_array('calendar_lang'.EXT, $this->CI->lang->is_loaded, TRUE))\r
- {\r
- $this->CI->lang->load('calendar');\r
- }\r
-\r
- $this->local_time = time();\r
- \r
- if (count($config) > 0)\r
- {\r
- $this->initialize($config);\r
- }\r
- \r
- log_message('debug', "Calendar Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Initialize the user preferences\r
- *\r
- * Accepts an associative array as input, containing display preferences\r
- *\r
- * @access public\r
- * @param array config preferences\r
- * @return void\r
- */ \r
- function initialize($config = array())\r
- {\r
- foreach ($config as $key => $val)\r
- {\r
- if (isset($this->$key))\r
- {\r
- $this->$key = $val;\r
- }\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Generate the calendar\r
- *\r
- * @access public\r
- * @param integer the year\r
- * @param integer the month\r
- * @param array the data to be shown in the calendar cells\r
- * @return string\r
- */\r
- function generate($year = '', $month = '', $data = array())\r
- {\r
- // Set and validate the supplied month/year\r
- if ($year == '')\r
- $year = date("Y", $this->local_time);\r
- \r
- if ($month == '')\r
- $month = date("m", $this->local_time);\r
- \r
- if (strlen($year) == 1)\r
- $year = '200'.$year;\r
- \r
- if (strlen($year) == 2)\r
- $year = '20'.$year;\r
-\r
- if (strlen($month) == 1)\r
- $month = '0'.$month;\r
- \r
- $adjusted_date = $this->adjust_date($month, $year);\r
- \r
- $month = $adjusted_date['month'];\r
- $year = $adjusted_date['year'];\r
- \r
- // Determine the total days in the month\r
- $total_days = $this->get_total_days($month, $year);\r
- \r
- // Set the starting day of the week\r
- $start_days = array('sunday' => 0, 'monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6);\r
- $start_day = ( ! isset($start_days[$this->start_day])) ? 0 : $start_days[$this->start_day];\r
- \r
- // Set the starting day number\r
- $local_date = mktime(12, 0, 0, $month, 1, $year);\r
- $date = getdate($local_date);\r
- $day = $start_day + 1 - $date["wday"];\r
- \r
- while ($day > 1)\r
- {\r
- $day -= 7;\r
- }\r
- \r
- // Set the current month/year/day\r
- // We use this to determine the "today" date\r
- $cur_year = date("Y", $this->local_time);\r
- $cur_month = date("m", $this->local_time);\r
- $cur_day = date("j", $this->local_time);\r
- \r
- $is_current_month = ($cur_year == $year AND $cur_month == $month) ? TRUE : FALSE;\r
- \r
- // Generate the template data array\r
- $this->parse_template();\r
- \r
- // Begin building the calendar output \r
- $out = $this->temp['table_open'];\r
- $out .= "\n"; \r
-\r
- $out .= "\n"; \r
- $out .= $this->temp['heading_row_start'];\r
- $out .= "\n";\r
- \r
- // "previous" month link\r
- if ($this->show_next_prev == TRUE)\r
- {\r
- // Add a trailing slash to the URL if needed\r
- $this->next_prev_url = preg_replace("/(.+?)\/*$/", "\\1/", $this->next_prev_url);\r
- \r
- $adjusted_date = $this->adjust_date($month - 1, $year);\r
- $out .= str_replace('{previous_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->temp['heading_previous_cell']);\r
- $out .= "\n";\r
- }\r
-\r
- // Heading containing the month/year\r
- $colspan = ($this->show_next_prev == TRUE) ? 5 : 7;\r
- \r
- $this->temp['heading_title_cell'] = str_replace('{colspan}', $colspan, $this->temp['heading_title_cell']);\r
- $this->temp['heading_title_cell'] = str_replace('{heading}', $this->get_month_name($month)." ".$year, $this->temp['heading_title_cell']);\r
- \r
- $out .= $this->temp['heading_title_cell'];\r
- $out .= "\n";\r
-\r
- // "next" month link\r
- if ($this->show_next_prev == TRUE)\r
- { \r
- $adjusted_date = $this->adjust_date($month + 1, $year);\r
- $out .= str_replace('{next_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->temp['heading_next_cell']);\r
- }\r
-\r
- $out .= "\n"; \r
- $out .= $this->temp['heading_row_end'];\r
- $out .= "\n";\r
-\r
- // Write the cells containing the days of the week\r
- $out .= "\n"; \r
- $out .= $this->temp['week_row_start'];\r
- $out .= "\n";\r
-\r
- $day_names = $this->get_day_names();\r
-\r
- for ($i = 0; $i < 7; $i ++)\r
- {\r
- $out .= str_replace('{week_day}', $day_names[($start_day + $i) %7], $this->temp['week_day_cell']);\r
- }\r
-\r
- $out .= "\n";\r
- $out .= $this->temp['week_row_end'];\r
- $out .= "\n";\r
-\r
- // Build the main body of the calendar\r
- while ($day <= $total_days)\r
- {\r
- $out .= "\n";\r
- $out .= $this->temp['cal_row_start'];\r
- $out .= "\n";\r
-\r
- for ($i = 0; $i < 7; $i++)\r
- {\r
- $out .= ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_start_today'] : $this->temp['cal_cell_start'];\r
- \r
- if ($day > 0 AND $day <= $total_days)\r
- { \r
- if (isset($data[$day]))\r
- { \r
- // Cells with content\r
- $temp = ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_content_today'] : $this->temp['cal_cell_content'];\r
- $out .= str_replace('{day}', $day, str_replace('{content}', $data[$day], $temp));\r
- }\r
- else\r
- {\r
- // Cells with no content\r
- $temp = ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_no_content_today'] : $this->temp['cal_cell_no_content'];\r
- $out .= str_replace('{day}', $day, $temp);\r
- }\r
- }\r
- else\r
- {\r
- // Blank cells\r
- $out .= $this->temp['cal_cell_blank'];\r
- }\r
- \r
- $out .= ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_end_today'] : $this->temp['cal_cell_end']; \r
- $day++;\r
- }\r
- \r
- $out .= "\n"; \r
- $out .= $this->temp['cal_row_end'];\r
- $out .= "\n"; \r
- }\r
-\r
- $out .= "\n"; \r
- $out .= $this->temp['table_close'];\r
-\r
- return $out;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get Month Name\r
- *\r
- * Generates a textual month name based on the numeric\r
- * month provided.\r
- *\r
- * @access public\r
- * @param integer the month\r
- * @return string\r
- */\r
- function get_month_name($month)\r
- {\r
- if ($this->month_type == 'short')\r
- {\r
- $month_names = array('01' => 'cal_jan', '02' => 'cal_feb', '03' => 'cal_mar', '04' => 'cal_apr', '05' => 'cal_may', '06' => 'cal_jun', '07' => 'cal_jul', '08' => 'cal_aug', '09' => 'cal_sep', '10' => 'cal_oct', '11' => 'cal_nov', '12' => 'cal_dec');\r
- }\r
- else\r
- {\r
- $month_names = array('01' => 'cal_january', '02' => 'cal_february', '03' => 'cal_march', '04' => 'cal_april', '05' => 'cal_may', '06' => 'cal_june', '07' => 'cal_july', '08' => 'cal_august', '09' => 'cal_september', '10' => 'cal_october', '11' => 'cal_november', '12' => 'cal_december');\r
- }\r
- \r
- $month = $month_names[$month];\r
- \r
- if ($this->CI->lang->line($month) === FALSE)\r
- {\r
- return ucfirst(str_replace('cal_', '', $month));\r
- }\r
-\r
- return $this->CI->lang->line($month);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get Day Names\r
- *\r
- * Returns an array of day names (Sunday, Monday, etc.) based\r
- * on the type. Options: long, short, abrev\r
- *\r
- * @access public\r
- * @param string\r
- * @return array\r
- */\r
- function get_day_names($day_type = '')\r
- {\r
- if ($day_type != '')\r
- $this->day_type = $day_type;\r
- \r
- if ($this->day_type == 'long')\r
- {\r
- $day_names = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday');\r
- }\r
- elseif ($this->day_type == 'short')\r
- {\r
- $day_names = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');\r
- }\r
- else\r
- {\r
- $day_names = array('su', 'mo', 'tu', 'we', 'th', 'fr', 'sa');\r
- }\r
- \r
- $days = array();\r
- foreach ($day_names as $val)\r
- { \r
- $days[] = ($this->CI->lang->line('cal_'.$val) === FALSE) ? ucfirst($val) : $this->CI->lang->line('cal_'.$val);\r
- }\r
- \r
- return $days;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Adjust Date\r
- *\r
- * This function makes sure that we have a valid month/year.\r
- * For example, if you submit 13 as the month, the year will\r
- * increment and the month will become January.\r
- *\r
- * @access public\r
- * @param integer the month\r
- * @param integer the year\r
- * @return array\r
- */\r
- function adjust_date($month, $year)\r
- {\r
- $date = array();\r
-\r
- $date['month'] = $month;\r
- $date['year'] = $year;\r
-\r
- while ($date['month'] > 12)\r
- {\r
- $date['month'] -= 12;\r
- $date['year']++;\r
- }\r
-\r
- while ($date['month'] <= 0)\r
- {\r
- $date['month'] += 12;\r
- $date['year']--;\r
- }\r
-\r
- if (strlen($date['month']) == 1)\r
- {\r
- $date['month'] = '0'.$date['month'];\r
- }\r
-\r
- return $date;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Total days in a given month\r
- *\r
- * @access public\r
- * @param integer the month\r
- * @param integer the year\r
- * @return integer\r
- */\r
- function get_total_days($month, $year)\r
- {\r
- $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);\r
-\r
- if ($month < 1 OR $month > 12)\r
- {\r
- return 0;\r
- }\r
-\r
- // Is the year a leap year?\r
- if ($month == 2)\r
- {\r
- if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0))\r
- {\r
- return 29;\r
- }\r
- }\r
-\r
- return $days_in_month[$month - 1];\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Default Template Data\r
- *\r
- * This is used in the event that the user has not created their own template\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function default_template()\r
- {\r
- return array (\r
- 'table_open' => '<table border="0" cellpadding="4" cellspacing="0">',\r
- 'heading_row_start' => '<tr>',\r
- 'heading_previous_cell' => '<th><a href="{previous_url}"><<</a></th>',\r
- 'heading_title_cell' => '<th colspan="{colspan}">{heading}</th>',\r
- 'heading_next_cell' => '<th><a href="{next_url}">>></a></th>',\r
- 'heading_row_end' => '</tr>',\r
- 'week_row_start' => '<tr>',\r
- 'week_day_cell' => '<td>{week_day}</td>',\r
- 'week_row_end' => '</tr>',\r
- 'cal_row_start' => '<tr>',\r
- 'cal_cell_start' => '<td>',\r
- 'cal_cell_start_today' => '<td>',\r
- 'cal_cell_content' => '<a href="{content}">{day}</a>',\r
- 'cal_cell_content_today' => '<a href="{content}"><strong>{day}</strong></a>',\r
- 'cal_cell_no_content' => '{day}',\r
- 'cal_cell_no_content_today' => '<strong>{day}</strong>',\r
- 'cal_cell_blank' => ' ',\r
- 'cal_cell_end' => '</td>',\r
- 'cal_cell_end_today' => '</td>',\r
- 'cal_row_end' => '</tr>',\r
- 'table_close' => '</table>'\r
- ); \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Parse Template\r
- *\r
- * Harvests the data within the template {pseudo-variables}\r
- * used to display the calendar\r
- *\r
- * @access public\r
- * @return void\r
- */\r
- function parse_template()\r
- {\r
- $this->temp = $this->default_template();\r
- \r
- if ($this->template == '')\r
- {\r
- return;\r
- }\r
- \r
- $today = array('cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today');\r
- \r
- foreach (array('table_open', 'table_close', 'heading_row_start', 'heading_previous_cell', 'heading_title_cell', 'heading_next_cell', 'heading_row_end', 'week_row_start', 'week_day_cell', 'week_row_end', 'cal_row_start', 'cal_cell_start', 'cal_cell_content', 'cal_cell_no_content', 'cal_cell_blank', 'cal_cell_end', 'cal_row_end', 'cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today') as $val)\r
- {\r
- if (preg_match("/\{".$val."\}(.*?)\{\/".$val."\}/si", $this->template, $match))\r
- {\r
- $this->temp[$val] = $match['1'];\r
- }\r
- else\r
- {\r
- if (in_array($val, $today, TRUE))\r
- {\r
- $this->temp[$val] = $this->temp[str_replace('_today', '', $val)];\r
- }\r
- }\r
- } \r
- }\r
-\r
-}\r
-\r
-// END CI_Calendar class\r
-\r
-/* End of file Calendar.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Calendar Class
+ *
+ * This class enables the creation of calendars
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/calendar.html
+ */
+class CI_Calendar {
+
+ var $CI;
+ var $lang;
+ var $local_time;
+ var $template = '';
+ var $start_day = 'sunday';
+ var $month_type = 'long';
+ var $day_type = 'abr';
+ var $show_next_prev = FALSE;
+ var $next_prev_url = '';
+
+ /**
+ * Constructor
+ *
+ * Loads the calendar language file and sets the default time reference
+ *
+ * @access public
+ */
+ function CI_Calendar($config = array())
+ {
+ $this->CI =& get_instance();
+
+ if ( ! in_array('calendar_lang'.EXT, $this->CI->lang->is_loaded, TRUE))
+ {
+ $this->CI->lang->load('calendar');
+ }
+
+ $this->local_time = time();
+
+ if (count($config) > 0)
+ {
+ $this->initialize($config);
+ }
+
+ log_message('debug', "Calendar Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize the user preferences
+ *
+ * Accepts an associative array as input, containing display preferences
+ *
+ * @access public
+ * @param array config preferences
+ * @return void
+ */
+ function initialize($config = array())
+ {
+ foreach ($config as $key => $val)
+ {
+ if (isset($this->$key))
+ {
+ $this->$key = $val;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate the calendar
+ *
+ * @access public
+ * @param integer the year
+ * @param integer the month
+ * @param array the data to be shown in the calendar cells
+ * @return string
+ */
+ function generate($year = '', $month = '', $data = array())
+ {
+ // Set and validate the supplied month/year
+ if ($year == '')
+ $year = date("Y", $this->local_time);
+
+ if ($month == '')
+ $month = date("m", $this->local_time);
+
+ if (strlen($year) == 1)
+ $year = '200'.$year;
+
+ if (strlen($year) == 2)
+ $year = '20'.$year;
+
+ if (strlen($month) == 1)
+ $month = '0'.$month;
+
+ $adjusted_date = $this->adjust_date($month, $year);
+
+ $month = $adjusted_date['month'];
+ $year = $adjusted_date['year'];
+
+ // Determine the total days in the month
+ $total_days = $this->get_total_days($month, $year);
+
+ // Set the starting day of the week
+ $start_days = array('sunday' => 0, 'monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6);
+ $start_day = ( ! isset($start_days[$this->start_day])) ? 0 : $start_days[$this->start_day];
+
+ // Set the starting day number
+ $local_date = mktime(12, 0, 0, $month, 1, $year);
+ $date = getdate($local_date);
+ $day = $start_day + 1 - $date["wday"];
+
+ while ($day > 1)
+ {
+ $day -= 7;
+ }
+
+ // Set the current month/year/day
+ // We use this to determine the "today" date
+ $cur_year = date("Y", $this->local_time);
+ $cur_month = date("m", $this->local_time);
+ $cur_day = date("j", $this->local_time);
+
+ $is_current_month = ($cur_year == $year AND $cur_month == $month) ? TRUE : FALSE;
+
+ // Generate the template data array
+ $this->parse_template();
+
+ // Begin building the calendar output
+ $out = $this->temp['table_open'];
+ $out .= "\n";
+
+ $out .= "\n";
+ $out .= $this->temp['heading_row_start'];
+ $out .= "\n";
+
+ // "previous" month link
+ if ($this->show_next_prev == TRUE)
+ {
+ // Add a trailing slash to the URL if needed
+ $this->next_prev_url = preg_replace("/(.+?)\/*$/", "\\1/", $this->next_prev_url);
+
+ $adjusted_date = $this->adjust_date($month - 1, $year);
+ $out .= str_replace('{previous_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->temp['heading_previous_cell']);
+ $out .= "\n";
+ }
+
+ // Heading containing the month/year
+ $colspan = ($this->show_next_prev == TRUE) ? 5 : 7;
+
+ $this->temp['heading_title_cell'] = str_replace('{colspan}', $colspan, $this->temp['heading_title_cell']);
+ $this->temp['heading_title_cell'] = str_replace('{heading}', $this->get_month_name($month)." ".$year, $this->temp['heading_title_cell']);
+
+ $out .= $this->temp['heading_title_cell'];
+ $out .= "\n";
+
+ // "next" month link
+ if ($this->show_next_prev == TRUE)
+ {
+ $adjusted_date = $this->adjust_date($month + 1, $year);
+ $out .= str_replace('{next_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->temp['heading_next_cell']);
+ }
+
+ $out .= "\n";
+ $out .= $this->temp['heading_row_end'];
+ $out .= "\n";
+
+ // Write the cells containing the days of the week
+ $out .= "\n";
+ $out .= $this->temp['week_row_start'];
+ $out .= "\n";
+
+ $day_names = $this->get_day_names();
+
+ for ($i = 0; $i < 7; $i ++)
+ {
+ $out .= str_replace('{week_day}', $day_names[($start_day + $i) %7], $this->temp['week_day_cell']);
+ }
+
+ $out .= "\n";
+ $out .= $this->temp['week_row_end'];
+ $out .= "\n";
+
+ // Build the main body of the calendar
+ while ($day <= $total_days)
+ {
+ $out .= "\n";
+ $out .= $this->temp['cal_row_start'];
+ $out .= "\n";
+
+ for ($i = 0; $i < 7; $i++)
+ {
+ $out .= ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_start_today'] : $this->temp['cal_cell_start'];
+
+ if ($day > 0 AND $day <= $total_days)
+ {
+ if (isset($data[$day]))
+ {
+ // Cells with content
+ $temp = ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_content_today'] : $this->temp['cal_cell_content'];
+ $out .= str_replace('{day}', $day, str_replace('{content}', $data[$day], $temp));
+ }
+ else
+ {
+ // Cells with no content
+ $temp = ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_no_content_today'] : $this->temp['cal_cell_no_content'];
+ $out .= str_replace('{day}', $day, $temp);
+ }
+ }
+ else
+ {
+ // Blank cells
+ $out .= $this->temp['cal_cell_blank'];
+ }
+
+ $out .= ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_end_today'] : $this->temp['cal_cell_end'];
+ $day++;
+ }
+
+ $out .= "\n";
+ $out .= $this->temp['cal_row_end'];
+ $out .= "\n";
+ }
+
+ $out .= "\n";
+ $out .= $this->temp['table_close'];
+
+ return $out;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Month Name
+ *
+ * Generates a textual month name based on the numeric
+ * month provided.
+ *
+ * @access public
+ * @param integer the month
+ * @return string
+ */
+ function get_month_name($month)
+ {
+ if ($this->month_type == 'short')
+ {
+ $month_names = array('01' => 'cal_jan', '02' => 'cal_feb', '03' => 'cal_mar', '04' => 'cal_apr', '05' => 'cal_may', '06' => 'cal_jun', '07' => 'cal_jul', '08' => 'cal_aug', '09' => 'cal_sep', '10' => 'cal_oct', '11' => 'cal_nov', '12' => 'cal_dec');
+ }
+ else
+ {
+ $month_names = array('01' => 'cal_january', '02' => 'cal_february', '03' => 'cal_march', '04' => 'cal_april', '05' => 'cal_may', '06' => 'cal_june', '07' => 'cal_july', '08' => 'cal_august', '09' => 'cal_september', '10' => 'cal_october', '11' => 'cal_november', '12' => 'cal_december');
+ }
+
+ $month = $month_names[$month];
+
+ if ($this->CI->lang->line($month) === FALSE)
+ {
+ return ucfirst(str_replace('cal_', '', $month));
+ }
+
+ return $this->CI->lang->line($month);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Day Names
+ *
+ * Returns an array of day names (Sunday, Monday, etc.) based
+ * on the type. Options: long, short, abrev
+ *
+ * @access public
+ * @param string
+ * @return array
+ */
+ function get_day_names($day_type = '')
+ {
+ if ($day_type != '')
+ $this->day_type = $day_type;
+
+ if ($this->day_type == 'long')
+ {
+ $day_names = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday');
+ }
+ elseif ($this->day_type == 'short')
+ {
+ $day_names = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat');
+ }
+ else
+ {
+ $day_names = array('su', 'mo', 'tu', 'we', 'th', 'fr', 'sa');
+ }
+
+ $days = array();
+ foreach ($day_names as $val)
+ {
+ $days[] = ($this->CI->lang->line('cal_'.$val) === FALSE) ? ucfirst($val) : $this->CI->lang->line('cal_'.$val);
+ }
+
+ return $days;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Adjust Date
+ *
+ * This function makes sure that we have a valid month/year.
+ * For example, if you submit 13 as the month, the year will
+ * increment and the month will become January.
+ *
+ * @access public
+ * @param integer the month
+ * @param integer the year
+ * @return array
+ */
+ function adjust_date($month, $year)
+ {
+ $date = array();
+
+ $date['month'] = $month;
+ $date['year'] = $year;
+
+ while ($date['month'] > 12)
+ {
+ $date['month'] -= 12;
+ $date['year']++;
+ }
+
+ while ($date['month'] <= 0)
+ {
+ $date['month'] += 12;
+ $date['year']--;
+ }
+
+ if (strlen($date['month']) == 1)
+ {
+ $date['month'] = '0'.$date['month'];
+ }
+
+ return $date;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Total days in a given month
+ *
+ * @access public
+ * @param integer the month
+ * @param integer the year
+ * @return integer
+ */
+ function get_total_days($month, $year)
+ {
+ $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
+
+ if ($month < 1 OR $month > 12)
+ {
+ return 0;
+ }
+
+ // Is the year a leap year?
+ if ($month == 2)
+ {
+ if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0))
+ {
+ return 29;
+ }
+ }
+
+ return $days_in_month[$month - 1];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Default Template Data
+ *
+ * This is used in the event that the user has not created their own template
+ *
+ * @access public
+ * @return array
+ */
+ function default_template()
+ {
+ return array (
+ 'table_open' => '<table border="0" cellpadding="4" cellspacing="0">',
+ 'heading_row_start' => '<tr>',
+ 'heading_previous_cell' => '<th><a href="{previous_url}"><<</a></th>',
+ 'heading_title_cell' => '<th colspan="{colspan}">{heading}</th>',
+ 'heading_next_cell' => '<th><a href="{next_url}">>></a></th>',
+ 'heading_row_end' => '</tr>',
+ 'week_row_start' => '<tr>',
+ 'week_day_cell' => '<td>{week_day}</td>',
+ 'week_row_end' => '</tr>',
+ 'cal_row_start' => '<tr>',
+ 'cal_cell_start' => '<td>',
+ 'cal_cell_start_today' => '<td>',
+ 'cal_cell_content' => '<a href="{content}">{day}</a>',
+ 'cal_cell_content_today' => '<a href="{content}"><strong>{day}</strong></a>',
+ 'cal_cell_no_content' => '{day}',
+ 'cal_cell_no_content_today' => '<strong>{day}</strong>',
+ 'cal_cell_blank' => ' ',
+ 'cal_cell_end' => '</td>',
+ 'cal_cell_end_today' => '</td>',
+ 'cal_row_end' => '</tr>',
+ 'table_close' => '</table>'
+ );
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Parse Template
+ *
+ * Harvests the data within the template {pseudo-variables}
+ * used to display the calendar
+ *
+ * @access public
+ * @return void
+ */
+ function parse_template()
+ {
+ $this->temp = $this->default_template();
+
+ if ($this->template == '')
+ {
+ return;
+ }
+
+ $today = array('cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today');
+
+ foreach (array('table_open', 'table_close', 'heading_row_start', 'heading_previous_cell', 'heading_title_cell', 'heading_next_cell', 'heading_row_end', 'week_row_start', 'week_day_cell', 'week_row_end', 'cal_row_start', 'cal_cell_start', 'cal_cell_content', 'cal_cell_no_content', 'cal_cell_blank', 'cal_cell_end', 'cal_row_end', 'cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today') as $val)
+ {
+ if (preg_match("/\{".$val."\}(.*?)\{\/".$val."\}/si", $this->template, $match))
+ {
+ $this->temp[$val] = $match['1'];
+ }
+ else
+ {
+ if (in_array($val, $today, TRUE))
+ {
+ $this->temp[$val] = $this->temp[str_replace('_today', '', $val)];
+ }
+ }
+ }
+ }
+
+}
+
+// END CI_Calendar class
+
+/* End of file Calendar.php */
/* Location: ./system/libraries/Calendar.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Config Class\r
- *\r
- * This class contains functions that enable config files to be managed\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/config.html\r
- */\r
-class CI_Config {\r
-\r
- var $config = array();\r
- var $is_loaded = array();\r
-\r
- /**\r
- * Constructor\r
- *\r
- * Sets the $config data from the primary config.php file as a class variable\r
- *\r
- * @access public\r
- * @param string the config file name\r
- * @param boolean if configuration values should be loaded into their own section\r
- * @param boolean true if errors should just return false, false if an error message should be displayed\r
- * @return boolean if the file was successfully loaded or not\r
- */\r
- function CI_Config()\r
- {\r
- $this->config =& get_config();\r
- log_message('debug', "Config Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Load Config File\r
- *\r
- * @access public\r
- * @param string the config file name\r
- * @return boolean if the file was loaded correctly\r
- */ \r
- function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)\r
- {\r
- $file = ($file == '') ? 'config' : str_replace(EXT, '', $file);\r
- \r
- if (in_array($file, $this->is_loaded, TRUE))\r
- {\r
- return TRUE;\r
- }\r
-\r
- if ( ! file_exists(APPPATH.'config/'.$file.EXT))\r
- {\r
- if ($fail_gracefully === TRUE)\r
- {\r
- return FALSE;\r
- }\r
- show_error('The configuration file '.$file.EXT.' does not exist.');\r
- }\r
- \r
- include(APPPATH.'config/'.$file.EXT);\r
-\r
- if ( ! isset($config) OR ! is_array($config))\r
- {\r
- if ($fail_gracefully === TRUE)\r
- {\r
- return FALSE;\r
- }\r
- show_error('Your '.$file.EXT.' file does not appear to contain a valid configuration array.');\r
- }\r
-\r
- if ($use_sections === TRUE)\r
- {\r
- if (isset($this->config[$file]))\r
- {\r
- $this->config[$file] = array_merge($this->config[$file], $config);\r
- }\r
- else\r
- {\r
- $this->config[$file] = $config;\r
- }\r
- }\r
- else\r
- {\r
- $this->config = array_merge($this->config, $config);\r
- }\r
-\r
- $this->is_loaded[] = $file;\r
- unset($config);\r
-\r
- log_message('debug', 'Config file loaded: config/'.$file.EXT);\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch a config file item\r
- *\r
- *\r
- * @access public\r
- * @param string the config item name\r
- * @param string the index name\r
- * @param bool\r
- * @return string\r
- */\r
- function item($item, $index = '')\r
- { \r
- if ($index == '')\r
- { \r
- if ( ! isset($this->config[$item]))\r
- {\r
- return FALSE;\r
- }\r
-\r
- $pref = $this->config[$item];\r
- }\r
- else\r
- {\r
- if ( ! isset($this->config[$index]))\r
- {\r
- return FALSE;\r
- }\r
-\r
- if ( ! isset($this->config[$index][$item]))\r
- {\r
- return FALSE;\r
- }\r
-\r
- $pref = $this->config[$index][$item];\r
- }\r
-\r
- return $pref;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch a config file item - adds slash after item\r
- *\r
- * The second parameter allows a slash to be added to the end of\r
- * the item, in the case of a path.\r
- *\r
- * @access public\r
- * @param string the config item name\r
- * @param bool\r
- * @return string\r
- */\r
- function slash_item($item)\r
- {\r
- if ( ! isset($this->config[$item]))\r
- {\r
- return FALSE;\r
- }\r
-\r
- $pref = $this->config[$item];\r
-\r
- if ($pref != '' && substr($pref, -1) != '/')\r
- { \r
- $pref .= '/';\r
- }\r
-\r
- return $pref;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Site URL\r
- *\r
- * @access public\r
- * @param string the URI string\r
- * @return string\r
- */\r
- function site_url($uri = '')\r
- {\r
- if (is_array($uri))\r
- {\r
- $uri = implode('/', $uri);\r
- }\r
-\r
- if ($uri == '')\r
- {\r
- return $this->slash_item('base_url').$this->item('index_page');\r
- }\r
- else\r
- {\r
- $suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix');\r
- return $this->slash_item('base_url').$this->slash_item('index_page').preg_replace("|^/*(.+?)/*$|", "\\1", $uri).$suffix;\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * System URL\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function system_url()\r
- {\r
- $x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH));\r
- return $this->slash_item('base_url').end($x).'/';\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set a config file item\r
- *\r
- * @access public\r
- * @param string the config item key\r
- * @param string the config item value\r
- * @return void\r
- */\r
- function set_item($item, $value)\r
- {\r
- $this->config[$item] = $value;\r
- }\r
-\r
-}\r
-\r
-// END CI_Config class\r
-\r
-/* End of file Config.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Config Class
+ *
+ * This class contains functions that enable config files to be managed
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/config.html
+ */
+class CI_Config {
+
+ var $config = array();
+ var $is_loaded = array();
+
+ /**
+ * Constructor
+ *
+ * Sets the $config data from the primary config.php file as a class variable
+ *
+ * @access public
+ * @param string the config file name
+ * @param boolean if configuration values should be loaded into their own section
+ * @param boolean true if errors should just return false, false if an error message should be displayed
+ * @return boolean if the file was successfully loaded or not
+ */
+ function CI_Config()
+ {
+ $this->config =& get_config();
+ log_message('debug', "Config Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load Config File
+ *
+ * @access public
+ * @param string the config file name
+ * @return boolean if the file was loaded correctly
+ */
+ function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
+ {
+ $file = ($file == '') ? 'config' : str_replace(EXT, '', $file);
+
+ if (in_array($file, $this->is_loaded, TRUE))
+ {
+ return TRUE;
+ }
+
+ if ( ! file_exists(APPPATH.'config/'.$file.EXT))
+ {
+ if ($fail_gracefully === TRUE)
+ {
+ return FALSE;
+ }
+ show_error('The configuration file '.$file.EXT.' does not exist.');
+ }
+
+ include(APPPATH.'config/'.$file.EXT);
+
+ if ( ! isset($config) OR ! is_array($config))
+ {
+ if ($fail_gracefully === TRUE)
+ {
+ return FALSE;
+ }
+ show_error('Your '.$file.EXT.' file does not appear to contain a valid configuration array.');
+ }
+
+ if ($use_sections === TRUE)
+ {
+ if (isset($this->config[$file]))
+ {
+ $this->config[$file] = array_merge($this->config[$file], $config);
+ }
+ else
+ {
+ $this->config[$file] = $config;
+ }
+ }
+ else
+ {
+ $this->config = array_merge($this->config, $config);
+ }
+
+ $this->is_loaded[] = $file;
+ unset($config);
+
+ log_message('debug', 'Config file loaded: config/'.$file.EXT);
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch a config file item
+ *
+ *
+ * @access public
+ * @param string the config item name
+ * @param string the index name
+ * @param bool
+ * @return string
+ */
+ function item($item, $index = '')
+ {
+ if ($index == '')
+ {
+ if ( ! isset($this->config[$item]))
+ {
+ return FALSE;
+ }
+
+ $pref = $this->config[$item];
+ }
+ else
+ {
+ if ( ! isset($this->config[$index]))
+ {
+ return FALSE;
+ }
+
+ if ( ! isset($this->config[$index][$item]))
+ {
+ return FALSE;
+ }
+
+ $pref = $this->config[$index][$item];
+ }
+
+ return $pref;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch a config file item - adds slash after item
+ *
+ * The second parameter allows a slash to be added to the end of
+ * the item, in the case of a path.
+ *
+ * @access public
+ * @param string the config item name
+ * @param bool
+ * @return string
+ */
+ function slash_item($item)
+ {
+ if ( ! isset($this->config[$item]))
+ {
+ return FALSE;
+ }
+
+ $pref = $this->config[$item];
+
+ if ($pref != '' && substr($pref, -1) != '/')
+ {
+ $pref .= '/';
+ }
+
+ return $pref;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Site URL
+ *
+ * @access public
+ * @param string the URI string
+ * @return string
+ */
+ function site_url($uri = '')
+ {
+ if (is_array($uri))
+ {
+ $uri = implode('/', $uri);
+ }
+
+ if ($uri == '')
+ {
+ return $this->slash_item('base_url').$this->item('index_page');
+ }
+ else
+ {
+ $suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix');
+ return $this->slash_item('base_url').$this->slash_item('index_page').preg_replace("|^/*(.+?)/*$|", "\\1", $uri).$suffix;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * System URL
+ *
+ * @access public
+ * @return string
+ */
+ function system_url()
+ {
+ $x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH));
+ return $this->slash_item('base_url').end($x).'/';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set a config file item
+ *
+ * @access public
+ * @param string the config item key
+ * @param string the config item value
+ * @return void
+ */
+ function set_item($item, $value)
+ {
+ $this->config[$item] = $value;
+ }
+
+}
+
+// END CI_Config class
+
+/* End of file Config.php */
/* Location: ./system/libraries/Config.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Application Controller Class\r
- *\r
- * This class object is the super class the every library in\r
- * CodeIgniter will be assigned to.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/general/controllers.html\r
- */\r
-class Controller extends CI_Base {\r
-\r
- var $_ci_scaffolding = FALSE;\r
- var $_ci_scaff_table = FALSE;\r
- \r
- /**\r
- * Constructor\r
- *\r
- * Calls the initialize() function\r
- */\r
- function Controller()\r
- { \r
- parent::CI_Base();\r
- $this->_ci_initialize();\r
- log_message('debug', "Controller Class Initialized");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Initialize\r
- *\r
- * Assigns all the bases classes loaded by the front controller to\r
- * variables in this class. Also calls the autoload routine.\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _ci_initialize()\r
- {\r
- // Assign all the class objects that were instantiated by the\r
- // front controller to local class variables so that CI can be\r
- // run as one big super object.\r
- $classes = array(\r
- 'config' => 'Config',\r
- 'input' => 'Input',\r
- 'benchmark' => 'Benchmark',\r
- 'uri' => 'URI',\r
- 'output' => 'Output',\r
- 'lang' => 'Language',\r
- 'router' => 'Router'\r
- );\r
- \r
- foreach ($classes as $var => $class)\r
- {\r
- $this->$var =& load_class($class);\r
- }\r
-\r
- // In PHP 5 the Loader class is run as a discreet\r
- // class. In PHP 4 it extends the Controller\r
- if (floor(phpversion()) >= 5)\r
- {\r
- $this->load =& load_class('Loader');\r
- $this->load->_ci_autoloader();\r
- }\r
- else\r
- {\r
- $this->_ci_autoloader();\r
- \r
- // sync up the objects since PHP4 was working from a copy\r
- foreach (array_keys(get_object_vars($this)) as $attribute)\r
- {\r
- if (is_object($this->$attribute))\r
- {\r
- $this->load->$attribute =& $this->$attribute;\r
- }\r
- }\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Run Scaffolding\r
- *\r
- * @access private\r
- * @return void\r
- */ \r
- function _ci_scaffolding()\r
- {\r
- if ($this->_ci_scaffolding === FALSE OR $this->_ci_scaff_table === FALSE)\r
- {\r
- show_404('Scaffolding unavailable');\r
- }\r
- \r
- $method = ( ! in_array($this->uri->segment(3), array('add', 'insert', 'edit', 'update', 'view', 'delete', 'do_delete'), TRUE)) ? 'view' : $this->uri->segment(3);\r
- \r
- require_once(BASEPATH.'scaffolding/Scaffolding'.EXT);\r
- $scaff = new Scaffolding($this->_ci_scaff_table);\r
- $scaff->$method();\r
- }\r
-\r
-\r
-}\r
-// END _Controller class\r
-\r
-/* End of file Controller.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Application Controller Class
+ *
+ * This class object is the super class the every library in
+ * CodeIgniter will be assigned to.
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/general/controllers.html
+ */
+class Controller extends CI_Base {
+
+ var $_ci_scaffolding = FALSE;
+ var $_ci_scaff_table = FALSE;
+
+ /**
+ * Constructor
+ *
+ * Calls the initialize() function
+ */
+ function Controller()
+ {
+ parent::CI_Base();
+ $this->_ci_initialize();
+ log_message('debug', "Controller Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize
+ *
+ * Assigns all the bases classes loaded by the front controller to
+ * variables in this class. Also calls the autoload routine.
+ *
+ * @access private
+ * @return void
+ */
+ function _ci_initialize()
+ {
+ // Assign all the class objects that were instantiated by the
+ // front controller to local class variables so that CI can be
+ // run as one big super object.
+ $classes = array(
+ 'config' => 'Config',
+ 'input' => 'Input',
+ 'benchmark' => 'Benchmark',
+ 'uri' => 'URI',
+ 'output' => 'Output',
+ 'lang' => 'Language',
+ 'router' => 'Router'
+ );
+
+ foreach ($classes as $var => $class)
+ {
+ $this->$var =& load_class($class);
+ }
+
+ // In PHP 5 the Loader class is run as a discreet
+ // class. In PHP 4 it extends the Controller
+ if (floor(phpversion()) >= 5)
+ {
+ $this->load =& load_class('Loader');
+ $this->load->_ci_autoloader();
+ }
+ else
+ {
+ $this->_ci_autoloader();
+
+ // sync up the objects since PHP4 was working from a copy
+ foreach (array_keys(get_object_vars($this)) as $attribute)
+ {
+ if (is_object($this->$attribute))
+ {
+ $this->load->$attribute =& $this->$attribute;
+ }
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Run Scaffolding
+ *
+ * @access private
+ * @return void
+ */
+ function _ci_scaffolding()
+ {
+ if ($this->_ci_scaffolding === FALSE OR $this->_ci_scaff_table === FALSE)
+ {
+ show_404('Scaffolding unavailable');
+ }
+
+ $method = ( ! in_array($this->uri->segment(3), array('add', 'insert', 'edit', 'update', 'view', 'delete', 'do_delete'), TRUE)) ? 'view' : $this->uri->segment(3);
+
+ require_once(BASEPATH.'scaffolding/Scaffolding'.EXT);
+ $scaff = new Scaffolding($this->_ci_scaff_table);
+ $scaff->$method();
+ }
+
+
+}
+// END _Controller class
+
+/* End of file Controller.php */
/* Location: ./system/libraries/Controller.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Email Class\r
- *\r
- * Permits email to be sent using Mail, Sendmail, or SMTP.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/email.html\r
- */\r
-class CI_Email {\r
-\r
- var $useragent = "CodeIgniter";\r
- var $mailpath = "/usr/sbin/sendmail"; // Sendmail path\r
- var $protocol = "mail"; // mail/sendmail/smtp\r
- var $smtp_host = ""; // SMTP Server. Example: mail.earthlink.net\r
- var $smtp_user = ""; // SMTP Username\r
- var $smtp_pass = ""; // SMTP Password\r
- var $smtp_port = "25"; // SMTP Port\r
- var $smtp_timeout = 5; // SMTP Timeout in seconds\r
- var $wordwrap = TRUE; // TRUE/FALSE Turns word-wrap on/off\r
- var $wrapchars = "76"; // Number of characters to wrap at.\r
- var $mailtype = "text"; // text/html Defines email formatting\r
- var $charset = "utf-8"; // Default char set: iso-8859-1 or us-ascii\r
- var $multipart = "mixed"; // "mixed" (in the body) or "related" (separate)\r
- var $alt_message = ''; // Alternative message for HTML emails\r
- var $validate = FALSE; // TRUE/FALSE. Enables email validation\r
- var $priority = "3"; // Default priority (1 - 5)\r
- var $newline = "\n"; // Default newline. "\r\n" or "\n" (Use "\r\n" to comply with RFC 822)\r
- var $crlf = "\n"; // The RFC 2045 compliant CRLF for quoted-printable is "\r\n". Apparently some servers,\r
- // even on the receiving end think they need to muck with CRLFs, so using "\n", while\r
- // distasteful, is the only thing that seems to work for all environments.\r
- var $send_multipart = TRUE; // TRUE/FALSE - Yahoo does not like multipart alternative, so this is an override. Set to FALSE for Yahoo. \r
- var $bcc_batch_mode = FALSE; // TRUE/FALSE Turns on/off Bcc batch feature\r
- var $bcc_batch_size = 200; // If bcc_batch_mode = TRUE, sets max number of Bccs in each batch\r
- var $_safe_mode = FALSE;\r
- var $_subject = "";\r
- var $_body = "";\r
- var $_finalbody = "";\r
- var $_alt_boundary = "";\r
- var $_atc_boundary = "";\r
- var $_header_str = "";\r
- var $_smtp_connect = "";\r
- var $_encoding = "8bit";\r
- var $_IP = FALSE;\r
- var $_smtp_auth = FALSE;\r
- var $_replyto_flag = FALSE;\r
- var $_debug_msg = array();\r
- var $_recipients = array();\r
- var $_cc_array = array();\r
- var $_bcc_array = array();\r
- var $_headers = array();\r
- var $_attach_name = array();\r
- var $_attach_type = array();\r
- var $_attach_disp = array();\r
- var $_protocols = array('mail', 'sendmail', 'smtp');\r
- var $_base_charsets = array('us-ascii', 'iso-2022-'); // 7-bit charsets (excluding language suffix)\r
- var $_bit_depths = array('7bit', '8bit');\r
- var $_priorities = array('1 (Highest)', '2 (High)', '3 (Normal)', '4 (Low)', '5 (Lowest)');\r
-\r
-\r
- /**\r
- * Constructor - Sets Email Preferences\r
- *\r
- * The constructor can be passed an array of config values\r
- */\r
- function CI_Email($config = array())\r
- { \r
- if (count($config) > 0)\r
- {\r
- $this->initialize($config);\r
- } \r
- else\r
- {\r
- $this->_smtp_auth = ($this->smtp_user == '' AND $this->smtp_pass == '') ? FALSE : TRUE; \r
- $this->_safe_mode = ((boolean)@ini_get("safe_mode") === FALSE) ? FALSE : TRUE;\r
- }\r
- \r
- log_message('debug', "Email Class Initialized");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Initialize preferences\r
- *\r
- * @access public\r
- * @param array\r
- * @return void\r
- */\r
- function initialize($config = array())\r
- {\r
- $this->clear();\r
- foreach ($config as $key => $val)\r
- {\r
- if (isset($this->$key))\r
- {\r
- $method = 'set_'.$key;\r
-\r
- if (method_exists($this, $method))\r
- {\r
- $this->$method($val);\r
- }\r
- else\r
- {\r
- $this->$key = $val;\r
- } \r
- }\r
- }\r
- \r
- $this->_smtp_auth = ($this->smtp_user == '' AND $this->smtp_pass == '') ? FALSE : TRUE; \r
- $this->_safe_mode = ((boolean)@ini_get("safe_mode") === FALSE) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Initialize the Email Data\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function clear($clear_attachments = FALSE)\r
- {\r
- $this->_subject = "";\r
- $this->_body = "";\r
- $this->_finalbody = "";\r
- $this->_header_str = "";\r
- $this->_replyto_flag = FALSE;\r
- $this->_recipients = array();\r
- $this->_headers = array();\r
- $this->_debug_msg = array();\r
-\r
- $this->_set_header('User-Agent', $this->useragent);\r
- $this->_set_header('Date', $this->_set_date());\r
-\r
- if ($clear_attachments !== FALSE)\r
- {\r
- $this->_attach_name = array();\r
- $this->_attach_type = array();\r
- $this->_attach_disp = array();\r
- } \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set FROM\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return void\r
- */ \r
- function from($from, $name = '')\r
- {\r
- if (preg_match( '/\<(.*)\>/', $from, $match))\r
- {\r
- $from = $match['1'];\r
- }\r
-\r
- if ($this->validate)\r
- {\r
- $this->validate_email($this->_str_to_array($from));\r
- }\r
- \r
- if ($name != '' && strncmp($name, '"', 1) != 0)\r
- {\r
- $name = '"'.$name.'"';\r
- }\r
- \r
- $this->_set_header('From', $name.' <'.$from.'>');\r
- $this->_set_header('Return-Path', '<'.$from.'>');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Reply-to\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return void\r
- */ \r
- function reply_to($replyto, $name = '')\r
- {\r
- if (preg_match( '/\<(.*)\>/', $replyto, $match))\r
- {\r
- $replyto = $match['1'];\r
- }\r
-\r
- if ($this->validate)\r
- {\r
- $this->validate_email($this->_str_to_array($replyto)); \r
- }\r
-\r
- if ($name == '')\r
- {\r
- $name = $replyto;\r
- }\r
-\r
- if (strncmp($name, '"', 1) != 0)\r
- {\r
- $name = '"'.$name.'"';\r
- }\r
-\r
- $this->_set_header('Reply-To', $name.' <'.$replyto.'>');\r
- $this->_replyto_flag = TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Recipients\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function to($to)\r
- {\r
- $to = $this->_str_to_array($to);\r
- $to = $this->clean_email($to);\r
- \r
- if ($this->validate)\r
- {\r
- $this->validate_email($to);\r
- }\r
- \r
- if ($this->_get_protocol() != 'mail')\r
- {\r
- $this->_set_header('To', implode(", ", $to));\r
- }\r
-\r
- switch ($this->_get_protocol())\r
- {\r
- case 'smtp' : $this->_recipients = $to;\r
- break;\r
- case 'sendmail' : $this->_recipients = implode(", ", $to);\r
- break;\r
- case 'mail' : $this->_recipients = implode(", ", $to);\r
- break;\r
- } \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set CC\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function cc($cc)\r
- { \r
- $cc = $this->_str_to_array($cc);\r
- $cc = $this->clean_email($cc);\r
-\r
- if ($this->validate)\r
- {\r
- $this->validate_email($cc);\r
- }\r
-\r
- $this->_set_header('Cc', implode(", ", $cc));\r
-\r
- if ($this->_get_protocol() == "smtp")\r
- {\r
- $this->_cc_array = $cc;\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set BCC\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return void\r
- */ \r
- function bcc($bcc, $limit = '')\r
- {\r
- if ($limit != '' && is_numeric($limit))\r
- {\r
- $this->bcc_batch_mode = TRUE;\r
- $this->bcc_batch_size = $limit;\r
- }\r
-\r
- $bcc = $this->_str_to_array($bcc);\r
- $bcc = $this->clean_email($bcc);\r
-\r
- if ($this->validate)\r
- {\r
- $this->validate_email($bcc);\r
- }\r
-\r
- if (($this->_get_protocol() == "smtp") OR ($this->bcc_batch_mode && count($bcc) > $this->bcc_batch_size))\r
- {\r
- $this->_bcc_array = $bcc;\r
- }\r
- else\r
- {\r
- $this->_set_header('Bcc', implode(", ", $bcc));\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Email Subject\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function subject($subject)\r
- {\r
- if (strpos($subject, "\r") !== FALSE OR strpos($subject, "\n") !== FALSE)\r
- {\r
- $subject = str_replace(array("\r\n", "\r", "\n"), '', $subject); \r
- }\r
-\r
- if (strpos($subject, "\t"))\r
- {\r
- $subject = str_replace("\t", ' ', $subject);\r
- }\r
-\r
- $this->_set_header('Subject', trim($subject));\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Body\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function message($body)\r
- {\r
- $this->_body = stripslashes(rtrim(str_replace("\r", "", $body))); \r
- } \r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Assign file attachments\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function attach($filename, $disposition = 'attachment')\r
- { \r
- $this->_attach_name[] = $filename;\r
- $this->_attach_type[] = $this->_mime_types(next(explode('.', basename($filename))));\r
- $this->_attach_disp[] = $disposition; // Can also be 'inline' Not sure if it matters\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Add a Header Item\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @return void\r
- */ \r
- function _set_header($header, $value)\r
- {\r
- $this->_headers[$header] = $value;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Convert a String to an Array\r
- *\r
- * @access private\r
- * @param string\r
- * @return array\r
- */ \r
- function _str_to_array($email)\r
- {\r
- if ( ! is_array($email))\r
- {\r
- if (strpos($email, ',') !== FALSE)\r
- {\r
- $email = preg_split('/[\s,]/', $email, -1, PREG_SPLIT_NO_EMPTY);\r
- }\r
- else\r
- {\r
- $email = trim($email);\r
- settype($email, "array");\r
- }\r
- }\r
- return $email;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Multipart Value\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_alt_message($str = '')\r
- {\r
- $this->alt_message = ($str == '') ? '' : $str;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Mailtype\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_mailtype($type = 'text')\r
- {\r
- $this->mailtype = ($type == 'html') ? 'html' : 'text';\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Wordwrap\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_wordwrap($wordwrap = TRUE)\r
- {\r
- $this->wordwrap = ($wordwrap === FALSE) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Protocol\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_protocol($protocol = 'mail')\r
- {\r
- $this->protocol = ( ! in_array($protocol, $this->_protocols, TRUE)) ? 'mail' : strtolower($protocol);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Priority\r
- *\r
- * @access public\r
- * @param integer\r
- * @return void\r
- */ \r
- function set_priority($n = 3)\r
- {\r
- if ( ! is_numeric($n))\r
- {\r
- $this->priority = 3;\r
- return;\r
- }\r
- \r
- if ($n < 1 OR $n > 5)\r
- {\r
- $this->priority = 3;\r
- return;\r
- }\r
- \r
- $this->priority = $n;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Newline Character\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_newline($newline = "\n")\r
- {\r
- if ($newline != "\n" AND $newline != "\r\n" AND $newline != "\r")\r
- {\r
- $this->newline = "\n"; \r
- return;\r
- }\r
- \r
- $this->newline = $newline; \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set CRLF\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_crlf($crlf = "\n")\r
- {\r
- if ($crlf != "\n" AND $crlf != "\r\n" AND $crlf != "\r")\r
- {\r
- $this->crlf = "\n"; \r
- return;\r
- }\r
- \r
- $this->crlf = $crlf; \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Message Boundary\r
- *\r
- * @access private\r
- * @return void\r
- */ \r
- function _set_boundaries()\r
- {\r
- $this->_alt_boundary = "B_ALT_".uniqid(''); // multipart/alternative\r
- $this->_atc_boundary = "B_ATC_".uniqid(''); // attachment boundary\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get the Message ID\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _get_message_id()\r
- {\r
- $from = $this->_headers['Return-Path'];\r
- $from = str_replace(">", "", $from);\r
- $from = str_replace("<", "", $from);\r
- \r
- return "<".uniqid('').strstr($from, '@').">"; \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get Mail Protocol\r
- *\r
- * @access private\r
- * @param bool\r
- * @return string\r
- */ \r
- function _get_protocol($return = TRUE)\r
- {\r
- $this->protocol = strtolower($this->protocol);\r
- $this->protocol = ( ! in_array($this->protocol, $this->_protocols, TRUE)) ? 'mail' : $this->protocol;\r
-\r
- if ($return == TRUE)\r
- {\r
- return $this->protocol;\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get Mail Encoding\r
- *\r
- * @access private\r
- * @param bool\r
- * @return string\r
- */ \r
- function _get_encoding($return = TRUE)\r
- {\r
- $this->_encoding = ( ! in_array($this->_encoding, $this->_bit_depths)) ? '8bit' : $this->_encoding;\r
-\r
- foreach ($this->_base_charsets as $charset)\r
- {\r
- if (strncmp($charset, $this->charset, strlen($charset)) == 0)\r
- {\r
- $this->_encoding = '7bit';\r
- }\r
- }\r
- \r
- if ($return == TRUE)\r
- {\r
- return $this->_encoding; \r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get content type (text/html/attachment)\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _get_content_type()\r
- { \r
- if ($this->mailtype == 'html' && count($this->_attach_name) == 0)\r
- {\r
- return 'html';\r
- }\r
- elseif ($this->mailtype == 'html' && count($this->_attach_name) > 0)\r
- {\r
- return 'html-attach';\r
- }\r
- elseif ($this->mailtype == 'text' && count($this->_attach_name) > 0)\r
- {\r
- return 'plain-attach';\r
- }\r
- else\r
- {\r
- return 'plain';\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set RFC 822 Date\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _set_date()\r
- {\r
- $timezone = date("Z");\r
- $operator = (strncmp($timezone, '-', 1) == 0) ? '-' : '+';\r
- $timezone = abs($timezone);\r
- $timezone = floor($timezone/3600) * 100 + ($timezone % 3600 ) / 60;\r
-\r
- return sprintf("%s %s%04d", date("D, j M Y H:i:s"), $operator, $timezone);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Mime message\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _get_mime_message()\r
- {\r
- return "This is a multi-part message in MIME format.".$this->newline."Your email application may not support this format.";\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Validate Email Address\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function validate_email($email)\r
- { \r
- if ( ! is_array($email))\r
- {\r
- $this->_set_error_message('email_must_be_array');\r
- return FALSE;\r
- }\r
-\r
- foreach ($email as $val)\r
- {\r
- if ( ! $this->valid_email($val))\r
- {\r
- $this->_set_error_message('email_invalid_address', $val);\r
- return FALSE;\r
- }\r
- }\r
- } \r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Email Validation\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function valid_email($address)\r
- {\r
- return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address)) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Clean Extended Email Address: Joe Smith <joe@smith.com>\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function clean_email($email)\r
- {\r
- if ( ! is_array($email))\r
- {\r
- if (preg_match('/\<(.*)\>/', $email, $match))\r
- {\r
- return $match['1'];\r
- }\r
- else\r
- {\r
- return $email;\r
- }\r
- }\r
- \r
- $clean_email = array();\r
-\r
- foreach ($email as $addy)\r
- {\r
- if (preg_match( '/\<(.*)\>/', $addy, $match))\r
- {\r
- $clean_email[] = $match['1'];\r
- }\r
- else\r
- {\r
- $clean_email[] = $addy; \r
- }\r
- }\r
-\r
- return $clean_email;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Build alternative plain text message\r
- *\r
- * This function provides the raw message for use\r
- * in plain-text headers of HTML-formatted emails.\r
- * If the user hasn't specified his own alternative message\r
- * it creates one by stripping the HTML\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _get_alt_message()\r
- {\r
- if ($this->alt_message != "")\r
- {\r
- return $this->word_wrap($this->alt_message, '76');\r
- }\r
-\r
- if (preg_match('/\<body.*?\>(.*)\<\/body\>/si', $this->_body, $match))\r
- {\r
- $body = $match['1'];\r
- }\r
- else\r
- {\r
- $body = $this->_body;\r
- }\r
-\r
- $body = trim(strip_tags($body));\r
- $body = preg_replace( '#<!--(.*)--\>#', "", $body);\r
- $body = str_replace("\t", "", $body);\r
-\r
- for ($i = 20; $i >= 3; $i--)\r
- {\r
- $n = "";\r
- \r
- for ($x = 1; $x <= $i; $x ++)\r
- {\r
- $n .= "\n";\r
- }\r
-\r
- $body = str_replace($n, "\n\n", $body); \r
- }\r
-\r
- return $this->word_wrap($body, '76');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Word Wrap\r
- *\r
- * @access public\r
- * @param string\r
- * @param integer\r
- * @return string\r
- */ \r
- function word_wrap($str, $charlim = '')\r
- {\r
- // Se the character limit\r
- if ($charlim == '')\r
- {\r
- $charlim = ($this->wrapchars == "") ? "76" : $this->wrapchars;\r
- }\r
-\r
- // Reduce multiple spaces\r
- $str = preg_replace("| +|", " ", $str);\r
-\r
- // Standardize newlines\r
- if (strpos($str, "\r") !== FALSE)\r
- {\r
- $str = str_replace(array("\r\n", "\r"), "\n", $str); \r
- }\r
-\r
- // If the current word is surrounded by {unwrap} tags we'll \r
- // strip the entire chunk and replace it with a marker.\r
- $unwrap = array();\r
- if (preg_match_all("|(\{unwrap\}.+?\{/unwrap\})|s", $str, $matches))\r
- {\r
- for ($i = 0; $i < count($matches['0']); $i++)\r
- {\r
- $unwrap[] = $matches['1'][$i];\r
- $str = str_replace($matches['1'][$i], "{{unwrapped".$i."}}", $str);\r
- }\r
- }\r
-\r
- // Use PHP's native function to do the initial wordwrap. \r
- // We set the cut flag to FALSE so that any individual words that are \r
- // too long get left alone. In the next step we'll deal with them.\r
- $str = wordwrap($str, $charlim, "\n", FALSE);\r
-\r
- // Split the string into individual lines of text and cycle through them\r
- $output = "";\r
- foreach (explode("\n", $str) as $line) \r
- {\r
- // Is the line within the allowed character count?\r
- // If so we'll join it to the output and continue\r
- if (strlen($line) <= $charlim)\r
- {\r
- $output .= $line.$this->newline; \r
- continue;\r
- }\r
-\r
- $temp = '';\r
- while((strlen($line)) > $charlim) \r
- {\r
- // If the over-length word is a URL we won't wrap it\r
- if (preg_match("!\[url.+\]|://|wwww.!", $line))\r
- {\r
- break;\r
- }\r
-\r
- // Trim the word down\r
- $temp .= substr($line, 0, $charlim-1);\r
- $line = substr($line, $charlim-1);\r
- }\r
- \r
- // If $temp contains data it means we had to split up an over-length \r
- // word into smaller chunks so we'll add it back to our current line\r
- if ($temp != '')\r
- {\r
- $output .= $temp.$this->newline.$line;\r
- }\r
- else\r
- {\r
- $output .= $line;\r
- }\r
-\r
- $output .= $this->newline;\r
- }\r
-\r
- // Put our markers back\r
- if (count($unwrap) > 0)\r
- { \r
- foreach ($unwrap as $key => $val)\r
- {\r
- $output = str_replace("{{unwrapped".$key."}}", $val, $output);\r
- }\r
- }\r
-\r
- return $output; \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Build final headers\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */ \r
- function _build_headers()\r
- {\r
- $this->_set_header('X-Sender', $this->clean_email($this->_headers['From']));\r
- $this->_set_header('X-Mailer', $this->useragent);\r
- $this->_set_header('X-Priority', $this->_priorities[$this->priority - 1]);\r
- $this->_set_header('Message-ID', $this->_get_message_id());\r
- $this->_set_header('Mime-Version', '1.0');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Write Headers as a string\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _write_headers()\r
- {\r
- if ($this->protocol == 'mail')\r
- {\r
- $this->_subject = $this->_headers['Subject'];\r
- unset($this->_headers['Subject']);\r
- } \r
-\r
- reset($this->_headers);\r
- $this->_header_str = "";\r
-\r
- foreach($this->_headers as $key => $val)\r
- {\r
- $val = trim($val);\r
-\r
- if ($val != "")\r
- {\r
- $this->_header_str .= $key.": ".$val.$this->newline;\r
- }\r
- }\r
-\r
- if ($this->_get_protocol() == 'mail')\r
- {\r
- $this->_header_str = substr($this->_header_str, 0, -1);\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Build Final Body and attachments\r
- *\r
- * @access private\r
- * @return void\r
- */ \r
- function _build_message()\r
- {\r
- if ($this->wordwrap === TRUE AND $this->mailtype != 'html')\r
- {\r
- $this->_body = $this->word_wrap($this->_body);\r
- }\r
- \r
- $this->_set_boundaries();\r
- $this->_write_headers();\r
-\r
- $hdr = ($this->_get_protocol() == 'mail') ? $this->newline : '';\r
- \r
- switch ($this->_get_content_type())\r
- {\r
- case 'plain' :\r
- \r
- $hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;\r
- $hdr .= "Content-Transfer-Encoding: " . $this->_get_encoding();\r
-\r
- if ($this->_get_protocol() == 'mail')\r
- {\r
- $this->_header_str .= $hdr;\r
- $this->_finalbody = $this->_body;\r
- \r
- return;\r
- }\r
-\r
- $hdr .= $this->newline . $this->newline . $this->_body;\r
-\r
- $this->_finalbody = $hdr;\r
- return;\r
- \r
- break;\r
- case 'html' :\r
- \r
- if ($this->send_multipart === FALSE)\r
- {\r
- $hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;\r
- $hdr .= "Content-Transfer-Encoding: quoted-printable";\r
- }\r
- else\r
- { \r
- $hdr .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline;\r
- $hdr .= $this->_get_mime_message() . $this->newline . $this->newline;\r
- $hdr .= "--" . $this->_alt_boundary . $this->newline;\r
- \r
- $hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;\r
- $hdr .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline;\r
- $hdr .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline;\r
-\r
- $hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;\r
- $hdr .= "Content-Transfer-Encoding: quoted-printable";\r
- }\r
-\r
- $this->_body = $this->_prep_quoted_printable($this->_body);\r
-\r
- if ($this->_get_protocol() == 'mail')\r
- {\r
- $this->_header_str .= $hdr;\r
- $this->_finalbody = $this->_body . $this->newline . $this->newline;\r
- \r
- if ($this->send_multipart !== FALSE)\r
- {\r
- $this->_finalbody .= "--" . $this->_alt_boundary . "--";\r
- }\r
- \r
- return;\r
- }\r
-\r
- $hdr .= $this->newline . $this->newline;\r
- $hdr .= $this->_body . $this->newline . $this->newline;\r
-\r
- if ($this->send_multipart !== FALSE)\r
- {\r
- $hdr .= "--" . $this->_alt_boundary . "--";\r
- }\r
-\r
- $this->_finalbody = $hdr;\r
- return;\r
-\r
- break;\r
- case 'plain-attach' :\r
- \r
- $hdr .= "Content-Type: multipart/".$this->multipart."; boundary=\"" . $this->_atc_boundary."\"" . $this->newline;\r
- $hdr .= $this->_get_mime_message() . $this->newline . $this->newline;\r
- $hdr .= "--" . $this->_atc_boundary . $this->newline;\r
- \r
- $hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;\r
- $hdr .= "Content-Transfer-Encoding: " . $this->_get_encoding();\r
-\r
- if ($this->_get_protocol() == 'mail')\r
- {\r
- $this->_header_str .= $hdr;\r
- \r
- $body = $this->_body . $this->newline . $this->newline;\r
- }\r
-\r
- $hdr .= $this->newline . $this->newline;\r
- $hdr .= $this->_body . $this->newline . $this->newline;\r
-\r
- break;\r
- case 'html-attach' :\r
- \r
- $hdr .= "Content-Type: multipart/".$this->multipart."; boundary=\"" . $this->_atc_boundary."\"" . $this->newline;\r
- $hdr .= $this->_get_mime_message() . $this->newline . $this->newline;\r
- $hdr .= "--" . $this->_atc_boundary . $this->newline;\r
- \r
- $hdr .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline .$this->newline;\r
- $hdr .= "--" . $this->_alt_boundary . $this->newline;\r
-\r
- $hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;\r
- $hdr .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline;\r
- $hdr .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline;\r
- \r
- $hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;\r
- $hdr .= "Content-Transfer-Encoding: quoted-printable";\r
-\r
- $this->_body = $this->_prep_quoted_printable($this->_body);\r
-\r
- if ($this->_get_protocol() == 'mail')\r
- {\r
- $this->_header_str .= $hdr; \r
- \r
- $body = $this->_body . $this->newline . $this->newline;\r
- $body .= "--" . $this->_alt_boundary . "--" . $this->newline . $this->newline;\r
- }\r
-\r
- $hdr .= $this->newline . $this->newline;\r
- $hdr .= $this->_body . $this->newline . $this->newline;\r
- $hdr .= "--" . $this->_alt_boundary . "--" . $this->newline . $this->newline;\r
-\r
- break;\r
- }\r
-\r
- $attachment = array();\r
-\r
- $z = 0;\r
-\r
- for ($i=0; $i < count($this->_attach_name); $i++)\r
- {\r
- $filename = $this->_attach_name[$i];\r
- $basename = basename($filename);\r
- $ctype = $this->_attach_type[$i];\r
-\r
- if ( ! file_exists($filename))\r
- {\r
- $this->_set_error_message('email_attachment_missing', $filename);\r
- return FALSE;\r
- } \r
-\r
- $h = "--".$this->_atc_boundary.$this->newline;\r
- $h .= "Content-type: ".$ctype."; ";\r
- $h .= "name=\"".$basename."\"".$this->newline;\r
- $h .= "Content-Disposition: ".$this->_attach_disp[$i].";".$this->newline;\r
- $h .= "Content-Transfer-Encoding: base64".$this->newline;\r
-\r
- $attachment[$z++] = $h;\r
- $file = filesize($filename) +1;\r
- \r
- if ( ! $fp = fopen($filename, FOPEN_READ))\r
- {\r
- $this->_set_error_message('email_attachment_unreadable', $filename);\r
- return FALSE;\r
- }\r
- \r
- $attachment[$z++] = chunk_split(base64_encode(fread($fp, $file)));\r
- fclose($fp);\r
- }\r
-\r
- if ($this->_get_protocol() == 'mail')\r
- {\r
- $this->_finalbody = $body . implode($this->newline, $attachment).$this->newline."--".$this->_atc_boundary."--"; \r
- \r
- return;\r
- }\r
-\r
- $this->_finalbody = $hdr.implode($this->newline, $attachment).$this->newline."--".$this->_atc_boundary."--"; \r
-\r
- return; \r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Prep Quoted Printable\r
- *\r
- * Prepares string for Quoted-Printable Content-Transfer-Encoding\r
- * Refer to RFC 2045 http://www.ietf.org/rfc/rfc2045.txt\r
- *\r
- * @access private\r
- * @param string\r
- * @param integer\r
- * @return string\r
- */\r
- function _prep_quoted_printable($str, $charlim = '')\r
- {\r
- // Set the character limit\r
- // Don't allow over 76, as that will make servers and MUAs barf\r
- // all over quoted-printable data\r
- if ($charlim == '' OR $charlim > '76')\r
- {\r
- $charlim = '76';\r
- }\r
-\r
- // Reduce multiple spaces\r
- $str = preg_replace("| +|", " ", $str);\r
-\r
- // kill nulls\r
- $str = preg_replace('/\x00+/', '', $str);\r
- \r
- // Standardize newlines\r
- if (strpos($str, "\r") !== FALSE)\r
- {\r
- $str = str_replace(array("\r\n", "\r"), "\n", $str);\r
- }\r
-\r
- // We are intentionally wrapping so mail servers will encode characters\r
- // properly and MUAs will behave, so {unwrap} must go!\r
- $str = str_replace(array('{unwrap}', '{/unwrap}'), '', $str);\r
-\r
- // Break into an array of lines\r
- $lines = explode("\n", $str);\r
-\r
- $escape = '=';\r
- $output = '';\r
-\r
- foreach ($lines as $line)\r
- {\r
- $length = strlen($line);\r
- $temp = '';\r
-\r
- // Loop through each character in the line to add soft-wrap\r
- // characters at the end of a line " =\r\n" and add the newly\r
- // processed line(s) to the output (see comment on $crlf class property)\r
- for ($i = 0; $i < $length; $i++)\r
- {\r
- // Grab the next character\r
- $char = substr($line, $i, 1);\r
- $ascii = ord($char);\r
-\r
- // Convert spaces and tabs but only if it's the end of the line\r
- if ($i == ($length - 1))\r
- {\r
- $char = ($ascii == '32' OR $ascii == '9') ? $escape.sprintf('%02s', dechex($ascii)) : $char;\r
- }\r
-\r
- // encode = signs\r
- if ($ascii == '61')\r
- {\r
- $char = $escape.strtoupper(sprintf('%02s', dechex($ascii))); // =3D\r
- }\r
-\r
- // If we're at the character limit, add the line to the output,\r
- // reset our temp variable, and keep on chuggin'\r
- if ((strlen($temp) + strlen($char)) >= $charlim)\r
- {\r
- $output .= $temp.$escape.$this->crlf;\r
- $temp = '';\r
- }\r
-\r
- // Add the character to our temporary line\r
- $temp .= $char;\r
- }\r
-\r
- // Add our completed line to the output\r
- $output .= $temp.$this->crlf;\r
- }\r
-\r
- // get rid of extra CRLF tacked onto the end\r
- $output = substr($output, 0, strlen($this->crlf) * -1);\r
-\r
- return $output;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Send Email\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function send()\r
- { \r
- if ($this->_replyto_flag == FALSE)\r
- {\r
- $this->reply_to($this->_headers['From']);\r
- }\r
- \r
- if (( ! isset($this->_recipients) AND ! isset($this->_headers['To'])) AND\r
- ( ! isset($this->_bcc_array) AND ! isset($this->_headers['Bcc'])) AND\r
- ( ! isset($this->_headers['Cc'])))\r
- {\r
- $this->_set_error_message('email_no_recipients');\r
- return FALSE;\r
- }\r
-\r
- $this->_build_headers();\r
-\r
- if ($this->bcc_batch_mode AND count($this->_bcc_array) > 0)\r
- {\r
- if (count($this->_bcc_array) > $this->bcc_batch_size)\r
- return $this->batch_bcc_send();\r
- }\r
-\r
- $this->_build_message();\r
-\r
- if ( ! $this->_spool_email())\r
- {\r
- return FALSE;\r
- }\r
- else\r
- {\r
- return TRUE;\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Batch Bcc Send. Sends groups of BCCs in batches\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function batch_bcc_send()\r
- {\r
- $float = $this->bcc_batch_size -1;\r
-\r
- $set = "";\r
-\r
- $chunk = array();\r
-\r
- for ($i = 0; $i < count($this->_bcc_array); $i++)\r
- {\r
- if (isset($this->_bcc_array[$i]))\r
- {\r
- $set .= ", ".$this->_bcc_array[$i];\r
- }\r
-\r
- if ($i == $float)\r
- { \r
- $chunk[] = substr($set, 1);\r
- $float = $float + $this->bcc_batch_size;\r
- $set = "";\r
- }\r
- \r
- if ($i == count($this->_bcc_array)-1)\r
- {\r
- $chunk[] = substr($set, 1);\r
- }\r
- }\r
-\r
- for ($i = 0; $i < count($chunk); $i++)\r
- {\r
- unset($this->_headers['Bcc']);\r
- unset($bcc);\r
-\r
- $bcc = $this->_str_to_array($chunk[$i]);\r
- $bcc = $this->clean_email($bcc);\r
- \r
- if ($this->protocol != 'smtp')\r
- {\r
- $this->_set_header('Bcc', implode(", ", $bcc));\r
- }\r
- else\r
- {\r
- $this->_bcc_array = $bcc;\r
- }\r
- \r
- $this->_build_message();\r
- $this->_spool_email();\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Unwrap special elements\r
- *\r
- * @access private\r
- * @return void\r
- */ \r
- function _unwrap_specials()\r
- {\r
- $this->_finalbody = preg_replace_callback("/\{unwrap\}(.*?)\{\/unwrap\}/si", array($this, '_remove_nl_callback'), $this->_finalbody);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Strip line-breaks via callback\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _remove_nl_callback($matches)\r
- {\r
- if (strpos($matches[1], "\r") !== FALSE OR strpos($matches[1], "\n") !== FALSE)\r
- {\r
- $matches[1] = str_replace(array("\r\n", "\r", "\n"), '', $matches[1]);\r
- }\r
- \r
- return $matches[1];\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Spool mail to the mail server\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _spool_email()\r
- {\r
- $this->_unwrap_specials();\r
-\r
- switch ($this->_get_protocol())\r
- {\r
- case 'mail' :\r
- \r
- if ( ! $this->_send_with_mail())\r
- {\r
- $this->_set_error_message('email_send_failure_phpmail'); \r
- return FALSE;\r
- }\r
- break;\r
- case 'sendmail' :\r
- \r
- if ( ! $this->_send_with_sendmail())\r
- {\r
- $this->_set_error_message('email_send_failure_sendmail'); \r
- return FALSE;\r
- }\r
- break;\r
- case 'smtp' :\r
- \r
- if ( ! $this->_send_with_smtp())\r
- {\r
- $this->_set_error_message('email_send_failure_smtp'); \r
- return FALSE;\r
- }\r
- break;\r
-\r
- }\r
-\r
- $this->_set_error_message('email_sent', $this->_get_protocol());\r
- return TRUE;\r
- } \r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Send using mail()\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _send_with_mail()\r
- { \r
- if ($this->_safe_mode == TRUE)\r
- {\r
- if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str))\r
- {\r
- return FALSE;\r
- }\r
- else\r
- {\r
- return TRUE;\r
- }\r
- }\r
- else\r
- {\r
- // most documentation of sendmail using the "-f" flag lacks a space after it, however\r
- // we've encountered servers that seem to require it to be in place.\r
- if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, "-f ".$this->clean_email($this->_headers['From'])))\r
- {\r
- return FALSE;\r
- }\r
- else\r
- {\r
- return TRUE;\r
- }\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Send using Sendmail\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _send_with_sendmail()\r
- {\r
- $fp = @popen($this->mailpath . " -oi -f ".$this->clean_email($this->_headers['From'])." -t", 'w');\r
-\r
- if ( ! is_resource($fp))\r
- { \r
- $this->_set_error_message('email_no_socket');\r
- return FALSE;\r
- }\r
-\r
- fputs($fp, $this->_header_str);\r
- fputs($fp, $this->_finalbody);\r
- pclose($fp) >> 8 & 0xFF;\r
-\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Send using SMTP\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _send_with_smtp()\r
- { \r
- if ($this->smtp_host == '')\r
- { \r
- $this->_set_error_message('email_no_hostname');\r
- return FALSE;\r
- }\r
-\r
- $this->_smtp_connect();\r
- $this->_smtp_authenticate();\r
-\r
- $this->_send_command('from', $this->clean_email($this->_headers['From']));\r
-\r
- foreach($this->_recipients as $val)\r
- {\r
- $this->_send_command('to', $val);\r
- }\r
- \r
- if (count($this->_cc_array) > 0)\r
- {\r
- foreach($this->_cc_array as $val)\r
- {\r
- if ($val != "")\r
- {\r
- $this->_send_command('to', $val);\r
- }\r
- }\r
- }\r
-\r
- if (count($this->_bcc_array) > 0)\r
- {\r
- foreach($this->_bcc_array as $val)\r
- {\r
- if ($val != "")\r
- {\r
- $this->_send_command('to', $val);\r
- }\r
- }\r
- }\r
-\r
- $this->_send_command('data');\r
-\r
- // perform dot transformation on any lines that begin with a dot\r
- $this->_send_data($this->_header_str . preg_replace('/^\./m', '..$1', $this->_finalbody));\r
-\r
- $this->_send_data('.');\r
-\r
- $reply = $this->_get_smtp_data();\r
-\r
- $this->_set_error_message($reply); \r
-\r
- if (strncmp($reply, '250', 3) != 0)\r
- {\r
- $this->_set_error_message('email_smtp_error', $reply); \r
- return FALSE;\r
- }\r
-\r
- $this->_send_command('quit');\r
- return TRUE;\r
- } \r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * SMTP Connect\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */ \r
- function _smtp_connect()\r
- {\r
- $this->_smtp_connect = fsockopen($this->smtp_host,\r
- $this->smtp_port,\r
- $errno,\r
- $errstr,\r
- $this->smtp_timeout);\r
-\r
- if( ! is_resource($this->_smtp_connect))\r
- { \r
- $this->_set_error_message('email_smtp_error', $errno." ".$errstr);\r
- return FALSE;\r
- }\r
-\r
- $this->_set_error_message($this->_get_smtp_data());\r
- return $this->_send_command('hello');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Send SMTP command\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @return string\r
- */ \r
- function _send_command($cmd, $data = '')\r
- {\r
- switch ($cmd)\r
- {\r
- case 'hello' :\r
-\r
- if ($this->_smtp_auth OR $this->_get_encoding() == '8bit')\r
- $this->_send_data('EHLO '.$this->_get_hostname());\r
- else\r
- $this->_send_data('HELO '.$this->_get_hostname());\r
-\r
- $resp = 250;\r
- break;\r
- case 'from' :\r
- \r
- $this->_send_data('MAIL FROM:<'.$data.'>');\r
-\r
- $resp = 250;\r
- break;\r
- case 'to' :\r
- \r
- $this->_send_data('RCPT TO:<'.$data.'>');\r
-\r
- $resp = 250; \r
- break;\r
- case 'data' :\r
- \r
- $this->_send_data('DATA');\r
-\r
- $resp = 354; \r
- break;\r
- case 'quit' :\r
-\r
- $this->_send_data('QUIT');\r
-\r
- $resp = 221;\r
- break;\r
- }\r
-\r
- $reply = $this->_get_smtp_data(); \r
-\r
- $this->_debug_msg[] = "<pre>".$cmd.": ".$reply."</pre>";\r
-\r
- if (substr($reply, 0, 3) != $resp)\r
- {\r
- $this->_set_error_message('email_smtp_error', $reply);\r
- return FALSE;\r
- }\r
- \r
- if ($cmd == 'quit')\r
- {\r
- fclose($this->_smtp_connect);\r
- }\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * SMTP Authenticate\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _smtp_authenticate()\r
- { \r
- if ( ! $this->_smtp_auth)\r
- {\r
- return TRUE;\r
- }\r
- \r
- if ($this->smtp_user == "" AND $this->smtp_pass == "")\r
- {\r
- $this->_set_error_message('email_no_smtp_unpw');\r
- return FALSE;\r
- }\r
-\r
- $this->_send_data('AUTH LOGIN');\r
-\r
- $reply = $this->_get_smtp_data(); \r
-\r
- if (strncmp($reply, '334', 3) != 0)\r
- {\r
- $this->_set_error_message('email_failed_smtp_login', $reply); \r
- return FALSE;\r
- }\r
-\r
- $this->_send_data(base64_encode($this->smtp_user));\r
-\r
- $reply = $this->_get_smtp_data(); \r
-\r
- if (strncmp($reply, '334', 3) != 0)\r
- {\r
- $this->_set_error_message('email_smtp_auth_un', $reply); \r
- return FALSE;\r
- }\r
-\r
- $this->_send_data(base64_encode($this->smtp_pass));\r
-\r
- $reply = $this->_get_smtp_data(); \r
-\r
- if (strncmp($reply, '235', 3) != 0)\r
- {\r
- $this->_set_error_message('email_smtp_auth_pw', $reply); \r
- return FALSE;\r
- }\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Send SMTP data\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _send_data($data)\r
- {\r
- if ( ! fwrite($this->_smtp_connect, $data . $this->newline))\r
- {\r
- $this->_set_error_message('email_smtp_data_failure', $data); \r
- return FALSE;\r
- }\r
- else\r
- {\r
- return TRUE;\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get SMTP data\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _get_smtp_data()\r
- {\r
- $data = "";\r
-\r
- while ($str = fgets($this->_smtp_connect, 512))\r
- {\r
- $data .= $str;\r
- \r
- if (substr($str, 3, 1) == " ")\r
- {\r
- break;\r
- }\r
- }\r
-\r
- return $data;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get Hostname\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _get_hostname()\r
- { \r
- return (isset($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : 'localhost.localdomain'; \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get IP\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _get_ip()\r
- {\r
- if ($this->_IP !== FALSE)\r
- {\r
- return $this->_IP;\r
- }\r
- \r
- $cip = (isset($_SERVER['HTTP_CLIENT_IP']) AND $_SERVER['HTTP_CLIENT_IP'] != "") ? $_SERVER['HTTP_CLIENT_IP'] : FALSE;\r
- $rip = (isset($_SERVER['REMOTE_ADDR']) AND $_SERVER['REMOTE_ADDR'] != "") ? $_SERVER['REMOTE_ADDR'] : FALSE;\r
- $fip = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND $_SERVER['HTTP_X_FORWARDED_FOR'] != "") ? $_SERVER['HTTP_X_FORWARDED_FOR'] : FALSE;\r
- \r
- if ($cip && $rip) $this->_IP = $cip; \r
- elseif ($rip) $this->_IP = $rip;\r
- elseif ($cip) $this->_IP = $cip;\r
- elseif ($fip) $this->_IP = $fip;\r
-\r
- if (strstr($this->_IP, ','))\r
- {\r
- $x = explode(',', $this->_IP);\r
- $this->_IP = end($x);\r
- }\r
-\r
- if ( ! preg_match( "/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/", $this->_IP))\r
- {\r
- $this->_IP = '0.0.0.0';\r
- }\r
-\r
- unset($cip);\r
- unset($rip);\r
- unset($fip);\r
-\r
- return $this->_IP;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get Debug Message\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function print_debugger()\r
- {\r
- $msg = '';\r
-\r
- if (count($this->_debug_msg) > 0)\r
- {\r
- foreach ($this->_debug_msg as $val)\r
- {\r
- $msg .= $val;\r
- }\r
- }\r
-\r
- $msg .= "<pre>".$this->_header_str."\n".htmlspecialchars($this->_subject)."\n".htmlspecialchars($this->_finalbody).'</pre>'; \r
- return $msg;\r
- } \r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Message\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */ \r
- function _set_error_message($msg, $val = '')\r
- {\r
- $CI =& get_instance();\r
- $CI->lang->load('email');\r
- \r
- if (FALSE === ($line = $CI->lang->line($msg)))\r
- { \r
- $this->_debug_msg[] = str_replace('%s', $val, $msg)."<br />";\r
- } \r
- else\r
- {\r
- $this->_debug_msg[] = str_replace('%s', $val, $line)."<br />";\r
- } \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Mime Types\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _mime_types($ext = "")\r
- {\r
- $mimes = array( 'hqx' => 'application/mac-binhex40',\r
- 'cpt' => 'application/mac-compactpro',\r
- 'doc' => 'application/msword',\r
- 'bin' => 'application/macbinary',\r
- 'dms' => 'application/octet-stream',\r
- 'lha' => 'application/octet-stream',\r
- 'lzh' => 'application/octet-stream',\r
- 'exe' => 'application/octet-stream',\r
- 'class' => 'application/octet-stream',\r
- 'psd' => 'application/octet-stream',\r
- 'so' => 'application/octet-stream',\r
- 'sea' => 'application/octet-stream',\r
- 'dll' => 'application/octet-stream',\r
- 'oda' => 'application/oda',\r
- 'pdf' => 'application/pdf',\r
- 'ai' => 'application/postscript',\r
- 'eps' => 'application/postscript',\r
- 'ps' => 'application/postscript',\r
- 'smi' => 'application/smil',\r
- 'smil' => 'application/smil',\r
- 'mif' => 'application/vnd.mif',\r
- 'xls' => 'application/vnd.ms-excel',\r
- 'ppt' => 'application/vnd.ms-powerpoint',\r
- 'wbxml' => 'application/vnd.wap.wbxml',\r
- 'wmlc' => 'application/vnd.wap.wmlc',\r
- 'dcr' => 'application/x-director',\r
- 'dir' => 'application/x-director',\r
- 'dxr' => 'application/x-director',\r
- 'dvi' => 'application/x-dvi',\r
- 'gtar' => 'application/x-gtar',\r
- 'php' => 'application/x-httpd-php',\r
- 'php4' => 'application/x-httpd-php',\r
- 'php3' => 'application/x-httpd-php',\r
- 'phtml' => 'application/x-httpd-php',\r
- 'phps' => 'application/x-httpd-php-source',\r
- 'js' => 'application/x-javascript',\r
- 'swf' => 'application/x-shockwave-flash',\r
- 'sit' => 'application/x-stuffit',\r
- 'tar' => 'application/x-tar',\r
- 'tgz' => 'application/x-tar',\r
- 'xhtml' => 'application/xhtml+xml',\r
- 'xht' => 'application/xhtml+xml',\r
- 'zip' => 'application/zip',\r
- 'mid' => 'audio/midi',\r
- 'midi' => 'audio/midi',\r
- 'mpga' => 'audio/mpeg',\r
- 'mp2' => 'audio/mpeg',\r
- 'mp3' => 'audio/mpeg',\r
- 'aif' => 'audio/x-aiff',\r
- 'aiff' => 'audio/x-aiff',\r
- 'aifc' => 'audio/x-aiff',\r
- 'ram' => 'audio/x-pn-realaudio',\r
- 'rm' => 'audio/x-pn-realaudio',\r
- 'rpm' => 'audio/x-pn-realaudio-plugin',\r
- 'ra' => 'audio/x-realaudio',\r
- 'rv' => 'video/vnd.rn-realvideo',\r
- 'wav' => 'audio/x-wav',\r
- 'bmp' => 'image/bmp',\r
- 'gif' => 'image/gif',\r
- 'jpeg' => 'image/jpeg',\r
- 'jpg' => 'image/jpeg',\r
- 'jpe' => 'image/jpeg',\r
- 'png' => 'image/png',\r
- 'tiff' => 'image/tiff',\r
- 'tif' => 'image/tiff',\r
- 'css' => 'text/css',\r
- 'html' => 'text/html',\r
- 'htm' => 'text/html',\r
- 'shtml' => 'text/html',\r
- 'txt' => 'text/plain',\r
- 'text' => 'text/plain',\r
- 'log' => 'text/plain',\r
- 'rtx' => 'text/richtext',\r
- 'rtf' => 'text/rtf',\r
- 'xml' => 'text/xml',\r
- 'xsl' => 'text/xml',\r
- 'mpeg' => 'video/mpeg',\r
- 'mpg' => 'video/mpeg',\r
- 'mpe' => 'video/mpeg',\r
- 'qt' => 'video/quicktime',\r
- 'mov' => 'video/quicktime',\r
- 'avi' => 'video/x-msvideo',\r
- 'movie' => 'video/x-sgi-movie',\r
- 'doc' => 'application/msword',\r
- 'word' => 'application/msword',\r
- 'xl' => 'application/excel',\r
- 'eml' => 'message/rfc822'\r
- );\r
-\r
- return ( ! isset($mimes[strtolower($ext)])) ? "application/x-unknown-content-type" : $mimes[strtolower($ext)];\r
- }\r
-\r
-}\r
-// END CI_Email class\r
-\r
-/* End of file Email.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Email Class
+ *
+ * Permits email to be sent using Mail, Sendmail, or SMTP.
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/email.html
+ */
+class CI_Email {
+
+ var $useragent = "CodeIgniter";
+ var $mailpath = "/usr/sbin/sendmail"; // Sendmail path
+ var $protocol = "mail"; // mail/sendmail/smtp
+ var $smtp_host = ""; // SMTP Server. Example: mail.earthlink.net
+ var $smtp_user = ""; // SMTP Username
+ var $smtp_pass = ""; // SMTP Password
+ var $smtp_port = "25"; // SMTP Port
+ var $smtp_timeout = 5; // SMTP Timeout in seconds
+ var $wordwrap = TRUE; // TRUE/FALSE Turns word-wrap on/off
+ var $wrapchars = "76"; // Number of characters to wrap at.
+ var $mailtype = "text"; // text/html Defines email formatting
+ var $charset = "utf-8"; // Default char set: iso-8859-1 or us-ascii
+ var $multipart = "mixed"; // "mixed" (in the body) or "related" (separate)
+ var $alt_message = ''; // Alternative message for HTML emails
+ var $validate = FALSE; // TRUE/FALSE. Enables email validation
+ var $priority = "3"; // Default priority (1 - 5)
+ var $newline = "\n"; // Default newline. "\r\n" or "\n" (Use "\r\n" to comply with RFC 822)
+ var $crlf = "\n"; // The RFC 2045 compliant CRLF for quoted-printable is "\r\n". Apparently some servers,
+ // even on the receiving end think they need to muck with CRLFs, so using "\n", while
+ // distasteful, is the only thing that seems to work for all environments.
+ var $send_multipart = TRUE; // TRUE/FALSE - Yahoo does not like multipart alternative, so this is an override. Set to FALSE for Yahoo.
+ var $bcc_batch_mode = FALSE; // TRUE/FALSE Turns on/off Bcc batch feature
+ var $bcc_batch_size = 200; // If bcc_batch_mode = TRUE, sets max number of Bccs in each batch
+ var $_safe_mode = FALSE;
+ var $_subject = "";
+ var $_body = "";
+ var $_finalbody = "";
+ var $_alt_boundary = "";
+ var $_atc_boundary = "";
+ var $_header_str = "";
+ var $_smtp_connect = "";
+ var $_encoding = "8bit";
+ var $_IP = FALSE;
+ var $_smtp_auth = FALSE;
+ var $_replyto_flag = FALSE;
+ var $_debug_msg = array();
+ var $_recipients = array();
+ var $_cc_array = array();
+ var $_bcc_array = array();
+ var $_headers = array();
+ var $_attach_name = array();
+ var $_attach_type = array();
+ var $_attach_disp = array();
+ var $_protocols = array('mail', 'sendmail', 'smtp');
+ var $_base_charsets = array('us-ascii', 'iso-2022-'); // 7-bit charsets (excluding language suffix)
+ var $_bit_depths = array('7bit', '8bit');
+ var $_priorities = array('1 (Highest)', '2 (High)', '3 (Normal)', '4 (Low)', '5 (Lowest)');
+
+
+ /**
+ * Constructor - Sets Email Preferences
+ *
+ * The constructor can be passed an array of config values
+ */
+ function CI_Email($config = array())
+ {
+ if (count($config) > 0)
+ {
+ $this->initialize($config);
+ }
+ else
+ {
+ $this->_smtp_auth = ($this->smtp_user == '' AND $this->smtp_pass == '') ? FALSE : TRUE;
+ $this->_safe_mode = ((boolean)@ini_get("safe_mode") === FALSE) ? FALSE : TRUE;
+ }
+
+ log_message('debug', "Email Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize preferences
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function initialize($config = array())
+ {
+ $this->clear();
+ foreach ($config as $key => $val)
+ {
+ if (isset($this->$key))
+ {
+ $method = 'set_'.$key;
+
+ if (method_exists($this, $method))
+ {
+ $this->$method($val);
+ }
+ else
+ {
+ $this->$key = $val;
+ }
+ }
+ }
+
+ $this->_smtp_auth = ($this->smtp_user == '' AND $this->smtp_pass == '') ? FALSE : TRUE;
+ $this->_safe_mode = ((boolean)@ini_get("safe_mode") === FALSE) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize the Email Data
+ *
+ * @access public
+ * @return void
+ */
+ function clear($clear_attachments = FALSE)
+ {
+ $this->_subject = "";
+ $this->_body = "";
+ $this->_finalbody = "";
+ $this->_header_str = "";
+ $this->_replyto_flag = FALSE;
+ $this->_recipients = array();
+ $this->_headers = array();
+ $this->_debug_msg = array();
+
+ $this->_set_header('User-Agent', $this->useragent);
+ $this->_set_header('Date', $this->_set_date());
+
+ if ($clear_attachments !== FALSE)
+ {
+ $this->_attach_name = array();
+ $this->_attach_type = array();
+ $this->_attach_disp = array();
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set FROM
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return void
+ */
+ function from($from, $name = '')
+ {
+ if (preg_match( '/\<(.*)\>/', $from, $match))
+ {
+ $from = $match['1'];
+ }
+
+ if ($this->validate)
+ {
+ $this->validate_email($this->_str_to_array($from));
+ }
+
+ if ($name != '' && strncmp($name, '"', 1) != 0)
+ {
+ $name = '"'.$name.'"';
+ }
+
+ $this->_set_header('From', $name.' <'.$from.'>');
+ $this->_set_header('Return-Path', '<'.$from.'>');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Reply-to
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return void
+ */
+ function reply_to($replyto, $name = '')
+ {
+ if (preg_match( '/\<(.*)\>/', $replyto, $match))
+ {
+ $replyto = $match['1'];
+ }
+
+ if ($this->validate)
+ {
+ $this->validate_email($this->_str_to_array($replyto));
+ }
+
+ if ($name == '')
+ {
+ $name = $replyto;
+ }
+
+ if (strncmp($name, '"', 1) != 0)
+ {
+ $name = '"'.$name.'"';
+ }
+
+ $this->_set_header('Reply-To', $name.' <'.$replyto.'>');
+ $this->_replyto_flag = TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Recipients
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function to($to)
+ {
+ $to = $this->_str_to_array($to);
+ $to = $this->clean_email($to);
+
+ if ($this->validate)
+ {
+ $this->validate_email($to);
+ }
+
+ if ($this->_get_protocol() != 'mail')
+ {
+ $this->_set_header('To', implode(", ", $to));
+ }
+
+ switch ($this->_get_protocol())
+ {
+ case 'smtp' : $this->_recipients = $to;
+ break;
+ case 'sendmail' : $this->_recipients = implode(", ", $to);
+ break;
+ case 'mail' : $this->_recipients = implode(", ", $to);
+ break;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set CC
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function cc($cc)
+ {
+ $cc = $this->_str_to_array($cc);
+ $cc = $this->clean_email($cc);
+
+ if ($this->validate)
+ {
+ $this->validate_email($cc);
+ }
+
+ $this->_set_header('Cc', implode(", ", $cc));
+
+ if ($this->_get_protocol() == "smtp")
+ {
+ $this->_cc_array = $cc;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set BCC
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return void
+ */
+ function bcc($bcc, $limit = '')
+ {
+ if ($limit != '' && is_numeric($limit))
+ {
+ $this->bcc_batch_mode = TRUE;
+ $this->bcc_batch_size = $limit;
+ }
+
+ $bcc = $this->_str_to_array($bcc);
+ $bcc = $this->clean_email($bcc);
+
+ if ($this->validate)
+ {
+ $this->validate_email($bcc);
+ }
+
+ if (($this->_get_protocol() == "smtp") OR ($this->bcc_batch_mode && count($bcc) > $this->bcc_batch_size))
+ {
+ $this->_bcc_array = $bcc;
+ }
+ else
+ {
+ $this->_set_header('Bcc', implode(", ", $bcc));
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Email Subject
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function subject($subject)
+ {
+ if (strpos($subject, "\r") !== FALSE OR strpos($subject, "\n") !== FALSE)
+ {
+ $subject = str_replace(array("\r\n", "\r", "\n"), '', $subject);
+ }
+
+ if (strpos($subject, "\t"))
+ {
+ $subject = str_replace("\t", ' ', $subject);
+ }
+
+ $this->_set_header('Subject', trim($subject));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Body
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function message($body)
+ {
+ $this->_body = stripslashes(rtrim(str_replace("\r", "", $body)));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Assign file attachments
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function attach($filename, $disposition = 'attachment')
+ {
+ $this->_attach_name[] = $filename;
+ $this->_attach_type[] = $this->_mime_types(next(explode('.', basename($filename))));
+ $this->_attach_disp[] = $disposition; // Can also be 'inline' Not sure if it matters
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add a Header Item
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @return void
+ */
+ function _set_header($header, $value)
+ {
+ $this->_headers[$header] = $value;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Convert a String to an Array
+ *
+ * @access private
+ * @param string
+ * @return array
+ */
+ function _str_to_array($email)
+ {
+ if ( ! is_array($email))
+ {
+ if (strpos($email, ',') !== FALSE)
+ {
+ $email = preg_split('/[\s,]/', $email, -1, PREG_SPLIT_NO_EMPTY);
+ }
+ else
+ {
+ $email = trim($email);
+ settype($email, "array");
+ }
+ }
+ return $email;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Multipart Value
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_alt_message($str = '')
+ {
+ $this->alt_message = ($str == '') ? '' : $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Mailtype
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_mailtype($type = 'text')
+ {
+ $this->mailtype = ($type == 'html') ? 'html' : 'text';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Wordwrap
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_wordwrap($wordwrap = TRUE)
+ {
+ $this->wordwrap = ($wordwrap === FALSE) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Protocol
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_protocol($protocol = 'mail')
+ {
+ $this->protocol = ( ! in_array($protocol, $this->_protocols, TRUE)) ? 'mail' : strtolower($protocol);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Priority
+ *
+ * @access public
+ * @param integer
+ * @return void
+ */
+ function set_priority($n = 3)
+ {
+ if ( ! is_numeric($n))
+ {
+ $this->priority = 3;
+ return;
+ }
+
+ if ($n < 1 OR $n > 5)
+ {
+ $this->priority = 3;
+ return;
+ }
+
+ $this->priority = $n;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Newline Character
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_newline($newline = "\n")
+ {
+ if ($newline != "\n" AND $newline != "\r\n" AND $newline != "\r")
+ {
+ $this->newline = "\n";
+ return;
+ }
+
+ $this->newline = $newline;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set CRLF
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_crlf($crlf = "\n")
+ {
+ if ($crlf != "\n" AND $crlf != "\r\n" AND $crlf != "\r")
+ {
+ $this->crlf = "\n";
+ return;
+ }
+
+ $this->crlf = $crlf;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Message Boundary
+ *
+ * @access private
+ * @return void
+ */
+ function _set_boundaries()
+ {
+ $this->_alt_boundary = "B_ALT_".uniqid(''); // multipart/alternative
+ $this->_atc_boundary = "B_ATC_".uniqid(''); // attachment boundary
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get the Message ID
+ *
+ * @access private
+ * @return string
+ */
+ function _get_message_id()
+ {
+ $from = $this->_headers['Return-Path'];
+ $from = str_replace(">", "", $from);
+ $from = str_replace("<", "", $from);
+
+ return "<".uniqid('').strstr($from, '@').">";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Mail Protocol
+ *
+ * @access private
+ * @param bool
+ * @return string
+ */
+ function _get_protocol($return = TRUE)
+ {
+ $this->protocol = strtolower($this->protocol);
+ $this->protocol = ( ! in_array($this->protocol, $this->_protocols, TRUE)) ? 'mail' : $this->protocol;
+
+ if ($return == TRUE)
+ {
+ return $this->protocol;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Mail Encoding
+ *
+ * @access private
+ * @param bool
+ * @return string
+ */
+ function _get_encoding($return = TRUE)
+ {
+ $this->_encoding = ( ! in_array($this->_encoding, $this->_bit_depths)) ? '8bit' : $this->_encoding;
+
+ foreach ($this->_base_charsets as $charset)
+ {
+ if (strncmp($charset, $this->charset, strlen($charset)) == 0)
+ {
+ $this->_encoding = '7bit';
+ }
+ }
+
+ if ($return == TRUE)
+ {
+ return $this->_encoding;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get content type (text/html/attachment)
+ *
+ * @access private
+ * @return string
+ */
+ function _get_content_type()
+ {
+ if ($this->mailtype == 'html' && count($this->_attach_name) == 0)
+ {
+ return 'html';
+ }
+ elseif ($this->mailtype == 'html' && count($this->_attach_name) > 0)
+ {
+ return 'html-attach';
+ }
+ elseif ($this->mailtype == 'text' && count($this->_attach_name) > 0)
+ {
+ return 'plain-attach';
+ }
+ else
+ {
+ return 'plain';
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set RFC 822 Date
+ *
+ * @access private
+ * @return string
+ */
+ function _set_date()
+ {
+ $timezone = date("Z");
+ $operator = (strncmp($timezone, '-', 1) == 0) ? '-' : '+';
+ $timezone = abs($timezone);
+ $timezone = floor($timezone/3600) * 100 + ($timezone % 3600 ) / 60;
+
+ return sprintf("%s %s%04d", date("D, j M Y H:i:s"), $operator, $timezone);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Mime message
+ *
+ * @access private
+ * @return string
+ */
+ function _get_mime_message()
+ {
+ return "This is a multi-part message in MIME format.".$this->newline."Your email application may not support this format.";
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Validate Email Address
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function validate_email($email)
+ {
+ if ( ! is_array($email))
+ {
+ $this->_set_error_message('email_must_be_array');
+ return FALSE;
+ }
+
+ foreach ($email as $val)
+ {
+ if ( ! $this->valid_email($val))
+ {
+ $this->_set_error_message('email_invalid_address', $val);
+ return FALSE;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Email Validation
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function valid_email($address)
+ {
+ return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address)) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Clean Extended Email Address: Joe Smith <joe@smith.com>
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function clean_email($email)
+ {
+ if ( ! is_array($email))
+ {
+ if (preg_match('/\<(.*)\>/', $email, $match))
+ {
+ return $match['1'];
+ }
+ else
+ {
+ return $email;
+ }
+ }
+
+ $clean_email = array();
+
+ foreach ($email as $addy)
+ {
+ if (preg_match( '/\<(.*)\>/', $addy, $match))
+ {
+ $clean_email[] = $match['1'];
+ }
+ else
+ {
+ $clean_email[] = $addy;
+ }
+ }
+
+ return $clean_email;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Build alternative plain text message
+ *
+ * This function provides the raw message for use
+ * in plain-text headers of HTML-formatted emails.
+ * If the user hasn't specified his own alternative message
+ * it creates one by stripping the HTML
+ *
+ * @access private
+ * @return string
+ */
+ function _get_alt_message()
+ {
+ if ($this->alt_message != "")
+ {
+ return $this->word_wrap($this->alt_message, '76');
+ }
+
+ if (preg_match('/\<body.*?\>(.*)\<\/body\>/si', $this->_body, $match))
+ {
+ $body = $match['1'];
+ }
+ else
+ {
+ $body = $this->_body;
+ }
+
+ $body = trim(strip_tags($body));
+ $body = preg_replace( '#<!--(.*)--\>#', "", $body);
+ $body = str_replace("\t", "", $body);
+
+ for ($i = 20; $i >= 3; $i--)
+ {
+ $n = "";
+
+ for ($x = 1; $x <= $i; $x ++)
+ {
+ $n .= "\n";
+ }
+
+ $body = str_replace($n, "\n\n", $body);
+ }
+
+ return $this->word_wrap($body, '76');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Word Wrap
+ *
+ * @access public
+ * @param string
+ * @param integer
+ * @return string
+ */
+ function word_wrap($str, $charlim = '')
+ {
+ // Se the character limit
+ if ($charlim == '')
+ {
+ $charlim = ($this->wrapchars == "") ? "76" : $this->wrapchars;
+ }
+
+ // Reduce multiple spaces
+ $str = preg_replace("| +|", " ", $str);
+
+ // Standardize newlines
+ if (strpos($str, "\r") !== FALSE)
+ {
+ $str = str_replace(array("\r\n", "\r"), "\n", $str);
+ }
+
+ // If the current word is surrounded by {unwrap} tags we'll
+ // strip the entire chunk and replace it with a marker.
+ $unwrap = array();
+ if (preg_match_all("|(\{unwrap\}.+?\{/unwrap\})|s", $str, $matches))
+ {
+ for ($i = 0; $i < count($matches['0']); $i++)
+ {
+ $unwrap[] = $matches['1'][$i];
+ $str = str_replace($matches['1'][$i], "{{unwrapped".$i."}}", $str);
+ }
+ }
+
+ // Use PHP's native function to do the initial wordwrap.
+ // We set the cut flag to FALSE so that any individual words that are
+ // too long get left alone. In the next step we'll deal with them.
+ $str = wordwrap($str, $charlim, "\n", FALSE);
+
+ // Split the string into individual lines of text and cycle through them
+ $output = "";
+ foreach (explode("\n", $str) as $line)
+ {
+ // Is the line within the allowed character count?
+ // If so we'll join it to the output and continue
+ if (strlen($line) <= $charlim)
+ {
+ $output .= $line.$this->newline;
+ continue;
+ }
+
+ $temp = '';
+ while((strlen($line)) > $charlim)
+ {
+ // If the over-length word is a URL we won't wrap it
+ if (preg_match("!\[url.+\]|://|wwww.!", $line))
+ {
+ break;
+ }
+
+ // Trim the word down
+ $temp .= substr($line, 0, $charlim-1);
+ $line = substr($line, $charlim-1);
+ }
+
+ // If $temp contains data it means we had to split up an over-length
+ // word into smaller chunks so we'll add it back to our current line
+ if ($temp != '')
+ {
+ $output .= $temp.$this->newline.$line;
+ }
+ else
+ {
+ $output .= $line;
+ }
+
+ $output .= $this->newline;
+ }
+
+ // Put our markers back
+ if (count($unwrap) > 0)
+ {
+ foreach ($unwrap as $key => $val)
+ {
+ $output = str_replace("{{unwrapped".$key."}}", $val, $output);
+ }
+ }
+
+ return $output;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Build final headers
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _build_headers()
+ {
+ $this->_set_header('X-Sender', $this->clean_email($this->_headers['From']));
+ $this->_set_header('X-Mailer', $this->useragent);
+ $this->_set_header('X-Priority', $this->_priorities[$this->priority - 1]);
+ $this->_set_header('Message-ID', $this->_get_message_id());
+ $this->_set_header('Mime-Version', '1.0');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Write Headers as a string
+ *
+ * @access private
+ * @return void
+ */
+ function _write_headers()
+ {
+ if ($this->protocol == 'mail')
+ {
+ $this->_subject = $this->_headers['Subject'];
+ unset($this->_headers['Subject']);
+ }
+
+ reset($this->_headers);
+ $this->_header_str = "";
+
+ foreach($this->_headers as $key => $val)
+ {
+ $val = trim($val);
+
+ if ($val != "")
+ {
+ $this->_header_str .= $key.": ".$val.$this->newline;
+ }
+ }
+
+ if ($this->_get_protocol() == 'mail')
+ {
+ $this->_header_str = substr($this->_header_str, 0, -1);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Build Final Body and attachments
+ *
+ * @access private
+ * @return void
+ */
+ function _build_message()
+ {
+ if ($this->wordwrap === TRUE AND $this->mailtype != 'html')
+ {
+ $this->_body = $this->word_wrap($this->_body);
+ }
+
+ $this->_set_boundaries();
+ $this->_write_headers();
+
+ $hdr = ($this->_get_protocol() == 'mail') ? $this->newline : '';
+
+ switch ($this->_get_content_type())
+ {
+ case 'plain' :
+
+ $hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
+ $hdr .= "Content-Transfer-Encoding: " . $this->_get_encoding();
+
+ if ($this->_get_protocol() == 'mail')
+ {
+ $this->_header_str .= $hdr;
+ $this->_finalbody = $this->_body;
+
+ return;
+ }
+
+ $hdr .= $this->newline . $this->newline . $this->_body;
+
+ $this->_finalbody = $hdr;
+ return;
+
+ break;
+ case 'html' :
+
+ if ($this->send_multipart === FALSE)
+ {
+ $hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
+ $hdr .= "Content-Transfer-Encoding: quoted-printable";
+ }
+ else
+ {
+ $hdr .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline;
+ $hdr .= $this->_get_mime_message() . $this->newline . $this->newline;
+ $hdr .= "--" . $this->_alt_boundary . $this->newline;
+
+ $hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
+ $hdr .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline;
+ $hdr .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline;
+
+ $hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
+ $hdr .= "Content-Transfer-Encoding: quoted-printable";
+ }
+
+ $this->_body = $this->_prep_quoted_printable($this->_body);
+
+ if ($this->_get_protocol() == 'mail')
+ {
+ $this->_header_str .= $hdr;
+ $this->_finalbody = $this->_body . $this->newline . $this->newline;
+
+ if ($this->send_multipart !== FALSE)
+ {
+ $this->_finalbody .= "--" . $this->_alt_boundary . "--";
+ }
+
+ return;
+ }
+
+ $hdr .= $this->newline . $this->newline;
+ $hdr .= $this->_body . $this->newline . $this->newline;
+
+ if ($this->send_multipart !== FALSE)
+ {
+ $hdr .= "--" . $this->_alt_boundary . "--";
+ }
+
+ $this->_finalbody = $hdr;
+ return;
+
+ break;
+ case 'plain-attach' :
+
+ $hdr .= "Content-Type: multipart/".$this->multipart."; boundary=\"" . $this->_atc_boundary."\"" . $this->newline;
+ $hdr .= $this->_get_mime_message() . $this->newline . $this->newline;
+ $hdr .= "--" . $this->_atc_boundary . $this->newline;
+
+ $hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
+ $hdr .= "Content-Transfer-Encoding: " . $this->_get_encoding();
+
+ if ($this->_get_protocol() == 'mail')
+ {
+ $this->_header_str .= $hdr;
+
+ $body = $this->_body . $this->newline . $this->newline;
+ }
+
+ $hdr .= $this->newline . $this->newline;
+ $hdr .= $this->_body . $this->newline . $this->newline;
+
+ break;
+ case 'html-attach' :
+
+ $hdr .= "Content-Type: multipart/".$this->multipart."; boundary=\"" . $this->_atc_boundary."\"" . $this->newline;
+ $hdr .= $this->_get_mime_message() . $this->newline . $this->newline;
+ $hdr .= "--" . $this->_atc_boundary . $this->newline;
+
+ $hdr .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline .$this->newline;
+ $hdr .= "--" . $this->_alt_boundary . $this->newline;
+
+ $hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
+ $hdr .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline;
+ $hdr .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline;
+
+ $hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
+ $hdr .= "Content-Transfer-Encoding: quoted-printable";
+
+ $this->_body = $this->_prep_quoted_printable($this->_body);
+
+ if ($this->_get_protocol() == 'mail')
+ {
+ $this->_header_str .= $hdr;
+
+ $body = $this->_body . $this->newline . $this->newline;
+ $body .= "--" . $this->_alt_boundary . "--" . $this->newline . $this->newline;
+ }
+
+ $hdr .= $this->newline . $this->newline;
+ $hdr .= $this->_body . $this->newline . $this->newline;
+ $hdr .= "--" . $this->_alt_boundary . "--" . $this->newline . $this->newline;
+
+ break;
+ }
+
+ $attachment = array();
+
+ $z = 0;
+
+ for ($i=0; $i < count($this->_attach_name); $i++)
+ {
+ $filename = $this->_attach_name[$i];
+ $basename = basename($filename);
+ $ctype = $this->_attach_type[$i];
+
+ if ( ! file_exists($filename))
+ {
+ $this->_set_error_message('email_attachment_missing', $filename);
+ return FALSE;
+ }
+
+ $h = "--".$this->_atc_boundary.$this->newline;
+ $h .= "Content-type: ".$ctype."; ";
+ $h .= "name=\"".$basename."\"".$this->newline;
+ $h .= "Content-Disposition: ".$this->_attach_disp[$i].";".$this->newline;
+ $h .= "Content-Transfer-Encoding: base64".$this->newline;
+
+ $attachment[$z++] = $h;
+ $file = filesize($filename) +1;
+
+ if ( ! $fp = fopen($filename, FOPEN_READ))
+ {
+ $this->_set_error_message('email_attachment_unreadable', $filename);
+ return FALSE;
+ }
+
+ $attachment[$z++] = chunk_split(base64_encode(fread($fp, $file)));
+ fclose($fp);
+ }
+
+ if ($this->_get_protocol() == 'mail')
+ {
+ $this->_finalbody = $body . implode($this->newline, $attachment).$this->newline."--".$this->_atc_boundary."--";
+
+ return;
+ }
+
+ $this->_finalbody = $hdr.implode($this->newline, $attachment).$this->newline."--".$this->_atc_boundary."--";
+
+ return;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep Quoted Printable
+ *
+ * Prepares string for Quoted-Printable Content-Transfer-Encoding
+ * Refer to RFC 2045 http://www.ietf.org/rfc/rfc2045.txt
+ *
+ * @access private
+ * @param string
+ * @param integer
+ * @return string
+ */
+ function _prep_quoted_printable($str, $charlim = '')
+ {
+ // Set the character limit
+ // Don't allow over 76, as that will make servers and MUAs barf
+ // all over quoted-printable data
+ if ($charlim == '' OR $charlim > '76')
+ {
+ $charlim = '76';
+ }
+
+ // Reduce multiple spaces
+ $str = preg_replace("| +|", " ", $str);
+
+ // kill nulls
+ $str = preg_replace('/\x00+/', '', $str);
+
+ // Standardize newlines
+ if (strpos($str, "\r") !== FALSE)
+ {
+ $str = str_replace(array("\r\n", "\r"), "\n", $str);
+ }
+
+ // We are intentionally wrapping so mail servers will encode characters
+ // properly and MUAs will behave, so {unwrap} must go!
+ $str = str_replace(array('{unwrap}', '{/unwrap}'), '', $str);
+
+ // Break into an array of lines
+ $lines = explode("\n", $str);
+
+ $escape = '=';
+ $output = '';
+
+ foreach ($lines as $line)
+ {
+ $length = strlen($line);
+ $temp = '';
+
+ // Loop through each character in the line to add soft-wrap
+ // characters at the end of a line " =\r\n" and add the newly
+ // processed line(s) to the output (see comment on $crlf class property)
+ for ($i = 0; $i < $length; $i++)
+ {
+ // Grab the next character
+ $char = substr($line, $i, 1);
+ $ascii = ord($char);
+
+ // Convert spaces and tabs but only if it's the end of the line
+ if ($i == ($length - 1))
+ {
+ $char = ($ascii == '32' OR $ascii == '9') ? $escape.sprintf('%02s', dechex($ascii)) : $char;
+ }
+
+ // encode = signs
+ if ($ascii == '61')
+ {
+ $char = $escape.strtoupper(sprintf('%02s', dechex($ascii))); // =3D
+ }
+
+ // If we're at the character limit, add the line to the output,
+ // reset our temp variable, and keep on chuggin'
+ if ((strlen($temp) + strlen($char)) >= $charlim)
+ {
+ $output .= $temp.$escape.$this->crlf;
+ $temp = '';
+ }
+
+ // Add the character to our temporary line
+ $temp .= $char;
+ }
+
+ // Add our completed line to the output
+ $output .= $temp.$this->crlf;
+ }
+
+ // get rid of extra CRLF tacked onto the end
+ $output = substr($output, 0, strlen($this->crlf) * -1);
+
+ return $output;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Send Email
+ *
+ * @access public
+ * @return bool
+ */
+ function send()
+ {
+ if ($this->_replyto_flag == FALSE)
+ {
+ $this->reply_to($this->_headers['From']);
+ }
+
+ if (( ! isset($this->_recipients) AND ! isset($this->_headers['To'])) AND
+ ( ! isset($this->_bcc_array) AND ! isset($this->_headers['Bcc'])) AND
+ ( ! isset($this->_headers['Cc'])))
+ {
+ $this->_set_error_message('email_no_recipients');
+ return FALSE;
+ }
+
+ $this->_build_headers();
+
+ if ($this->bcc_batch_mode AND count($this->_bcc_array) > 0)
+ {
+ if (count($this->_bcc_array) > $this->bcc_batch_size)
+ return $this->batch_bcc_send();
+ }
+
+ $this->_build_message();
+
+ if ( ! $this->_spool_email())
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Batch Bcc Send. Sends groups of BCCs in batches
+ *
+ * @access public
+ * @return bool
+ */
+ function batch_bcc_send()
+ {
+ $float = $this->bcc_batch_size -1;
+
+ $set = "";
+
+ $chunk = array();
+
+ for ($i = 0; $i < count($this->_bcc_array); $i++)
+ {
+ if (isset($this->_bcc_array[$i]))
+ {
+ $set .= ", ".$this->_bcc_array[$i];
+ }
+
+ if ($i == $float)
+ {
+ $chunk[] = substr($set, 1);
+ $float = $float + $this->bcc_batch_size;
+ $set = "";
+ }
+
+ if ($i == count($this->_bcc_array)-1)
+ {
+ $chunk[] = substr($set, 1);
+ }
+ }
+
+ for ($i = 0; $i < count($chunk); $i++)
+ {
+ unset($this->_headers['Bcc']);
+ unset($bcc);
+
+ $bcc = $this->_str_to_array($chunk[$i]);
+ $bcc = $this->clean_email($bcc);
+
+ if ($this->protocol != 'smtp')
+ {
+ $this->_set_header('Bcc', implode(", ", $bcc));
+ }
+ else
+ {
+ $this->_bcc_array = $bcc;
+ }
+
+ $this->_build_message();
+ $this->_spool_email();
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Unwrap special elements
+ *
+ * @access private
+ * @return void
+ */
+ function _unwrap_specials()
+ {
+ $this->_finalbody = preg_replace_callback("/\{unwrap\}(.*?)\{\/unwrap\}/si", array($this, '_remove_nl_callback'), $this->_finalbody);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Strip line-breaks via callback
+ *
+ * @access private
+ * @return string
+ */
+ function _remove_nl_callback($matches)
+ {
+ if (strpos($matches[1], "\r") !== FALSE OR strpos($matches[1], "\n") !== FALSE)
+ {
+ $matches[1] = str_replace(array("\r\n", "\r", "\n"), '', $matches[1]);
+ }
+
+ return $matches[1];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Spool mail to the mail server
+ *
+ * @access private
+ * @return bool
+ */
+ function _spool_email()
+ {
+ $this->_unwrap_specials();
+
+ switch ($this->_get_protocol())
+ {
+ case 'mail' :
+
+ if ( ! $this->_send_with_mail())
+ {
+ $this->_set_error_message('email_send_failure_phpmail');
+ return FALSE;
+ }
+ break;
+ case 'sendmail' :
+
+ if ( ! $this->_send_with_sendmail())
+ {
+ $this->_set_error_message('email_send_failure_sendmail');
+ return FALSE;
+ }
+ break;
+ case 'smtp' :
+
+ if ( ! $this->_send_with_smtp())
+ {
+ $this->_set_error_message('email_send_failure_smtp');
+ return FALSE;
+ }
+ break;
+
+ }
+
+ $this->_set_error_message('email_sent', $this->_get_protocol());
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Send using mail()
+ *
+ * @access private
+ * @return bool
+ */
+ function _send_with_mail()
+ {
+ if ($this->_safe_mode == TRUE)
+ {
+ if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str))
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+ else
+ {
+ // most documentation of sendmail using the "-f" flag lacks a space after it, however
+ // we've encountered servers that seem to require it to be in place.
+ if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, "-f ".$this->clean_email($this->_headers['From'])))
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Send using Sendmail
+ *
+ * @access private
+ * @return bool
+ */
+ function _send_with_sendmail()
+ {
+ $fp = @popen($this->mailpath . " -oi -f ".$this->clean_email($this->_headers['From'])." -t", 'w');
+
+ if ( ! is_resource($fp))
+ {
+ $this->_set_error_message('email_no_socket');
+ return FALSE;
+ }
+
+ fputs($fp, $this->_header_str);
+ fputs($fp, $this->_finalbody);
+ pclose($fp) >> 8 & 0xFF;
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Send using SMTP
+ *
+ * @access private
+ * @return bool
+ */
+ function _send_with_smtp()
+ {
+ if ($this->smtp_host == '')
+ {
+ $this->_set_error_message('email_no_hostname');
+ return FALSE;
+ }
+
+ $this->_smtp_connect();
+ $this->_smtp_authenticate();
+
+ $this->_send_command('from', $this->clean_email($this->_headers['From']));
+
+ foreach($this->_recipients as $val)
+ {
+ $this->_send_command('to', $val);
+ }
+
+ if (count($this->_cc_array) > 0)
+ {
+ foreach($this->_cc_array as $val)
+ {
+ if ($val != "")
+ {
+ $this->_send_command('to', $val);
+ }
+ }
+ }
+
+ if (count($this->_bcc_array) > 0)
+ {
+ foreach($this->_bcc_array as $val)
+ {
+ if ($val != "")
+ {
+ $this->_send_command('to', $val);
+ }
+ }
+ }
+
+ $this->_send_command('data');
+
+ // perform dot transformation on any lines that begin with a dot
+ $this->_send_data($this->_header_str . preg_replace('/^\./m', '..$1', $this->_finalbody));
+
+ $this->_send_data('.');
+
+ $reply = $this->_get_smtp_data();
+
+ $this->_set_error_message($reply);
+
+ if (strncmp($reply, '250', 3) != 0)
+ {
+ $this->_set_error_message('email_smtp_error', $reply);
+ return FALSE;
+ }
+
+ $this->_send_command('quit');
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * SMTP Connect
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _smtp_connect()
+ {
+ $this->_smtp_connect = fsockopen($this->smtp_host,
+ $this->smtp_port,
+ $errno,
+ $errstr,
+ $this->smtp_timeout);
+
+ if( ! is_resource($this->_smtp_connect))
+ {
+ $this->_set_error_message('email_smtp_error', $errno." ".$errstr);
+ return FALSE;
+ }
+
+ $this->_set_error_message($this->_get_smtp_data());
+ return $this->_send_command('hello');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Send SMTP command
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @return string
+ */
+ function _send_command($cmd, $data = '')
+ {
+ switch ($cmd)
+ {
+ case 'hello' :
+
+ if ($this->_smtp_auth OR $this->_get_encoding() == '8bit')
+ $this->_send_data('EHLO '.$this->_get_hostname());
+ else
+ $this->_send_data('HELO '.$this->_get_hostname());
+
+ $resp = 250;
+ break;
+ case 'from' :
+
+ $this->_send_data('MAIL FROM:<'.$data.'>');
+
+ $resp = 250;
+ break;
+ case 'to' :
+
+ $this->_send_data('RCPT TO:<'.$data.'>');
+
+ $resp = 250;
+ break;
+ case 'data' :
+
+ $this->_send_data('DATA');
+
+ $resp = 354;
+ break;
+ case 'quit' :
+
+ $this->_send_data('QUIT');
+
+ $resp = 221;
+ break;
+ }
+
+ $reply = $this->_get_smtp_data();
+
+ $this->_debug_msg[] = "<pre>".$cmd.": ".$reply."</pre>";
+
+ if (substr($reply, 0, 3) != $resp)
+ {
+ $this->_set_error_message('email_smtp_error', $reply);
+ return FALSE;
+ }
+
+ if ($cmd == 'quit')
+ {
+ fclose($this->_smtp_connect);
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * SMTP Authenticate
+ *
+ * @access private
+ * @return bool
+ */
+ function _smtp_authenticate()
+ {
+ if ( ! $this->_smtp_auth)
+ {
+ return TRUE;
+ }
+
+ if ($this->smtp_user == "" AND $this->smtp_pass == "")
+ {
+ $this->_set_error_message('email_no_smtp_unpw');
+ return FALSE;
+ }
+
+ $this->_send_data('AUTH LOGIN');
+
+ $reply = $this->_get_smtp_data();
+
+ if (strncmp($reply, '334', 3) != 0)
+ {
+ $this->_set_error_message('email_failed_smtp_login', $reply);
+ return FALSE;
+ }
+
+ $this->_send_data(base64_encode($this->smtp_user));
+
+ $reply = $this->_get_smtp_data();
+
+ if (strncmp($reply, '334', 3) != 0)
+ {
+ $this->_set_error_message('email_smtp_auth_un', $reply);
+ return FALSE;
+ }
+
+ $this->_send_data(base64_encode($this->smtp_pass));
+
+ $reply = $this->_get_smtp_data();
+
+ if (strncmp($reply, '235', 3) != 0)
+ {
+ $this->_set_error_message('email_smtp_auth_pw', $reply);
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Send SMTP data
+ *
+ * @access private
+ * @return bool
+ */
+ function _send_data($data)
+ {
+ if ( ! fwrite($this->_smtp_connect, $data . $this->newline))
+ {
+ $this->_set_error_message('email_smtp_data_failure', $data);
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get SMTP data
+ *
+ * @access private
+ * @return string
+ */
+ function _get_smtp_data()
+ {
+ $data = "";
+
+ while ($str = fgets($this->_smtp_connect, 512))
+ {
+ $data .= $str;
+
+ if (substr($str, 3, 1) == " ")
+ {
+ break;
+ }
+ }
+
+ return $data;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Hostname
+ *
+ * @access private
+ * @return string
+ */
+ function _get_hostname()
+ {
+ return (isset($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : 'localhost.localdomain';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get IP
+ *
+ * @access private
+ * @return string
+ */
+ function _get_ip()
+ {
+ if ($this->_IP !== FALSE)
+ {
+ return $this->_IP;
+ }
+
+ $cip = (isset($_SERVER['HTTP_CLIENT_IP']) AND $_SERVER['HTTP_CLIENT_IP'] != "") ? $_SERVER['HTTP_CLIENT_IP'] : FALSE;
+ $rip = (isset($_SERVER['REMOTE_ADDR']) AND $_SERVER['REMOTE_ADDR'] != "") ? $_SERVER['REMOTE_ADDR'] : FALSE;
+ $fip = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND $_SERVER['HTTP_X_FORWARDED_FOR'] != "") ? $_SERVER['HTTP_X_FORWARDED_FOR'] : FALSE;
+
+ if ($cip && $rip) $this->_IP = $cip;
+ elseif ($rip) $this->_IP = $rip;
+ elseif ($cip) $this->_IP = $cip;
+ elseif ($fip) $this->_IP = $fip;
+
+ if (strstr($this->_IP, ','))
+ {
+ $x = explode(',', $this->_IP);
+ $this->_IP = end($x);
+ }
+
+ if ( ! preg_match( "/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/", $this->_IP))
+ {
+ $this->_IP = '0.0.0.0';
+ }
+
+ unset($cip);
+ unset($rip);
+ unset($fip);
+
+ return $this->_IP;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Debug Message
+ *
+ * @access public
+ * @return string
+ */
+ function print_debugger()
+ {
+ $msg = '';
+
+ if (count($this->_debug_msg) > 0)
+ {
+ foreach ($this->_debug_msg as $val)
+ {
+ $msg .= $val;
+ }
+ }
+
+ $msg .= "<pre>".$this->_header_str."\n".htmlspecialchars($this->_subject)."\n".htmlspecialchars($this->_finalbody).'</pre>';
+ return $msg;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Message
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _set_error_message($msg, $val = '')
+ {
+ $CI =& get_instance();
+ $CI->lang->load('email');
+
+ if (FALSE === ($line = $CI->lang->line($msg)))
+ {
+ $this->_debug_msg[] = str_replace('%s', $val, $msg)."<br />";
+ }
+ else
+ {
+ $this->_debug_msg[] = str_replace('%s', $val, $line)."<br />";
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Mime Types
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _mime_types($ext = "")
+ {
+ $mimes = array( 'hqx' => 'application/mac-binhex40',
+ 'cpt' => 'application/mac-compactpro',
+ 'doc' => 'application/msword',
+ 'bin' => 'application/macbinary',
+ 'dms' => 'application/octet-stream',
+ 'lha' => 'application/octet-stream',
+ 'lzh' => 'application/octet-stream',
+ 'exe' => 'application/octet-stream',
+ 'class' => 'application/octet-stream',
+ 'psd' => 'application/octet-stream',
+ 'so' => 'application/octet-stream',
+ 'sea' => 'application/octet-stream',
+ 'dll' => 'application/octet-stream',
+ 'oda' => 'application/oda',
+ 'pdf' => 'application/pdf',
+ 'ai' => 'application/postscript',
+ 'eps' => 'application/postscript',
+ 'ps' => 'application/postscript',
+ 'smi' => 'application/smil',
+ 'smil' => 'application/smil',
+ 'mif' => 'application/vnd.mif',
+ 'xls' => 'application/vnd.ms-excel',
+ 'ppt' => 'application/vnd.ms-powerpoint',
+ 'wbxml' => 'application/vnd.wap.wbxml',
+ 'wmlc' => 'application/vnd.wap.wmlc',
+ 'dcr' => 'application/x-director',
+ 'dir' => 'application/x-director',
+ 'dxr' => 'application/x-director',
+ 'dvi' => 'application/x-dvi',
+ 'gtar' => 'application/x-gtar',
+ 'php' => 'application/x-httpd-php',
+ 'php4' => 'application/x-httpd-php',
+ 'php3' => 'application/x-httpd-php',
+ 'phtml' => 'application/x-httpd-php',
+ 'phps' => 'application/x-httpd-php-source',
+ 'js' => 'application/x-javascript',
+ 'swf' => 'application/x-shockwave-flash',
+ 'sit' => 'application/x-stuffit',
+ 'tar' => 'application/x-tar',
+ 'tgz' => 'application/x-tar',
+ 'xhtml' => 'application/xhtml+xml',
+ 'xht' => 'application/xhtml+xml',
+ 'zip' => 'application/zip',
+ 'mid' => 'audio/midi',
+ 'midi' => 'audio/midi',
+ 'mpga' => 'audio/mpeg',
+ 'mp2' => 'audio/mpeg',
+ 'mp3' => 'audio/mpeg',
+ 'aif' => 'audio/x-aiff',
+ 'aiff' => 'audio/x-aiff',
+ 'aifc' => 'audio/x-aiff',
+ 'ram' => 'audio/x-pn-realaudio',
+ 'rm' => 'audio/x-pn-realaudio',
+ 'rpm' => 'audio/x-pn-realaudio-plugin',
+ 'ra' => 'audio/x-realaudio',
+ 'rv' => 'video/vnd.rn-realvideo',
+ 'wav' => 'audio/x-wav',
+ 'bmp' => 'image/bmp',
+ 'gif' => 'image/gif',
+ 'jpeg' => 'image/jpeg',
+ 'jpg' => 'image/jpeg',
+ 'jpe' => 'image/jpeg',
+ 'png' => 'image/png',
+ 'tiff' => 'image/tiff',
+ 'tif' => 'image/tiff',
+ 'css' => 'text/css',
+ 'html' => 'text/html',
+ 'htm' => 'text/html',
+ 'shtml' => 'text/html',
+ 'txt' => 'text/plain',
+ 'text' => 'text/plain',
+ 'log' => 'text/plain',
+ 'rtx' => 'text/richtext',
+ 'rtf' => 'text/rtf',
+ 'xml' => 'text/xml',
+ 'xsl' => 'text/xml',
+ 'mpeg' => 'video/mpeg',
+ 'mpg' => 'video/mpeg',
+ 'mpe' => 'video/mpeg',
+ 'qt' => 'video/quicktime',
+ 'mov' => 'video/quicktime',
+ 'avi' => 'video/x-msvideo',
+ 'movie' => 'video/x-sgi-movie',
+ 'doc' => 'application/msword',
+ 'word' => 'application/msword',
+ 'xl' => 'application/excel',
+ 'eml' => 'message/rfc822'
+ );
+
+ return ( ! isset($mimes[strtolower($ext)])) ? "application/x-unknown-content-type" : $mimes[strtolower($ext)];
+ }
+
+}
+// END CI_Email class
+
+/* End of file Email.php */
/* Location: ./system/libraries/Email.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Encryption Class\r
- *\r
- * Provides two-way keyed encoding using XOR Hashing and Mcrypt\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/encryption.html\r
- */\r
-class CI_Encrypt {\r
-\r
- var $CI;\r
- var $encryption_key = '';\r
- var $_hash_type = 'sha1';\r
- var $_mcrypt_exists = FALSE;\r
- var $_mcrypt_cipher;\r
- var $_mcrypt_mode;\r
-\r
- /**\r
- * Constructor\r
- *\r
- * Simply determines whether the mcrypt library exists.\r
- *\r
- */\r
- function CI_Encrypt()\r
- {\r
- $this->CI =& get_instance();\r
- $this->_mcrypt_exists = ( ! function_exists('mcrypt_encrypt')) ? FALSE : TRUE;\r
- log_message('debug', "Encrypt Class Initialized");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch the encryption key\r
- *\r
- * Returns it as MD5 in order to have an exact-length 128 bit key.\r
- * Mcrypt is sensitive to keys that are not the correct length\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function get_key($key = '')\r
- {\r
- if ($key == '')\r
- {\r
- if ($this->encryption_key != '')\r
- {\r
- return $this->encryption_key;\r
- }\r
-\r
- $CI =& get_instance();\r
- $key = $CI->config->item('encryption_key');\r
-\r
- if ($key === FALSE)\r
- {\r
- show_error('In order to use the encryption class requires that you set an encryption key in your config file.');\r
- }\r
- }\r
-\r
- return md5($key);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set the encryption key\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */\r
- function set_key($key = '')\r
- {\r
- $this->encryption_key = $key;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Encode\r
- *\r
- * Encodes the message string using bitwise XOR encoding.\r
- * The key is combined with a random hash, and then it\r
- * too gets converted using XOR. The whole thing is then run\r
- * through mcrypt (if supported) using the randomized key.\r
- * The end result is a double-encrypted message string\r
- * that is randomized with each call to this function,\r
- * even if the supplied message and key are the same.\r
- *\r
- * @access public\r
- * @param string the string to encode\r
- * @param string the key\r
- * @return string\r
- */\r
- function encode($string, $key = '')\r
- {\r
- $key = $this->get_key($key);\r
- $enc = $this->_xor_encode($string, $key);\r
- \r
- if ($this->_mcrypt_exists === TRUE)\r
- {\r
- $enc = $this->mcrypt_encode($enc, $key);\r
- }\r
- return base64_encode($enc);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Decode\r
- *\r
- * Reverses the above process\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- function decode($string, $key = '')\r
- {\r
- $key = $this->get_key($key);\r
- \r
- if (preg_match('/[^a-zA-Z0-9\/\+=]/', $string))\r
- {\r
- return FALSE;\r
- }\r
-\r
- $dec = base64_decode($string);\r
-\r
- if ($this->_mcrypt_exists === TRUE)\r
- {\r
- if (($dec = $this->mcrypt_decode($dec, $key)) === FALSE)\r
- {\r
- return FALSE;\r
- }\r
- }\r
-\r
- return $this->_xor_decode($dec, $key);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * XOR Encode\r
- *\r
- * Takes a plain-text string and key as input and generates an\r
- * encoded bit-string using XOR\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- function _xor_encode($string, $key)\r
- {\r
- $rand = '';\r
- while (strlen($rand) < 32)\r
- {\r
- $rand .= mt_rand(0, mt_getrandmax());\r
- }\r
-\r
- $rand = $this->hash($rand);\r
-\r
- $enc = '';\r
- for ($i = 0; $i < strlen($string); $i++)\r
- { \r
- $enc .= substr($rand, ($i % strlen($rand)), 1).(substr($rand, ($i % strlen($rand)), 1) ^ substr($string, $i, 1));\r
- }\r
-\r
- return $this->_xor_merge($enc, $key);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * XOR Decode\r
- *\r
- * Takes an encoded string and key as input and generates the\r
- * plain-text original message\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- function _xor_decode($string, $key)\r
- {\r
- $string = $this->_xor_merge($string, $key);\r
-\r
- $dec = '';\r
- for ($i = 0; $i < strlen($string); $i++)\r
- {\r
- $dec .= (substr($string, $i++, 1) ^ substr($string, $i, 1));\r
- }\r
-\r
- return $dec;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * XOR key + string Combiner\r
- *\r
- * Takes a string and key as input and computes the difference using XOR\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- function _xor_merge($string, $key)\r
- {\r
- $hash = $this->hash($key);\r
- $str = '';\r
- for ($i = 0; $i < strlen($string); $i++)\r
- {\r
- $str .= substr($string, $i, 1) ^ substr($hash, ($i % strlen($hash)), 1);\r
- }\r
-\r
- return $str;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Encrypt using Mcrypt\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- function mcrypt_encode($data, $key)\r
- {\r
- $init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode());\r
- $init_vect = mcrypt_create_iv($init_size, MCRYPT_RAND);\r
- return $this->_add_cipher_noise($init_vect.mcrypt_encrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), $key);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Decrypt using Mcrypt\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- function mcrypt_decode($data, $key)\r
- {\r
- $data = $this->_remove_cipher_noise($data, $key);\r
- $init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode());\r
-\r
- if ($init_size > strlen($data))\r
- {\r
- return FALSE;\r
- }\r
-\r
- $init_vect = substr($data, 0, $init_size);\r
- $data = substr($data, $init_size);\r
- return rtrim(mcrypt_decrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), "\0");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Adds permuted noise to the IV + encrypted data to protect\r
- * against Man-in-the-middle attacks on CBC mode ciphers\r
- * http://www.ciphersbyritter.com/GLOSSARY.HTM#IV\r
- *\r
- * Function description\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- function _add_cipher_noise($data, $key)\r
- {\r
- $keyhash = $this->hash($key);\r
- $keylen = strlen($keyhash);\r
- $str = '';\r
-\r
- for ($i = 0, $j = 0, $len = strlen($data); $i < $len; ++$i, ++$j)\r
- {\r
- if ($j >= $keylen)\r
- {\r
- $j = 0;\r
- }\r
-\r
- $str .= chr((ord($data[$i]) + ord($keyhash[$j])) % 256);\r
- }\r
-\r
- return $str;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Removes permuted noise from the IV + encrypted data, reversing\r
- * _add_cipher_noise()\r
- *\r
- * Function description\r
- *\r
- * @access public\r
- * @param type\r
- * @return type\r
- */\r
- function _remove_cipher_noise($data, $key)\r
- {\r
- $keyhash = $this->hash($key);\r
- $keylen = strlen($keyhash);\r
- $str = '';\r
-\r
- for ($i = 0, $j = 0, $len = strlen($data); $i < $len; ++$i, ++$j)\r
- {\r
- if ($j >= $keylen)\r
- {\r
- $j = 0;\r
- }\r
-\r
- $temp = ord($data[$i]) - ord($keyhash[$j]);\r
-\r
- if ($temp < 0)\r
- {\r
- $temp = $temp + 256;\r
- }\r
- \r
- $str .= chr($temp);\r
- }\r
-\r
- return $str;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the Mcrypt Cipher\r
- *\r
- * @access public\r
- * @param constant\r
- * @return string\r
- */\r
- function set_cipher($cipher)\r
- {\r
- $this->_mcrypt_cipher = $cipher;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set the Mcrypt Mode\r
- *\r
- * @access public\r
- * @param constant\r
- * @return string\r
- */\r
- function set_mode($mode)\r
- {\r
- $this->_mcrypt_mode = $mode;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get Mcrypt cipher Value\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _get_cipher()\r
- {\r
- if ($this->_mcrypt_cipher == '')\r
- {\r
- $this->_mcrypt_cipher = MCRYPT_RIJNDAEL_256;\r
- }\r
-\r
- return $this->_mcrypt_cipher;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get Mcrypt Mode Value\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _get_mode()\r
- {\r
- if ($this->_mcrypt_mode == '')\r
- {\r
- $this->_mcrypt_mode = MCRYPT_MODE_ECB;\r
- }\r
- \r
- return $this->_mcrypt_mode;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set the Hash type\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function set_hash($type = 'sha1')\r
- {\r
- $this->_hash_type = ($type != 'sha1' AND $type != 'md5') ? 'sha1' : $type;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Hash encode a string\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function hash($str)\r
- {\r
- return ($this->_hash_type == 'sha1') ? $this->sha1($str) : md5($str);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Generate an SHA1 Hash\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function sha1($str)\r
- {\r
- if ( ! function_exists('sha1'))\r
- {\r
- if ( ! function_exists('mhash'))\r
- {\r
- require_once(BASEPATH.'libraries/Sha1'.EXT);\r
- $SH = new CI_SHA;\r
- return $SH->generate($str);\r
- }\r
- else\r
- {\r
- return bin2hex(mhash(MHASH_SHA1, $str));\r
- }\r
- }\r
- else\r
- {\r
- return sha1($str);\r
- }\r
- }\r
-\r
-}\r
-\r
-// END CI_Encrypt class\r
-\r
-/* End of file Encrypt.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Encryption Class
+ *
+ * Provides two-way keyed encoding using XOR Hashing and Mcrypt
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/encryption.html
+ */
+class CI_Encrypt {
+
+ var $CI;
+ var $encryption_key = '';
+ var $_hash_type = 'sha1';
+ var $_mcrypt_exists = FALSE;
+ var $_mcrypt_cipher;
+ var $_mcrypt_mode;
+
+ /**
+ * Constructor
+ *
+ * Simply determines whether the mcrypt library exists.
+ *
+ */
+ function CI_Encrypt()
+ {
+ $this->CI =& get_instance();
+ $this->_mcrypt_exists = ( ! function_exists('mcrypt_encrypt')) ? FALSE : TRUE;
+ log_message('debug', "Encrypt Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch the encryption key
+ *
+ * Returns it as MD5 in order to have an exact-length 128 bit key.
+ * Mcrypt is sensitive to keys that are not the correct length
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function get_key($key = '')
+ {
+ if ($key == '')
+ {
+ if ($this->encryption_key != '')
+ {
+ return $this->encryption_key;
+ }
+
+ $CI =& get_instance();
+ $key = $CI->config->item('encryption_key');
+
+ if ($key === FALSE)
+ {
+ show_error('In order to use the encryption class requires that you set an encryption key in your config file.');
+ }
+ }
+
+ return md5($key);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the encryption key
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_key($key = '')
+ {
+ $this->encryption_key = $key;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Encode
+ *
+ * Encodes the message string using bitwise XOR encoding.
+ * The key is combined with a random hash, and then it
+ * too gets converted using XOR. The whole thing is then run
+ * through mcrypt (if supported) using the randomized key.
+ * The end result is a double-encrypted message string
+ * that is randomized with each call to this function,
+ * even if the supplied message and key are the same.
+ *
+ * @access public
+ * @param string the string to encode
+ * @param string the key
+ * @return string
+ */
+ function encode($string, $key = '')
+ {
+ $key = $this->get_key($key);
+ $enc = $this->_xor_encode($string, $key);
+
+ if ($this->_mcrypt_exists === TRUE)
+ {
+ $enc = $this->mcrypt_encode($enc, $key);
+ }
+ return base64_encode($enc);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Decode
+ *
+ * Reverses the above process
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function decode($string, $key = '')
+ {
+ $key = $this->get_key($key);
+
+ if (preg_match('/[^a-zA-Z0-9\/\+=]/', $string))
+ {
+ return FALSE;
+ }
+
+ $dec = base64_decode($string);
+
+ if ($this->_mcrypt_exists === TRUE)
+ {
+ if (($dec = $this->mcrypt_decode($dec, $key)) === FALSE)
+ {
+ return FALSE;
+ }
+ }
+
+ return $this->_xor_decode($dec, $key);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * XOR Encode
+ *
+ * Takes a plain-text string and key as input and generates an
+ * encoded bit-string using XOR
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @return string
+ */
+ function _xor_encode($string, $key)
+ {
+ $rand = '';
+ while (strlen($rand) < 32)
+ {
+ $rand .= mt_rand(0, mt_getrandmax());
+ }
+
+ $rand = $this->hash($rand);
+
+ $enc = '';
+ for ($i = 0; $i < strlen($string); $i++)
+ {
+ $enc .= substr($rand, ($i % strlen($rand)), 1).(substr($rand, ($i % strlen($rand)), 1) ^ substr($string, $i, 1));
+ }
+
+ return $this->_xor_merge($enc, $key);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * XOR Decode
+ *
+ * Takes an encoded string and key as input and generates the
+ * plain-text original message
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @return string
+ */
+ function _xor_decode($string, $key)
+ {
+ $string = $this->_xor_merge($string, $key);
+
+ $dec = '';
+ for ($i = 0; $i < strlen($string); $i++)
+ {
+ $dec .= (substr($string, $i++, 1) ^ substr($string, $i, 1));
+ }
+
+ return $dec;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * XOR key + string Combiner
+ *
+ * Takes a string and key as input and computes the difference using XOR
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @return string
+ */
+ function _xor_merge($string, $key)
+ {
+ $hash = $this->hash($key);
+ $str = '';
+ for ($i = 0; $i < strlen($string); $i++)
+ {
+ $str .= substr($string, $i, 1) ^ substr($hash, ($i % strlen($hash)), 1);
+ }
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Encrypt using Mcrypt
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function mcrypt_encode($data, $key)
+ {
+ $init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode());
+ $init_vect = mcrypt_create_iv($init_size, MCRYPT_RAND);
+ return $this->_add_cipher_noise($init_vect.mcrypt_encrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), $key);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Decrypt using Mcrypt
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function mcrypt_decode($data, $key)
+ {
+ $data = $this->_remove_cipher_noise($data, $key);
+ $init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode());
+
+ if ($init_size > strlen($data))
+ {
+ return FALSE;
+ }
+
+ $init_vect = substr($data, 0, $init_size);
+ $data = substr($data, $init_size);
+ return rtrim(mcrypt_decrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), "\0");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Adds permuted noise to the IV + encrypted data to protect
+ * against Man-in-the-middle attacks on CBC mode ciphers
+ * http://www.ciphersbyritter.com/GLOSSARY.HTM#IV
+ *
+ * Function description
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @return string
+ */
+ function _add_cipher_noise($data, $key)
+ {
+ $keyhash = $this->hash($key);
+ $keylen = strlen($keyhash);
+ $str = '';
+
+ for ($i = 0, $j = 0, $len = strlen($data); $i < $len; ++$i, ++$j)
+ {
+ if ($j >= $keylen)
+ {
+ $j = 0;
+ }
+
+ $str .= chr((ord($data[$i]) + ord($keyhash[$j])) % 256);
+ }
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Removes permuted noise from the IV + encrypted data, reversing
+ * _add_cipher_noise()
+ *
+ * Function description
+ *
+ * @access public
+ * @param type
+ * @return type
+ */
+ function _remove_cipher_noise($data, $key)
+ {
+ $keyhash = $this->hash($key);
+ $keylen = strlen($keyhash);
+ $str = '';
+
+ for ($i = 0, $j = 0, $len = strlen($data); $i < $len; ++$i, ++$j)
+ {
+ if ($j >= $keylen)
+ {
+ $j = 0;
+ }
+
+ $temp = ord($data[$i]) - ord($keyhash[$j]);
+
+ if ($temp < 0)
+ {
+ $temp = $temp + 256;
+ }
+
+ $str .= chr($temp);
+ }
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the Mcrypt Cipher
+ *
+ * @access public
+ * @param constant
+ * @return string
+ */
+ function set_cipher($cipher)
+ {
+ $this->_mcrypt_cipher = $cipher;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the Mcrypt Mode
+ *
+ * @access public
+ * @param constant
+ * @return string
+ */
+ function set_mode($mode)
+ {
+ $this->_mcrypt_mode = $mode;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Mcrypt cipher Value
+ *
+ * @access private
+ * @return string
+ */
+ function _get_cipher()
+ {
+ if ($this->_mcrypt_cipher == '')
+ {
+ $this->_mcrypt_cipher = MCRYPT_RIJNDAEL_256;
+ }
+
+ return $this->_mcrypt_cipher;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Mcrypt Mode Value
+ *
+ * @access private
+ * @return string
+ */
+ function _get_mode()
+ {
+ if ($this->_mcrypt_mode == '')
+ {
+ $this->_mcrypt_mode = MCRYPT_MODE_ECB;
+ }
+
+ return $this->_mcrypt_mode;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the Hash type
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function set_hash($type = 'sha1')
+ {
+ $this->_hash_type = ($type != 'sha1' AND $type != 'md5') ? 'sha1' : $type;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Hash encode a string
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function hash($str)
+ {
+ return ($this->_hash_type == 'sha1') ? $this->sha1($str) : md5($str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate an SHA1 Hash
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function sha1($str)
+ {
+ if ( ! function_exists('sha1'))
+ {
+ if ( ! function_exists('mhash'))
+ {
+ require_once(BASEPATH.'libraries/Sha1'.EXT);
+ $SH = new CI_SHA;
+ return $SH->generate($str);
+ }
+ else
+ {
+ return bin2hex(mhash(MHASH_SHA1, $str));
+ }
+ }
+ else
+ {
+ return sha1($str);
+ }
+ }
+
+}
+
+// END CI_Encrypt class
+
+/* End of file Encrypt.php */
/* Location: ./system/libraries/Encrypt.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Exceptions Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Exceptions\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/exceptions.html\r
- */\r
-class CI_Exceptions {\r
- var $action;\r
- var $severity;\r
- var $message;\r
- var $filename;\r
- var $line;\r
- var $ob_level;\r
-\r
- var $levels = array(\r
- E_ERROR => 'Error',\r
- E_WARNING => 'Warning',\r
- E_PARSE => 'Parsing Error',\r
- E_NOTICE => 'Notice',\r
- E_CORE_ERROR => 'Core Error',\r
- E_CORE_WARNING => 'Core Warning',\r
- E_COMPILE_ERROR => 'Compile Error',\r
- E_COMPILE_WARNING => 'Compile Warning',\r
- E_USER_ERROR => 'User Error',\r
- E_USER_WARNING => 'User Warning',\r
- E_USER_NOTICE => 'User Notice',\r
- E_STRICT => 'Runtime Notice'\r
- );\r
-\r
-\r
- /**\r
- * Constructor\r
- *\r
- */ \r
- function CI_Exceptions()\r
- {\r
- $this->ob_level = ob_get_level();\r
- // Note: Do not log messages from this constructor.\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Exception Logger\r
- *\r
- * This function logs PHP generated error messages\r
- *\r
- * @access private\r
- * @param string the error severity\r
- * @param string the error string\r
- * @param string the error filepath\r
- * @param string the error line number\r
- * @return string\r
- */\r
- function log_exception($severity, $message, $filepath, $line)\r
- { \r
- $severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];\r
- \r
- log_message('error', 'Severity: '.$severity.' --> '.$message. ' '.$filepath.' '.$line, TRUE);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * 404 Page Not Found Handler\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function show_404($page = '')\r
- { \r
- $heading = "404 Page Not Found";\r
- $message = "The page you requested was not found.";\r
-\r
- log_message('error', '404 Page Not Found --> '.$page);\r
- echo $this->show_error($heading, $message, 'error_404');\r
- exit;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * General Error Page\r
- *\r
- * This function takes an error message as input\r
- * (either as a string or an array) and displays\r
- * it using the specified template.\r
- *\r
- * @access private\r
- * @param string the heading\r
- * @param string the message\r
- * @param string the template name\r
- * @return string\r
- */\r
- function show_error($heading, $message, $template = 'error_general')\r
- {\r
- $message = '<p>'.implode('</p><p>', ( ! is_array($message)) ? array($message) : $message).'</p>';\r
-\r
- if (ob_get_level() > $this->ob_level + 1)\r
- {\r
- ob_end_flush(); \r
- }\r
- ob_start();\r
- include(APPPATH.'errors/'.$template.EXT);\r
- $buffer = ob_get_contents();\r
- ob_end_clean();\r
- return $buffer;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Native PHP error handler\r
- *\r
- * @access private\r
- * @param string the error severity\r
- * @param string the error string\r
- * @param string the error filepath\r
- * @param string the error line number\r
- * @return string\r
- */\r
- function show_php_error($severity, $message, $filepath, $line)\r
- { \r
- $severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];\r
- \r
- $filepath = str_replace("\\", "/", $filepath);\r
- \r
- // For safety reasons we do not show the full file path\r
- if (FALSE !== strpos($filepath, '/'))\r
- {\r
- $x = explode('/', $filepath);\r
- $filepath = $x[count($x)-2].'/'.end($x);\r
- }\r
- \r
- if (ob_get_level() > $this->ob_level + 1)\r
- {\r
- ob_end_flush(); \r
- }\r
- ob_start();\r
- include(APPPATH.'errors/error_php'.EXT);\r
- $buffer = ob_get_contents();\r
- ob_end_clean();\r
- echo $buffer;\r
- }\r
-\r
-\r
-}\r
-// END Exceptions Class\r
-\r
-/* End of file Exceptions.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Exceptions Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Exceptions
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/exceptions.html
+ */
+class CI_Exceptions {
+ var $action;
+ var $severity;
+ var $message;
+ var $filename;
+ var $line;
+ var $ob_level;
+
+ var $levels = array(
+ E_ERROR => 'Error',
+ E_WARNING => 'Warning',
+ E_PARSE => 'Parsing Error',
+ E_NOTICE => 'Notice',
+ E_CORE_ERROR => 'Core Error',
+ E_CORE_WARNING => 'Core Warning',
+ E_COMPILE_ERROR => 'Compile Error',
+ E_COMPILE_WARNING => 'Compile Warning',
+ E_USER_ERROR => 'User Error',
+ E_USER_WARNING => 'User Warning',
+ E_USER_NOTICE => 'User Notice',
+ E_STRICT => 'Runtime Notice'
+ );
+
+
+ /**
+ * Constructor
+ *
+ */
+ function CI_Exceptions()
+ {
+ $this->ob_level = ob_get_level();
+ // Note: Do not log messages from this constructor.
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Exception Logger
+ *
+ * This function logs PHP generated error messages
+ *
+ * @access private
+ * @param string the error severity
+ * @param string the error string
+ * @param string the error filepath
+ * @param string the error line number
+ * @return string
+ */
+ function log_exception($severity, $message, $filepath, $line)
+ {
+ $severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];
+
+ log_message('error', 'Severity: '.$severity.' --> '.$message. ' '.$filepath.' '.$line, TRUE);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * 404 Page Not Found Handler
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function show_404($page = '')
+ {
+ $heading = "404 Page Not Found";
+ $message = "The page you requested was not found.";
+
+ log_message('error', '404 Page Not Found --> '.$page);
+ echo $this->show_error($heading, $message, 'error_404');
+ exit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * General Error Page
+ *
+ * This function takes an error message as input
+ * (either as a string or an array) and displays
+ * it using the specified template.
+ *
+ * @access private
+ * @param string the heading
+ * @param string the message
+ * @param string the template name
+ * @return string
+ */
+ function show_error($heading, $message, $template = 'error_general')
+ {
+ $message = '<p>'.implode('</p><p>', ( ! is_array($message)) ? array($message) : $message).'</p>';
+
+ if (ob_get_level() > $this->ob_level + 1)
+ {
+ ob_end_flush();
+ }
+ ob_start();
+ include(APPPATH.'errors/'.$template.EXT);
+ $buffer = ob_get_contents();
+ ob_end_clean();
+ return $buffer;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Native PHP error handler
+ *
+ * @access private
+ * @param string the error severity
+ * @param string the error string
+ * @param string the error filepath
+ * @param string the error line number
+ * @return string
+ */
+ function show_php_error($severity, $message, $filepath, $line)
+ {
+ $severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity];
+
+ $filepath = str_replace("\\", "/", $filepath);
+
+ // For safety reasons we do not show the full file path
+ if (FALSE !== strpos($filepath, '/'))
+ {
+ $x = explode('/', $filepath);
+ $filepath = $x[count($x)-2].'/'.end($x);
+ }
+
+ if (ob_get_level() > $this->ob_level + 1)
+ {
+ ob_end_flush();
+ }
+ ob_start();
+ include(APPPATH.'errors/error_php'.EXT);
+ $buffer = ob_get_contents();
+ ob_end_clean();
+ echo $buffer;
+ }
+
+
+}
+// END Exceptions Class
+
+/* End of file Exceptions.php */
/* Location: ./system/libraries/Exceptions.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Form Validation Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Validation\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/form_validation.html\r
- */\r
-class CI_Form_validation {\r
- \r
- var $CI;\r
- var $_field_data = array(); \r
- var $_config_rules = array();\r
- var $_error_array = array();\r
- var $_error_messages = array(); \r
- var $_error_prefix = '<p>';\r
- var $_error_suffix = '</p>';\r
- var $error_string = '';\r
- var $_safe_form_data = FALSE;\r
-\r
-\r
- /**\r
- * Constructor\r
- *\r
- */ \r
- function CI_Form_validation($rules = array())\r
- { \r
- $this->CI =& get_instance();\r
- \r
- // Validation rules can be stored in a config file.\r
- $this->_config_rules = $rules;\r
- \r
- // Automatically load the form helper\r
- $this->CI->load->helper('form');\r
-\r
- // Set the character encoding in MB.\r
- if (function_exists('mb_internal_encoding'))\r
- {\r
- mb_internal_encoding($this->CI->config->item('charset'));\r
- }\r
- \r
- log_message('debug', "Validation Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Rules\r
- *\r
- * This function takes an array of field names and validation\r
- * rules as input, validates the info, and stores it\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @return void\r
- */\r
- function set_rules($field, $label = '', $rules = '')\r
- {\r
- // No reason to set rules if we have no POST data\r
- if (count($_POST) == 0)\r
- {\r
- return;\r
- }\r
- \r
- // If an array was passed via the first parameter instead of indidual string\r
- // values we cycle through it and recursively call this function.\r
- if (is_array($field))\r
- {\r
- foreach ($field as $row)\r
- {\r
- // Houston, we have a problem...\r
- if ( ! isset($row['field']) OR ! isset($row['rules']))\r
- {\r
- continue;\r
- }\r
-\r
- // If the field label wasn't passed we use the field name\r
- $label = ( ! isset($row['label'])) ? $row['field'] : $row['label'];\r
-\r
- // Here we go!\r
- $this->set_rules($row['field'], $label, $row['rules']);\r
- }\r
- return;\r
- }\r
- \r
- // No fields? Nothing to do...\r
- if ( ! is_string($field) OR ! is_string($rules) OR $field == '')\r
- {\r
- return;\r
- }\r
-\r
- // If the field label wasn't passed we use the field name\r
- $label = ($label == '') ? $field : $label;\r
-\r
- // Is the field name an array? We test for the existence of a bracket "[" in\r
- // the field name to determine this. If it is an array, we break it apart\r
- // into its components so that we can fetch the corresponding POST data later \r
- if (strpos($field, '[') !== FALSE AND preg_match_all('/\[(.*?)\]/', $field, $matches))\r
- { \r
- // Note: Due to a bug in current() that affects some versions\r
- // of PHP we can not pass function call directly into it\r
- $x = explode('[', $field);\r
- $indexes[] = current($x);\r
-\r
- for ($i = 0; $i < count($matches['0']); $i++)\r
- {\r
- if ($matches['1'][$i] != '')\r
- {\r
- $indexes[] = $matches['1'][$i];\r
- }\r
- }\r
- \r
- $is_array = TRUE;\r
- }\r
- else\r
- {\r
- $indexes = array();\r
- $is_array = FALSE; \r
- }\r
- \r
- // Build our master array \r
- $this->_field_data[$field] = array(\r
- 'field' => $field, \r
- 'label' => $label, \r
- 'rules' => $rules,\r
- 'is_array' => $is_array,\r
- 'keys' => $indexes,\r
- 'postdata' => NULL,\r
- 'error' => ''\r
- );\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Error Message\r
- *\r
- * Lets users set their own error messages on the fly. Note: The key\r
- * name has to match the function name that it corresponds to.\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- function set_message($lang, $val = '')\r
- {\r
- if ( ! is_array($lang))\r
- {\r
- $lang = array($lang => $val);\r
- }\r
- \r
- $this->_error_messages = array_merge($this->_error_messages, $lang);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set The Error Delimiter\r
- *\r
- * Permits a prefix/suffix to be added to each error message\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return void\r
- */ \r
- function set_error_delimiters($prefix = '<p>', $suffix = '</p>')\r
- {\r
- $this->_error_prefix = $prefix;\r
- $this->_error_suffix = $suffix;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get Error Message\r
- *\r
- * Gets the error message associated with a particular field\r
- *\r
- * @access public\r
- * @param string the field name\r
- * @return void\r
- */ \r
- function error($field = '', $prefix = '', $suffix = '')\r
- { \r
- if ( ! isset($this->_field_data[$field]['error']) OR $this->_field_data[$field]['error'] == '')\r
- {\r
- return '';\r
- }\r
- \r
- if ($prefix == '')\r
- {\r
- $prefix = $this->_error_prefix;\r
- }\r
-\r
- if ($suffix == '')\r
- {\r
- $suffix = $this->_error_suffix;\r
- }\r
-\r
- return $prefix.$this->_field_data[$field]['error'].$suffix;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Error String\r
- *\r
- * Returns the error messages as a string, wrapped in the error delimiters\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return str\r
- */ \r
- function error_string($prefix = '', $suffix = '')\r
- {\r
- // No errrors, validation passes!\r
- if (count($this->_error_array) === 0)\r
- {\r
- return '';\r
- }\r
- \r
- if ($prefix == '')\r
- {\r
- $prefix = $this->_error_prefix;\r
- }\r
-\r
- if ($suffix == '')\r
- {\r
- $suffix = $this->_error_suffix;\r
- }\r
- \r
- // Generate the error string\r
- $str = '';\r
- foreach ($this->_error_array as $val)\r
- {\r
- if ($val != '')\r
- {\r
- $str .= $prefix.$val.$suffix."\n";\r
- }\r
- }\r
- \r
- return $str;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Run the Validator\r
- *\r
- * This function does all the work.\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function run($group = '')\r
- {\r
- // Do we even have any data to process? Mm?\r
- if (count($_POST) == 0)\r
- {\r
- return FALSE;\r
- }\r
- \r
- // Does the _field_data array containing the validation rules exist?\r
- // If not, we look to see if they were assigned via a config file\r
- if (count($this->_field_data) == 0)\r
- {\r
- // No validation rules? We're done...\r
- if (count($this->_config_rules) == 0)\r
- {\r
- return FALSE;\r
- }\r
- \r
- // Is there a validation rule for the particular URI being accessed?\r
- $uri = ($group == '') ? trim($this->CI->uri->ruri_string(), '/') : $group;\r
- \r
- if ($uri != '' AND isset($this->_config_rules[$uri]))\r
- {\r
- $this->set_rules($this->_config_rules[$uri]);\r
- }\r
- else\r
- {\r
- $this->set_rules($this->_config_rules);\r
- }\r
- \r
- // We're we able to set the rules correctly?\r
- if (count($this->_field_data) == 0)\r
- {\r
- log_message('debug', "Unable to find validation rules");\r
- return FALSE;\r
- }\r
- }\r
- \r
- // Load the language file containing error messages\r
- $this->CI->lang->load('form_validation');\r
- \r
- // Cycle through the rules for each field, match the \r
- // corresponding $_POST item and test for errors\r
- foreach ($this->_field_data as $field => $row)\r
- { \r
- // Fetch the data from the corresponding $_POST array and cache it in the _field_data array.\r
- // Depending on whether the field name is an array or a string will determine where we get it from.\r
- \r
- if ($row['is_array'] == TRUE)\r
- {\r
- $this->_field_data[$field]['postdata'] = $this->_reduce_array($_POST, $row['keys']);\r
- }\r
- else\r
- {\r
- if (isset($_POST[$field]) AND $_POST[$field] != "")\r
- {\r
- $this->_field_data[$field]['postdata'] = $_POST[$field];\r
- }\r
- }\r
- \r
- $this->_execute($row, explode('|', $row['rules']), $this->_field_data[$field]['postdata']); \r
- }\r
-\r
- // Did we end up with any errors?\r
- $total_errors = count($this->_error_array);\r
-\r
- if ($total_errors > 0)\r
- {\r
- $this->_safe_form_data = TRUE;\r
- }\r
-\r
- // Now we need to re-set the POST data with the new, processed data\r
- $this->_reset_post_array();\r
- \r
- // No errors, validation passes!\r
- if ($total_errors == 0)\r
- {\r
- return TRUE;\r
- }\r
-\r
- // Validation fails\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Traverse a multidimensional $_POST array index until the data is found\r
- *\r
- * @access private\r
- * @param array\r
- * @param array\r
- * @param integer\r
- * @return mixed\r
- */ \r
- function _reduce_array($array, $keys, $i = 0)\r
- {\r
- if (is_array($array))\r
- {\r
- if (isset($keys[$i]))\r
- {\r
- if (isset($array[$keys[$i]]))\r
- {\r
- $array = $this->_reduce_array($array[$keys[$i]], $keys, ($i+1));\r
- }\r
- else\r
- {\r
- return NULL;\r
- }\r
- }\r
- else\r
- {\r
- return $array;\r
- }\r
- }\r
- \r
- return $array;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Re-populate the _POST array with our finalized and processed data\r
- *\r
- * @access private\r
- * @return null\r
- */ \r
- function _reset_post_array()\r
- {\r
- foreach ($this->_field_data as $field => $row)\r
- {\r
- if ( ! is_null($row['postdata']))\r
- {\r
- if ($row['is_array'] == FALSE)\r
- {\r
- if (isset($_POST[$row['field']]))\r
- {\r
- $_POST[$row['field']] = $this->prep_for_form($row['postdata']);\r
- }\r
- }\r
- else\r
- {\r
- $post = '$_POST["';\r
- \r
- if (count($row['keys']) == 1)\r
- {\r
- $post .= current($row['keys']);\r
- $post .= '"]';\r
- }\r
- else\r
- {\r
- $i = 0;\r
- foreach ($row['keys'] as $val)\r
- {\r
- if ($i == 0)\r
- {\r
- $post .= $val.'"]';\r
- $i++;\r
- continue;\r
- }\r
- \r
- $post .= '["'.$val.'"]';\r
- }\r
- }\r
- \r
- if (is_array($row['postdata']))\r
- { \r
- $array = array();\r
- foreach ($row['postdata'] as $k => $v)\r
- {\r
- $array[$k] = $this->prep_for_form($v);\r
- }\r
- \r
- $post .= ' = $array;';\r
- }\r
- else\r
- { \r
- $post .= ' = "'.$this->prep_for_form($row['postdata']).'";';\r
- }\r
-\r
- eval($post);\r
- }\r
- }\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Executes the Validation routines\r
- *\r
- * @access private\r
- * @param array\r
- * @param array\r
- * @param mixed\r
- * @param integer\r
- * @return mixed\r
- */ \r
- function _execute($row, $rules, $postdata = NULL, $cycles = 0)\r
- {\r
- // If the $_POST data is an array we will run a recursive call\r
- if (is_array($postdata))\r
- { \r
- foreach ($postdata as $key => $val)\r
- {\r
- $this->_execute($row, $rules, $val, $cycles);\r
- $cycles++;\r
- }\r
- \r
- return;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- // If the field is blank, but NOT required, no further tests are necessary\r
- $callback = FALSE;\r
- if ( ! in_array('required', $rules) AND is_null($postdata))\r
- {\r
- // Before we bail out, does the rule contain a callback?\r
- if (preg_match("/(callback_\w+)/", implode(' ', $rules), $match))\r
- {\r
- $callback = TRUE;\r
- $rules = (array('1' => $match[1]));\r
- }\r
- else\r
- {\r
- return;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- // Isset Test. Typically this rule will only apply to checkboxes.\r
- if (is_null($postdata) AND $callback == FALSE)\r
- {\r
- if (in_array('isset', $rules, TRUE) OR in_array('required', $rules))\r
- {\r
- // Set the message type\r
- $type = (in_array('required', $rules)) ? 'required' : 'isset';\r
- \r
- if ( ! isset($this->_error_messages[$type]))\r
- {\r
- if (FALSE === ($line = $this->CI->lang->line($type)))\r
- {\r
- $line = 'The field was not set';\r
- } \r
- }\r
- else\r
- {\r
- $line = $this->_error_messages[$type];\r
- }\r
- \r
- // Build the error message\r
- $message = sprintf($line, $this->_translate_fieldname($row['label']));\r
-\r
- // Save the error message\r
- $this->_field_data[$row['field']]['error'] = $message;\r
- \r
- if ( ! isset($this->_error_array[$row['field']]))\r
- {\r
- $this->_error_array[$row['field']] = $message;\r
- }\r
- }\r
- \r
- return;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- // Cycle through each rule and run it\r
- foreach ($rules As $rule)\r
- {\r
- $_in_array = FALSE;\r
- \r
- // We set the $postdata variable with the current data in our master array so that\r
- // each cycle of the loop is dealing with the processed data from the last cycle\r
- if ($row['is_array'] == TRUE AND is_array($this->_field_data[$row['field']]['postdata']))\r
- {\r
- // We shouldn't need this safety, but just in case there isn't an array index\r
- // associated with this cycle we'll bail out\r
- if ( ! isset($this->_field_data[$row['field']]['postdata'][$cycles]))\r
- {\r
- continue;\r
- }\r
- \r
- $postdata = $this->_field_data[$row['field']]['postdata'][$cycles];\r
- $_in_array = TRUE;\r
- }\r
- else\r
- {\r
- $postdata = $this->_field_data[$row['field']]['postdata'];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- // Is the rule a callback? \r
- $callback = FALSE;\r
- if (substr($rule, 0, 9) == 'callback_')\r
- {\r
- $rule = substr($rule, 9);\r
- $callback = TRUE;\r
- }\r
- \r
- // Strip the parameter (if exists) from the rule\r
- // Rules can contain a parameter: max_length[5]\r
- $param = FALSE;\r
- if (preg_match("/(.*?)\[(.*?)\]/", $rule, $match))\r
- {\r
- $rule = $match[1];\r
- $param = $match[2];\r
- }\r
- \r
- // Call the function that corresponds to the rule\r
- if ($callback === TRUE)\r
- {\r
- if ( ! method_exists($this->CI, $rule))\r
- { \r
- continue;\r
- }\r
- \r
- // Run the function and grab the result\r
- $result = $this->CI->$rule($postdata, $param);\r
-\r
- // Re-assign the result to the master data array\r
- if ($_in_array == TRUE)\r
- {\r
- $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result;\r
- }\r
- else\r
- {\r
- $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result;\r
- }\r
- \r
- // If the field isn't required and we just processed a callback we'll move on...\r
- if ( ! in_array('required', $rules, TRUE) AND $result !== FALSE)\r
- {\r
- return;\r
- }\r
- }\r
- else\r
- { \r
- if ( ! method_exists($this, $rule))\r
- {\r
- // If our own wrapper function doesn't exist we see if a native PHP function does. \r
- // Users can use any native PHP function call that has one param.\r
- if (function_exists($rule))\r
- {\r
- $result = $rule($postdata);\r
- \r
- if ($_in_array == TRUE)\r
- {\r
- $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result;\r
- }\r
- else\r
- {\r
- $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result;\r
- }\r
- }\r
- \r
- continue;\r
- }\r
-\r
- $result = $this->$rule($postdata, $param);\r
-\r
- if ($_in_array == TRUE)\r
- {\r
- $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result;\r
- }\r
- else\r
- {\r
- $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result;\r
- }\r
- }\r
- \r
- // Did the rule test negatively? If so, grab the error.\r
- if ($result === FALSE)\r
- { \r
- if ( ! isset($this->_error_messages[$rule]))\r
- {\r
- if (FALSE === ($line = $this->CI->lang->line($rule)))\r
- {\r
- $line = 'Unable to access an error message corresponding to your field name.';\r
- } \r
- }\r
- else\r
- {\r
- $line = $this->_error_messages[$rule];\r
- }\r
-\r
- // Build the error message\r
- $message = sprintf($line, $this->_translate_fieldname($row['label']), $param);\r
-\r
- // Save the error message\r
- $this->_field_data[$row['field']]['error'] = $message;\r
- \r
- if ( ! isset($this->_error_array[$row['field']]))\r
- {\r
- $this->_error_array[$row['field']] = $message;\r
- }\r
- \r
- return;\r
- }\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Translate a field name\r
- *\r
- * @access private\r
- * @param string the field name\r
- * @return string\r
- */ \r
- function _translate_fieldname($fieldname)\r
- {\r
- // Do we need to translate the field name?\r
- // We look for the prefix lang: to determine this\r
- if (substr($fieldname, 0, 5) == 'lang:')\r
- {\r
- // Grab the variable\r
- $line = substr($fieldname, 5); \r
- \r
- // Were we able to translate the field name? If not we use $line\r
- if (FALSE === ($fieldname = $this->CI->lang->line($line)))\r
- {\r
- return $line;\r
- }\r
- }\r
-\r
- return $fieldname;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get the value from a form\r
- *\r
- * Permits you to repopulate a form field with the value it was submitted\r
- * with, or, if that value doesn't exist, with the default\r
- *\r
- * @access public\r
- * @param string the field name\r
- * @param string\r
- * @return void\r
- */ \r
- function set_value($field = '', $default = '')\r
- {\r
- if ( ! isset($this->_field_data[$field]))\r
- {\r
- return $default;\r
- }\r
- \r
- return $this->_field_data[$field]['postdata'];\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Select\r
- *\r
- * Enables pull-down lists to be set to the value the user\r
- * selected in the event of an error\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */ \r
- function set_select($field = '', $value = '', $default = FALSE)\r
- { \r
- if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata']))\r
- {\r
- if ($default === TRUE AND count($this->_field_data) === 0)\r
- {\r
- return ' selected="selected"';\r
- }\r
- return '';\r
- }\r
- \r
- $field = $this->_field_data[$field]['postdata'];\r
- \r
- if (is_array($field))\r
- {\r
- if ( ! in_array($value, $field))\r
- {\r
- return '';\r
- }\r
- }\r
- else\r
- {\r
- if (($field == '' OR $value == '') OR ($field != $value))\r
- {\r
- return '';\r
- }\r
- }\r
- \r
- return ' selected="selected"';\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Radio\r
- *\r
- * Enables radio buttons to be set to the value the user\r
- * selected in the event of an error\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */ \r
- function set_radio($field = '', $value = '', $default = FALSE)\r
- {\r
- if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata']))\r
- {\r
- if ($default === TRUE AND count($this->_field_data) === 0)\r
- {\r
- return ' checked="checked"';\r
- }\r
- return '';\r
- }\r
- \r
- $field = $this->_field_data[$field]['postdata'];\r
- \r
- if (is_array($field))\r
- {\r
- if ( ! in_array($value, $field))\r
- {\r
- return '';\r
- }\r
- }\r
- else\r
- {\r
- if (($field == '' OR $value == '') OR ($field != $value))\r
- {\r
- return '';\r
- }\r
- }\r
- \r
- return ' checked="checked"';\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Checkbox\r
- *\r
- * Enables checkboxes to be set to the value the user\r
- * selected in the event of an error\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */ \r
- function set_checkbox($field = '', $value = '', $default = FALSE)\r
- {\r
- if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata']))\r
- {\r
- if ($default === TRUE AND count($this->_field_data) === 0)\r
- {\r
- return ' checked="checked"';\r
- }\r
- return '';\r
- }\r
- \r
- $field = $this->_field_data[$field]['postdata'];\r
- \r
- if (is_array($field))\r
- {\r
- if ( ! in_array($value, $field))\r
- {\r
- return '';\r
- }\r
- }\r
- else\r
- {\r
- if (($field == '' OR $value == '') OR ($field != $value))\r
- {\r
- return '';\r
- }\r
- }\r
- \r
- return ' checked="checked"';\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Required\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
- function required($str)\r
- {\r
- if ( ! is_array($str))\r
- {\r
- return (trim($str) == '') ? FALSE : TRUE;\r
- }\r
- else\r
- {\r
- return ( ! empty($str));\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Match one field to another\r
- *\r
- * @access public\r
- * @param string\r
- * @param field\r
- * @return bool\r
- */\r
- function matches($str, $field)\r
- {\r
- if ( ! isset($_POST[$field]))\r
- {\r
- return FALSE; \r
- }\r
- \r
- $field = $_POST[$field];\r
-\r
- return ($str !== $field) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Minimum Length\r
- *\r
- * @access public\r
- * @param string\r
- * @param value\r
- * @return bool\r
- */ \r
- function min_length($str, $val)\r
- {\r
- if (preg_match("/[^0-9]/", $val))\r
- {\r
- return FALSE;\r
- }\r
-\r
- if (function_exists('mb_strlen'))\r
- {\r
- return (mb_strlen($str) < $val) ? FALSE : TRUE; \r
- }\r
- \r
- return (strlen($str) < $val) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Max Length\r
- *\r
- * @access public\r
- * @param string\r
- * @param value\r
- * @return bool\r
- */ \r
- function max_length($str, $val)\r
- {\r
- if (preg_match("/[^0-9]/", $val))\r
- {\r
- return FALSE;\r
- }\r
-\r
- if (function_exists('mb_strlen'))\r
- {\r
- return (mb_strlen($str) > $val) ? FALSE : TRUE; \r
- }\r
- \r
- return (strlen($str) > $val) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Exact Length\r
- *\r
- * @access public\r
- * @param string\r
- * @param value\r
- * @return bool\r
- */ \r
- function exact_length($str, $val)\r
- {\r
- if (preg_match("/[^0-9]/", $val))\r
- {\r
- return FALSE;\r
- }\r
-\r
- if (function_exists('mb_strlen'))\r
- {\r
- return (mb_strlen($str) != $val) ? FALSE : TRUE; \r
- }\r
- \r
- return (strlen($str) != $val) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Valid Email\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function valid_email($str)\r
- {\r
- return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Valid Emails\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function valid_emails($str)\r
- {\r
- if (strpos($str, ',') === FALSE)\r
- {\r
- return $this->valid_email(trim($str));\r
- }\r
- \r
- foreach(explode(',', $str) as $email)\r
- {\r
- if (trim($email) != '' && $this->valid_email(trim($email)) === FALSE)\r
- {\r
- return FALSE;\r
- }\r
- }\r
- \r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Validate IP Address\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function valid_ip($ip)\r
- {\r
- return $this->CI->input->valid_ip($ip);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Alpha\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function alpha($str)\r
- {\r
- return ( ! preg_match("/^([a-z])+$/i", $str)) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Alpha-numeric\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function alpha_numeric($str)\r
- {\r
- return ( ! preg_match("/^([a-z0-9])+$/i", $str)) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Alpha-numeric with underscores and dashes\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function alpha_dash($str)\r
- {\r
- return ( ! preg_match("/^([-a-z0-9_-])+$/i", $str)) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Numeric\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function numeric($str)\r
- {\r
- return (bool)preg_match( '/^[\-+]?[0-9]*\.?[0-9]+$/', $str);\r
-\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Is Numeric\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
- function is_numeric($str)\r
- {\r
- return ( ! is_numeric($str)) ? FALSE : TRUE;\r
- } \r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Integer\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function integer($str)\r
- {\r
- return (bool)preg_match( '/^[\-+]?[0-9]+$/', $str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Is a Natural number (0,1,2,3, etc.)\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
- function is_natural($str)\r
- { \r
- return (bool)preg_match( '/^[0-9]+$/', $str);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Is a Natural number, but not a zero (1,2,3, etc.)\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
- function is_natural_no_zero($str)\r
- {\r
- if ( ! preg_match( '/^[0-9]+$/', $str))\r
- {\r
- return FALSE;\r
- }\r
- \r
- if ($str == 0)\r
- {\r
- return FALSE;\r
- }\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Valid Base64\r
- *\r
- * Tests a string for characters outside of the Base64 alphabet\r
- * as defined by RFC 2045 http://www.faqs.org/rfcs/rfc2045\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
- function valid_base64($str)\r
- {\r
- return (bool) ! preg_match('/[^a-zA-Z0-9\/\+=]/', $str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Prep data for form\r
- *\r
- * This function allows HTML to be safely shown in a form.\r
- * Special characters are converted.\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function prep_for_form($data = '')\r
- {\r
- if (is_array($data))\r
- {\r
- foreach ($data as $key => $val)\r
- {\r
- $data[$key] = $this->prep_for_form($val);\r
- }\r
- \r
- return $data;\r
- }\r
- \r
- if ($this->_safe_form_data == FALSE OR $data === '')\r
- {\r
- return $data;\r
- }\r
-\r
- return str_replace(array("'", '"', '<', '>'), array("'", """, '<', '>'), stripslashes($data));\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Prep URL\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function prep_url($str = '')\r
- {\r
- if ($str == 'http://' OR $str == '')\r
- {\r
- return '';\r
- }\r
- \r
- if (substr($str, 0, 7) != 'http://' && substr($str, 0, 8) != 'https://')\r
- {\r
- $str = 'http://'.$str;\r
- }\r
- \r
- return $str;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Strip Image Tags\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function strip_image_tags($str)\r
- {\r
- return $this->CI->input->strip_image_tags($str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * XSS Clean\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function xss_clean($str)\r
- {\r
- return $this->CI->input->xss_clean($str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Convert PHP tags to entities\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function encode_php_tags($str)\r
- {\r
- return str_replace(array('<?php', '<?PHP', '<?', '?>'), array('<?php', '<?PHP', '<?', '?>'), $str);\r
- }\r
-\r
-}\r
-// END Form Validation Class\r
-\r
-/* End of file Form_validation.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Form Validation Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Validation
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/form_validation.html
+ */
+class CI_Form_validation {
+
+ var $CI;
+ var $_field_data = array();
+ var $_config_rules = array();
+ var $_error_array = array();
+ var $_error_messages = array();
+ var $_error_prefix = '<p>';
+ var $_error_suffix = '</p>';
+ var $error_string = '';
+ var $_safe_form_data = FALSE;
+
+
+ /**
+ * Constructor
+ *
+ */
+ function CI_Form_validation($rules = array())
+ {
+ $this->CI =& get_instance();
+
+ // Validation rules can be stored in a config file.
+ $this->_config_rules = $rules;
+
+ // Automatically load the form helper
+ $this->CI->load->helper('form');
+
+ // Set the character encoding in MB.
+ if (function_exists('mb_internal_encoding'))
+ {
+ mb_internal_encoding($this->CI->config->item('charset'));
+ }
+
+ log_message('debug', "Validation Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Rules
+ *
+ * This function takes an array of field names and validation
+ * rules as input, validates the info, and stores it
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @return void
+ */
+ function set_rules($field, $label = '', $rules = '')
+ {
+ // No reason to set rules if we have no POST data
+ if (count($_POST) == 0)
+ {
+ return;
+ }
+
+ // If an array was passed via the first parameter instead of indidual string
+ // values we cycle through it and recursively call this function.
+ if (is_array($field))
+ {
+ foreach ($field as $row)
+ {
+ // Houston, we have a problem...
+ if ( ! isset($row['field']) OR ! isset($row['rules']))
+ {
+ continue;
+ }
+
+ // If the field label wasn't passed we use the field name
+ $label = ( ! isset($row['label'])) ? $row['field'] : $row['label'];
+
+ // Here we go!
+ $this->set_rules($row['field'], $label, $row['rules']);
+ }
+ return;
+ }
+
+ // No fields? Nothing to do...
+ if ( ! is_string($field) OR ! is_string($rules) OR $field == '')
+ {
+ return;
+ }
+
+ // If the field label wasn't passed we use the field name
+ $label = ($label == '') ? $field : $label;
+
+ // Is the field name an array? We test for the existence of a bracket "[" in
+ // the field name to determine this. If it is an array, we break it apart
+ // into its components so that we can fetch the corresponding POST data later
+ if (strpos($field, '[') !== FALSE AND preg_match_all('/\[(.*?)\]/', $field, $matches))
+ {
+ // Note: Due to a bug in current() that affects some versions
+ // of PHP we can not pass function call directly into it
+ $x = explode('[', $field);
+ $indexes[] = current($x);
+
+ for ($i = 0; $i < count($matches['0']); $i++)
+ {
+ if ($matches['1'][$i] != '')
+ {
+ $indexes[] = $matches['1'][$i];
+ }
+ }
+
+ $is_array = TRUE;
+ }
+ else
+ {
+ $indexes = array();
+ $is_array = FALSE;
+ }
+
+ // Build our master array
+ $this->_field_data[$field] = array(
+ 'field' => $field,
+ 'label' => $label,
+ 'rules' => $rules,
+ 'is_array' => $is_array,
+ 'keys' => $indexes,
+ 'postdata' => NULL,
+ 'error' => ''
+ );
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Error Message
+ *
+ * Lets users set their own error messages on the fly. Note: The key
+ * name has to match the function name that it corresponds to.
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function set_message($lang, $val = '')
+ {
+ if ( ! is_array($lang))
+ {
+ $lang = array($lang => $val);
+ }
+
+ $this->_error_messages = array_merge($this->_error_messages, $lang);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set The Error Delimiter
+ *
+ * Permits a prefix/suffix to be added to each error message
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return void
+ */
+ function set_error_delimiters($prefix = '<p>', $suffix = '</p>')
+ {
+ $this->_error_prefix = $prefix;
+ $this->_error_suffix = $suffix;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Error Message
+ *
+ * Gets the error message associated with a particular field
+ *
+ * @access public
+ * @param string the field name
+ * @return void
+ */
+ function error($field = '', $prefix = '', $suffix = '')
+ {
+ if ( ! isset($this->_field_data[$field]['error']) OR $this->_field_data[$field]['error'] == '')
+ {
+ return '';
+ }
+
+ if ($prefix == '')
+ {
+ $prefix = $this->_error_prefix;
+ }
+
+ if ($suffix == '')
+ {
+ $suffix = $this->_error_suffix;
+ }
+
+ return $prefix.$this->_field_data[$field]['error'].$suffix;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Error String
+ *
+ * Returns the error messages as a string, wrapped in the error delimiters
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return str
+ */
+ function error_string($prefix = '', $suffix = '')
+ {
+ // No errrors, validation passes!
+ if (count($this->_error_array) === 0)
+ {
+ return '';
+ }
+
+ if ($prefix == '')
+ {
+ $prefix = $this->_error_prefix;
+ }
+
+ if ($suffix == '')
+ {
+ $suffix = $this->_error_suffix;
+ }
+
+ // Generate the error string
+ $str = '';
+ foreach ($this->_error_array as $val)
+ {
+ if ($val != '')
+ {
+ $str .= $prefix.$val.$suffix."\n";
+ }
+ }
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Run the Validator
+ *
+ * This function does all the work.
+ *
+ * @access public
+ * @return bool
+ */
+ function run($group = '')
+ {
+ // Do we even have any data to process? Mm?
+ if (count($_POST) == 0)
+ {
+ return FALSE;
+ }
+
+ // Does the _field_data array containing the validation rules exist?
+ // If not, we look to see if they were assigned via a config file
+ if (count($this->_field_data) == 0)
+ {
+ // No validation rules? We're done...
+ if (count($this->_config_rules) == 0)
+ {
+ return FALSE;
+ }
+
+ // Is there a validation rule for the particular URI being accessed?
+ $uri = ($group == '') ? trim($this->CI->uri->ruri_string(), '/') : $group;
+
+ if ($uri != '' AND isset($this->_config_rules[$uri]))
+ {
+ $this->set_rules($this->_config_rules[$uri]);
+ }
+ else
+ {
+ $this->set_rules($this->_config_rules);
+ }
+
+ // We're we able to set the rules correctly?
+ if (count($this->_field_data) == 0)
+ {
+ log_message('debug', "Unable to find validation rules");
+ return FALSE;
+ }
+ }
+
+ // Load the language file containing error messages
+ $this->CI->lang->load('form_validation');
+
+ // Cycle through the rules for each field, match the
+ // corresponding $_POST item and test for errors
+ foreach ($this->_field_data as $field => $row)
+ {
+ // Fetch the data from the corresponding $_POST array and cache it in the _field_data array.
+ // Depending on whether the field name is an array or a string will determine where we get it from.
+
+ if ($row['is_array'] == TRUE)
+ {
+ $this->_field_data[$field]['postdata'] = $this->_reduce_array($_POST, $row['keys']);
+ }
+ else
+ {
+ if (isset($_POST[$field]) AND $_POST[$field] != "")
+ {
+ $this->_field_data[$field]['postdata'] = $_POST[$field];
+ }
+ }
+
+ $this->_execute($row, explode('|', $row['rules']), $this->_field_data[$field]['postdata']);
+ }
+
+ // Did we end up with any errors?
+ $total_errors = count($this->_error_array);
+
+ if ($total_errors > 0)
+ {
+ $this->_safe_form_data = TRUE;
+ }
+
+ // Now we need to re-set the POST data with the new, processed data
+ $this->_reset_post_array();
+
+ // No errors, validation passes!
+ if ($total_errors == 0)
+ {
+ return TRUE;
+ }
+
+ // Validation fails
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Traverse a multidimensional $_POST array index until the data is found
+ *
+ * @access private
+ * @param array
+ * @param array
+ * @param integer
+ * @return mixed
+ */
+ function _reduce_array($array, $keys, $i = 0)
+ {
+ if (is_array($array))
+ {
+ if (isset($keys[$i]))
+ {
+ if (isset($array[$keys[$i]]))
+ {
+ $array = $this->_reduce_array($array[$keys[$i]], $keys, ($i+1));
+ }
+ else
+ {
+ return NULL;
+ }
+ }
+ else
+ {
+ return $array;
+ }
+ }
+
+ return $array;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Re-populate the _POST array with our finalized and processed data
+ *
+ * @access private
+ * @return null
+ */
+ function _reset_post_array()
+ {
+ foreach ($this->_field_data as $field => $row)
+ {
+ if ( ! is_null($row['postdata']))
+ {
+ if ($row['is_array'] == FALSE)
+ {
+ if (isset($_POST[$row['field']]))
+ {
+ $_POST[$row['field']] = $this->prep_for_form($row['postdata']);
+ }
+ }
+ else
+ {
+ $post = '$_POST["';
+
+ if (count($row['keys']) == 1)
+ {
+ $post .= current($row['keys']);
+ $post .= '"]';
+ }
+ else
+ {
+ $i = 0;
+ foreach ($row['keys'] as $val)
+ {
+ if ($i == 0)
+ {
+ $post .= $val.'"]';
+ $i++;
+ continue;
+ }
+
+ $post .= '["'.$val.'"]';
+ }
+ }
+
+ if (is_array($row['postdata']))
+ {
+ $array = array();
+ foreach ($row['postdata'] as $k => $v)
+ {
+ $array[$k] = $this->prep_for_form($v);
+ }
+
+ $post .= ' = $array;';
+ }
+ else
+ {
+ $post .= ' = "'.$this->prep_for_form($row['postdata']).'";';
+ }
+
+ eval($post);
+ }
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Executes the Validation routines
+ *
+ * @access private
+ * @param array
+ * @param array
+ * @param mixed
+ * @param integer
+ * @return mixed
+ */
+ function _execute($row, $rules, $postdata = NULL, $cycles = 0)
+ {
+ // If the $_POST data is an array we will run a recursive call
+ if (is_array($postdata))
+ {
+ foreach ($postdata as $key => $val)
+ {
+ $this->_execute($row, $rules, $val, $cycles);
+ $cycles++;
+ }
+
+ return;
+ }
+
+ // --------------------------------------------------------------------
+
+ // If the field is blank, but NOT required, no further tests are necessary
+ $callback = FALSE;
+ if ( ! in_array('required', $rules) AND is_null($postdata))
+ {
+ // Before we bail out, does the rule contain a callback?
+ if (preg_match("/(callback_\w+)/", implode(' ', $rules), $match))
+ {
+ $callback = TRUE;
+ $rules = (array('1' => $match[1]));
+ }
+ else
+ {
+ return;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ // Isset Test. Typically this rule will only apply to checkboxes.
+ if (is_null($postdata) AND $callback == FALSE)
+ {
+ if (in_array('isset', $rules, TRUE) OR in_array('required', $rules))
+ {
+ // Set the message type
+ $type = (in_array('required', $rules)) ? 'required' : 'isset';
+
+ if ( ! isset($this->_error_messages[$type]))
+ {
+ if (FALSE === ($line = $this->CI->lang->line($type)))
+ {
+ $line = 'The field was not set';
+ }
+ }
+ else
+ {
+ $line = $this->_error_messages[$type];
+ }
+
+ // Build the error message
+ $message = sprintf($line, $this->_translate_fieldname($row['label']));
+
+ // Save the error message
+ $this->_field_data[$row['field']]['error'] = $message;
+
+ if ( ! isset($this->_error_array[$row['field']]))
+ {
+ $this->_error_array[$row['field']] = $message;
+ }
+ }
+
+ return;
+ }
+
+ // --------------------------------------------------------------------
+
+ // Cycle through each rule and run it
+ foreach ($rules As $rule)
+ {
+ $_in_array = FALSE;
+
+ // We set the $postdata variable with the current data in our master array so that
+ // each cycle of the loop is dealing with the processed data from the last cycle
+ if ($row['is_array'] == TRUE AND is_array($this->_field_data[$row['field']]['postdata']))
+ {
+ // We shouldn't need this safety, but just in case there isn't an array index
+ // associated with this cycle we'll bail out
+ if ( ! isset($this->_field_data[$row['field']]['postdata'][$cycles]))
+ {
+ continue;
+ }
+
+ $postdata = $this->_field_data[$row['field']]['postdata'][$cycles];
+ $_in_array = TRUE;
+ }
+ else
+ {
+ $postdata = $this->_field_data[$row['field']]['postdata'];
+ }
+
+ // --------------------------------------------------------------------
+
+ // Is the rule a callback?
+ $callback = FALSE;
+ if (substr($rule, 0, 9) == 'callback_')
+ {
+ $rule = substr($rule, 9);
+ $callback = TRUE;
+ }
+
+ // Strip the parameter (if exists) from the rule
+ // Rules can contain a parameter: max_length[5]
+ $param = FALSE;
+ if (preg_match("/(.*?)\[(.*?)\]/", $rule, $match))
+ {
+ $rule = $match[1];
+ $param = $match[2];
+ }
+
+ // Call the function that corresponds to the rule
+ if ($callback === TRUE)
+ {
+ if ( ! method_exists($this->CI, $rule))
+ {
+ continue;
+ }
+
+ // Run the function and grab the result
+ $result = $this->CI->$rule($postdata, $param);
+
+ // Re-assign the result to the master data array
+ if ($_in_array == TRUE)
+ {
+ $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result;
+ }
+ else
+ {
+ $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result;
+ }
+
+ // If the field isn't required and we just processed a callback we'll move on...
+ if ( ! in_array('required', $rules, TRUE) AND $result !== FALSE)
+ {
+ return;
+ }
+ }
+ else
+ {
+ if ( ! method_exists($this, $rule))
+ {
+ // If our own wrapper function doesn't exist we see if a native PHP function does.
+ // Users can use any native PHP function call that has one param.
+ if (function_exists($rule))
+ {
+ $result = $rule($postdata);
+
+ if ($_in_array == TRUE)
+ {
+ $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result;
+ }
+ else
+ {
+ $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result;
+ }
+ }
+
+ continue;
+ }
+
+ $result = $this->$rule($postdata, $param);
+
+ if ($_in_array == TRUE)
+ {
+ $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result;
+ }
+ else
+ {
+ $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result;
+ }
+ }
+
+ // Did the rule test negatively? If so, grab the error.
+ if ($result === FALSE)
+ {
+ if ( ! isset($this->_error_messages[$rule]))
+ {
+ if (FALSE === ($line = $this->CI->lang->line($rule)))
+ {
+ $line = 'Unable to access an error message corresponding to your field name.';
+ }
+ }
+ else
+ {
+ $line = $this->_error_messages[$rule];
+ }
+
+ // Build the error message
+ $message = sprintf($line, $this->_translate_fieldname($row['label']), $param);
+
+ // Save the error message
+ $this->_field_data[$row['field']]['error'] = $message;
+
+ if ( ! isset($this->_error_array[$row['field']]))
+ {
+ $this->_error_array[$row['field']] = $message;
+ }
+
+ return;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Translate a field name
+ *
+ * @access private
+ * @param string the field name
+ * @return string
+ */
+ function _translate_fieldname($fieldname)
+ {
+ // Do we need to translate the field name?
+ // We look for the prefix lang: to determine this
+ if (substr($fieldname, 0, 5) == 'lang:')
+ {
+ // Grab the variable
+ $line = substr($fieldname, 5);
+
+ // Were we able to translate the field name? If not we use $line
+ if (FALSE === ($fieldname = $this->CI->lang->line($line)))
+ {
+ return $line;
+ }
+ }
+
+ return $fieldname;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get the value from a form
+ *
+ * Permits you to repopulate a form field with the value it was submitted
+ * with, or, if that value doesn't exist, with the default
+ *
+ * @access public
+ * @param string the field name
+ * @param string
+ * @return void
+ */
+ function set_value($field = '', $default = '')
+ {
+ if ( ! isset($this->_field_data[$field]))
+ {
+ return $default;
+ }
+
+ return $this->_field_data[$field]['postdata'];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Select
+ *
+ * Enables pull-down lists to be set to the value the user
+ * selected in the event of an error
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function set_select($field = '', $value = '', $default = FALSE)
+ {
+ if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata']))
+ {
+ if ($default === TRUE AND count($this->_field_data) === 0)
+ {
+ return ' selected="selected"';
+ }
+ return '';
+ }
+
+ $field = $this->_field_data[$field]['postdata'];
+
+ if (is_array($field))
+ {
+ if ( ! in_array($value, $field))
+ {
+ return '';
+ }
+ }
+ else
+ {
+ if (($field == '' OR $value == '') OR ($field != $value))
+ {
+ return '';
+ }
+ }
+
+ return ' selected="selected"';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Radio
+ *
+ * Enables radio buttons to be set to the value the user
+ * selected in the event of an error
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function set_radio($field = '', $value = '', $default = FALSE)
+ {
+ if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata']))
+ {
+ if ($default === TRUE AND count($this->_field_data) === 0)
+ {
+ return ' checked="checked"';
+ }
+ return '';
+ }
+
+ $field = $this->_field_data[$field]['postdata'];
+
+ if (is_array($field))
+ {
+ if ( ! in_array($value, $field))
+ {
+ return '';
+ }
+ }
+ else
+ {
+ if (($field == '' OR $value == '') OR ($field != $value))
+ {
+ return '';
+ }
+ }
+
+ return ' checked="checked"';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Checkbox
+ *
+ * Enables checkboxes to be set to the value the user
+ * selected in the event of an error
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function set_checkbox($field = '', $value = '', $default = FALSE)
+ {
+ if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata']))
+ {
+ if ($default === TRUE AND count($this->_field_data) === 0)
+ {
+ return ' checked="checked"';
+ }
+ return '';
+ }
+
+ $field = $this->_field_data[$field]['postdata'];
+
+ if (is_array($field))
+ {
+ if ( ! in_array($value, $field))
+ {
+ return '';
+ }
+ }
+ else
+ {
+ if (($field == '' OR $value == '') OR ($field != $value))
+ {
+ return '';
+ }
+ }
+
+ return ' checked="checked"';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Required
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function required($str)
+ {
+ if ( ! is_array($str))
+ {
+ return (trim($str) == '') ? FALSE : TRUE;
+ }
+ else
+ {
+ return ( ! empty($str));
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Match one field to another
+ *
+ * @access public
+ * @param string
+ * @param field
+ * @return bool
+ */
+ function matches($str, $field)
+ {
+ if ( ! isset($_POST[$field]))
+ {
+ return FALSE;
+ }
+
+ $field = $_POST[$field];
+
+ return ($str !== $field) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Minimum Length
+ *
+ * @access public
+ * @param string
+ * @param value
+ * @return bool
+ */
+ function min_length($str, $val)
+ {
+ if (preg_match("/[^0-9]/", $val))
+ {
+ return FALSE;
+ }
+
+ if (function_exists('mb_strlen'))
+ {
+ return (mb_strlen($str) < $val) ? FALSE : TRUE;
+ }
+
+ return (strlen($str) < $val) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Max Length
+ *
+ * @access public
+ * @param string
+ * @param value
+ * @return bool
+ */
+ function max_length($str, $val)
+ {
+ if (preg_match("/[^0-9]/", $val))
+ {
+ return FALSE;
+ }
+
+ if (function_exists('mb_strlen'))
+ {
+ return (mb_strlen($str) > $val) ? FALSE : TRUE;
+ }
+
+ return (strlen($str) > $val) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Exact Length
+ *
+ * @access public
+ * @param string
+ * @param value
+ * @return bool
+ */
+ function exact_length($str, $val)
+ {
+ if (preg_match("/[^0-9]/", $val))
+ {
+ return FALSE;
+ }
+
+ if (function_exists('mb_strlen'))
+ {
+ return (mb_strlen($str) != $val) ? FALSE : TRUE;
+ }
+
+ return (strlen($str) != $val) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Valid Email
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function valid_email($str)
+ {
+ return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Valid Emails
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function valid_emails($str)
+ {
+ if (strpos($str, ',') === FALSE)
+ {
+ return $this->valid_email(trim($str));
+ }
+
+ foreach(explode(',', $str) as $email)
+ {
+ if (trim($email) != '' && $this->valid_email(trim($email)) === FALSE)
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Validate IP Address
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function valid_ip($ip)
+ {
+ return $this->CI->input->valid_ip($ip);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alpha
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function alpha($str)
+ {
+ return ( ! preg_match("/^([a-z])+$/i", $str)) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alpha-numeric
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function alpha_numeric($str)
+ {
+ return ( ! preg_match("/^([a-z0-9])+$/i", $str)) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alpha-numeric with underscores and dashes
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function alpha_dash($str)
+ {
+ return ( ! preg_match("/^([-a-z0-9_-])+$/i", $str)) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Numeric
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function numeric($str)
+ {
+ return (bool)preg_match( '/^[\-+]?[0-9]*\.?[0-9]+$/', $str);
+
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Is Numeric
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function is_numeric($str)
+ {
+ return ( ! is_numeric($str)) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Integer
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function integer($str)
+ {
+ return (bool)preg_match( '/^[\-+]?[0-9]+$/', $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Is a Natural number (0,1,2,3, etc.)
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function is_natural($str)
+ {
+ return (bool)preg_match( '/^[0-9]+$/', $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Is a Natural number, but not a zero (1,2,3, etc.)
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function is_natural_no_zero($str)
+ {
+ if ( ! preg_match( '/^[0-9]+$/', $str))
+ {
+ return FALSE;
+ }
+
+ if ($str == 0)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Valid Base64
+ *
+ * Tests a string for characters outside of the Base64 alphabet
+ * as defined by RFC 2045 http://www.faqs.org/rfcs/rfc2045
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function valid_base64($str)
+ {
+ return (bool) ! preg_match('/[^a-zA-Z0-9\/\+=]/', $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep data for form
+ *
+ * This function allows HTML to be safely shown in a form.
+ * Special characters are converted.
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function prep_for_form($data = '')
+ {
+ if (is_array($data))
+ {
+ foreach ($data as $key => $val)
+ {
+ $data[$key] = $this->prep_for_form($val);
+ }
+
+ return $data;
+ }
+
+ if ($this->_safe_form_data == FALSE OR $data === '')
+ {
+ return $data;
+ }
+
+ return str_replace(array("'", '"', '<', '>'), array("'", """, '<', '>'), stripslashes($data));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep URL
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function prep_url($str = '')
+ {
+ if ($str == 'http://' OR $str == '')
+ {
+ return '';
+ }
+
+ if (substr($str, 0, 7) != 'http://' && substr($str, 0, 8) != 'https://')
+ {
+ $str = 'http://'.$str;
+ }
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Strip Image Tags
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function strip_image_tags($str)
+ {
+ return $this->CI->input->strip_image_tags($str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * XSS Clean
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function xss_clean($str)
+ {
+ return $this->CI->input->xss_clean($str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Convert PHP tags to entities
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function encode_php_tags($str)
+ {
+ return str_replace(array('<?php', '<?PHP', '<?', '?>'), array('<?php', '<?PHP', '<?', '?>'), $str);
+ }
+
+}
+// END Form Validation Class
+
+/* End of file Form_validation.php */
/* Location: ./system/libraries/Form_validation.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * FTP Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/ftp.html\r
- */ \r
-class CI_FTP {\r
-\r
- var $hostname = '';\r
- var $username = '';\r
- var $password = '';\r
- var $port = 21;\r
- var $passive = TRUE;\r
- var $debug = FALSE;\r
- var $conn_id = FALSE;\r
-\r
-\r
- /**\r
- * Constructor - Sets Preferences\r
- *\r
- * The constructor can be passed an array of config values\r
- */ \r
- function CI_FTP($config = array())\r
- { \r
- if (count($config) > 0)\r
- {\r
- $this->initialize($config);\r
- } \r
-\r
- log_message('debug', "FTP Class Initialized");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Initialize preferences\r
- *\r
- * @access public\r
- * @param array\r
- * @return void\r
- */ \r
- function initialize($config = array())\r
- {\r
- foreach ($config as $key => $val)\r
- {\r
- if (isset($this->$key))\r
- {\r
- $this->$key = $val;\r
- }\r
- }\r
- \r
- // Prep the hostname\r
- $this->hostname = preg_replace('|.+?://|', '', $this->hostname);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * FTP Connect\r
- *\r
- * @access public\r
- * @param array the connection values\r
- * @return bool\r
- */ \r
- function connect($config = array())\r
- { \r
- if (count($config) > 0)\r
- {\r
- $this->initialize($config);\r
- } \r
- \r
- if (FALSE === ($this->conn_id = @ftp_connect($this->hostname, $this->port)))\r
- {\r
- if ($this->debug == TRUE)\r
- {\r
- $this->_error('ftp_unable_to_connect');\r
- } \r
- return FALSE;\r
- }\r
- \r
- if ( ! $this->_login())\r
- {\r
- if ($this->debug == TRUE)\r
- {\r
- $this->_error('ftp_unable_to_login');\r
- } \r
- return FALSE;\r
- }\r
- \r
- // Set passive mode if needed\r
- if ($this->passive == TRUE)\r
- {\r
- ftp_pasv($this->conn_id, TRUE);\r
- }\r
- \r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * FTP Login\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _login()\r
- {\r
- return @ftp_login($this->conn_id, $this->username, $this->password);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Validates the connection ID\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _is_conn()\r
- {\r
- if ( ! is_resource($this->conn_id))\r
- {\r
- if ($this->debug == TRUE)\r
- {\r
- $this->_error('ftp_no_connection');\r
- } \r
- return FALSE;\r
- }\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
-\r
- /**\r
- * Change direcotry\r
- *\r
- * The second parameter lets us momentarily turn off debugging so that\r
- * this function can be used to test for the existance of a folder\r
- * without throwing an error. There's no FTP equivalent to is_dir()\r
- * so we do it by trying to change to a particular directory. \r
- * Internally, this paramter is only used by the "mirror" function below.\r
- *\r
- * @access public\r
- * @param string\r
- * @param bool\r
- * @return bool\r
- */ \r
- function changedir($path = '', $supress_debug = FALSE)\r
- {\r
- if ($path == '' OR ! $this->_is_conn())\r
- {\r
- return FALSE;\r
- }\r
- \r
- $result = @ftp_chdir($this->conn_id, $path);\r
- \r
- if ($result === FALSE)\r
- {\r
- if ($this->debug == TRUE AND $supress_debug == FALSE)\r
- {\r
- $this->_error('ftp_unable_to_changedir');\r
- } \r
- return FALSE; \r
- }\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Create a directory\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function mkdir($path = '', $permissions = NULL)\r
- {\r
- if ($path == '' OR ! $this->_is_conn())\r
- {\r
- return FALSE;\r
- }\r
- \r
- $result = @ftp_mkdir($this->conn_id, $path);\r
- \r
- if ($result === FALSE)\r
- {\r
- if ($this->debug == TRUE)\r
- {\r
- $this->_error('ftp_unable_to_makdir');\r
- } \r
- return FALSE; \r
- }\r
-\r
- // Set file permissions if needed\r
- if ( ! is_null($permissions))\r
- {\r
- $this->chmod($path, (int)$permissions);\r
- }\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Upload a file to the server\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @param string\r
- * @return bool\r
- */ \r
- function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL)\r
- {\r
- if ( ! $this->_is_conn())\r
- {\r
- return FALSE;\r
- }\r
-\r
- if ( ! file_exists($locpath))\r
- {\r
- $this->_error('ftp_no_source_file');\r
- return FALSE;\r
- }\r
- \r
- // Set the mode if not specified\r
- if ($mode == 'auto')\r
- {\r
- // Get the file extension so we can set the upload type\r
- $ext = $this->_getext($locpath);\r
- $mode = $this->_settype($ext);\r
- }\r
- \r
- $mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;\r
- \r
- $result = @ftp_put($this->conn_id, $rempath, $locpath, $mode);\r
- \r
- if ($result === FALSE)\r
- {\r
- if ($this->debug == TRUE)\r
- {\r
- $this->_error('ftp_unable_to_upload');\r
- } \r
- return FALSE; \r
- }\r
- \r
- // Set file permissions if needed\r
- if ( ! is_null($permissions))\r
- {\r
- $this->chmod($rempath, (int)$permissions);\r
- }\r
- \r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rename (or move) a file\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @param bool\r
- * @return bool\r
- */ \r
- function rename($old_file, $new_file, $move = FALSE)\r
- {\r
- if ( ! $this->_is_conn())\r
- {\r
- return FALSE;\r
- }\r
-\r
- $result = @ftp_rename($this->conn_id, $old_file, $new_file);\r
- \r
- if ($result === FALSE)\r
- {\r
- if ($this->debug == TRUE)\r
- {\r
- $msg = ($move == FALSE) ? 'ftp_unable_to_rename' : 'ftp_unable_to_move';\r
- \r
- $this->_error($msg);\r
- } \r
- return FALSE; \r
- }\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Move a file\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return bool\r
- */ \r
- function move($old_file, $new_file)\r
- {\r
- return $this->rename($old_file, $new_file, TRUE);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Rename (or move) a file\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function delete_file($filepath)\r
- {\r
- if ( ! $this->_is_conn())\r
- {\r
- return FALSE;\r
- }\r
-\r
- $result = @ftp_delete($this->conn_id, $filepath);\r
- \r
- if ($result === FALSE)\r
- {\r
- if ($this->debug == TRUE)\r
- { \r
- $this->_error('ftp_unable_to_delete');\r
- } \r
- return FALSE; \r
- }\r
- \r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Delete a folder and recursively delete everything (including sub-folders)\r
- * containted within it.\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function delete_dir($filepath)\r
- {\r
- if ( ! $this->_is_conn())\r
- {\r
- return FALSE;\r
- }\r
-\r
- // Add a trailing slash to the file path if needed\r
- $filepath = preg_replace("/(.+?)\/*$/", "\\1/", $filepath);\r
- \r
- $list = $this->list_files($filepath);\r
- \r
- if ($list !== FALSE AND count($list) > 0)\r
- {\r
- foreach ($list as $item)\r
- { \r
- // If we can't delete the item it's probaly a folder so\r
- // we'll recursively call delete_dir()\r
- if ( ! @ftp_delete($this->conn_id, $item))\r
- {\r
- $this->delete_dir($item);\r
- }\r
- }\r
- }\r
- \r
- $result = @ftp_rmdir($this->conn_id, $filepath);\r
- \r
- if ($result === FALSE)\r
- {\r
- if ($this->debug == TRUE)\r
- { \r
- $this->_error('ftp_unable_to_delete');\r
- } \r
- return FALSE; \r
- }\r
- \r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set file permissions\r
- *\r
- * @access public\r
- * @param string the file path\r
- * @param string the permissions\r
- * @return bool\r
- */ \r
- function chmod($path, $perm)\r
- {\r
- if ( ! $this->_is_conn())\r
- {\r
- return FALSE;\r
- }\r
-\r
- // Permissions can only be set when running PHP 5\r
- if ( ! function_exists('ftp_chmod'))\r
- {\r
- if ($this->debug == TRUE)\r
- {\r
- $this->_error('ftp_unable_to_chmod');\r
- } \r
- return FALSE; \r
- }\r
- \r
- $result = @ftp_chmod($this->conn_id, $perm, $path);\r
- \r
- if ($result === FALSE)\r
- {\r
- if ($this->debug == TRUE)\r
- {\r
- $this->_error('ftp_unable_to_chmod');\r
- } \r
- return FALSE; \r
- }\r
- \r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * FTP List files in the specified directory\r
- *\r
- * @access public\r
- * @return array\r
- */ \r
- function list_files($path = '.')\r
- {\r
- if ( ! $this->_is_conn())\r
- {\r
- return FALSE;\r
- }\r
-\r
- return ftp_nlist($this->conn_id, $path);\r
- }\r
-\r
- // ------------------------------------------------------------------------\r
- \r
- /**\r
- * Read a directory and recreate it remotely\r
- *\r
- * This function recursively reads a folder and everything it contains (including\r
- * sub-folders) and creates a mirror via FTP based on it. Whatever the directory structure\r
- * of the original file path will be recreated on the server.\r
- *\r
- * @access public\r
- * @param string path to source with trailing slash\r
- * @param string path to destination - include the base folder with trailing slash\r
- * @return bool\r
- */ \r
- function mirror($locpath, $rempath)\r
- {\r
- if ( ! $this->_is_conn())\r
- {\r
- return FALSE;\r
- }\r
-\r
- // Open the local file path\r
- if ($fp = @opendir($locpath))\r
- {\r
- // Attempt to open the remote file path.\r
- if ( ! $this->changedir($rempath, TRUE))\r
- {\r
- // If it doesn't exist we'll attempt to create the direcotory\r
- if ( ! $this->mkdir($rempath) OR ! $this->changedir($rempath))\r
- {\r
- return FALSE;\r
- }\r
- }\r
- \r
- // Recursively read the local directory\r
- while (FALSE !== ($file = readdir($fp)))\r
- {\r
- if (@is_dir($locpath.$file) && substr($file, 0, 1) != '.')\r
- { \r
- $this->mirror($locpath.$file."/", $rempath.$file."/");\r
- }\r
- elseif (substr($file, 0, 1) != ".")\r
- {\r
- // Get the file extension so we can se the upload type\r
- $ext = $this->_getext($file);\r
- $mode = $this->_settype($ext);\r
- \r
- $this->upload($locpath.$file, $rempath.$file, $mode);\r
- }\r
- }\r
- return TRUE;\r
- }\r
- \r
- return FALSE;\r
- }\r
-\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Extract the file extension\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */ \r
- function _getext($filename)\r
- {\r
- if (FALSE === strpos($filename, '.'))\r
- {\r
- return 'txt';\r
- }\r
- \r
- $x = explode('.', $filename);\r
- return end($x);\r
- } \r
-\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the upload type\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */ \r
- function _settype($ext)\r
- {\r
- $text_types = array(\r
- 'txt',\r
- 'text',\r
- 'php',\r
- 'phps',\r
- 'php4',\r
- 'js',\r
- 'css',\r
- 'htm',\r
- 'html',\r
- 'phtml',\r
- 'shtml',\r
- 'log',\r
- 'xml'\r
- );\r
- \r
- \r
- return (in_array($ext, $text_types)) ? 'ascii' : 'binary';\r
- }\r
-\r
- // ------------------------------------------------------------------------\r
- \r
- /**\r
- * Close the connection\r
- *\r
- * @access public\r
- * @param string path to source\r
- * @param string path to destination\r
- * @return bool\r
- */ \r
- function close()\r
- {\r
- if ( ! $this->_is_conn())\r
- {\r
- return FALSE;\r
- }\r
-\r
- @ftp_close($this->conn_id);\r
- }\r
-\r
- // ------------------------------------------------------------------------\r
- \r
- /**\r
- * Display error message\r
- *\r
- * @access private\r
- * @param string\r
- * @return bool\r
- */ \r
- function _error($line)\r
- {\r
- $CI =& get_instance();\r
- $CI->lang->load('ftp');\r
- show_error($CI->lang->line($line)); \r
- }\r
-\r
-\r
-}\r
-// END FTP Class\r
-\r
-/* End of file Ftp.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * FTP Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/ftp.html
+ */
+class CI_FTP {
+
+ var $hostname = '';
+ var $username = '';
+ var $password = '';
+ var $port = 21;
+ var $passive = TRUE;
+ var $debug = FALSE;
+ var $conn_id = FALSE;
+
+
+ /**
+ * Constructor - Sets Preferences
+ *
+ * The constructor can be passed an array of config values
+ */
+ function CI_FTP($config = array())
+ {
+ if (count($config) > 0)
+ {
+ $this->initialize($config);
+ }
+
+ log_message('debug', "FTP Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize preferences
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function initialize($config = array())
+ {
+ foreach ($config as $key => $val)
+ {
+ if (isset($this->$key))
+ {
+ $this->$key = $val;
+ }
+ }
+
+ // Prep the hostname
+ $this->hostname = preg_replace('|.+?://|', '', $this->hostname);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * FTP Connect
+ *
+ * @access public
+ * @param array the connection values
+ * @return bool
+ */
+ function connect($config = array())
+ {
+ if (count($config) > 0)
+ {
+ $this->initialize($config);
+ }
+
+ if (FALSE === ($this->conn_id = @ftp_connect($this->hostname, $this->port)))
+ {
+ if ($this->debug == TRUE)
+ {
+ $this->_error('ftp_unable_to_connect');
+ }
+ return FALSE;
+ }
+
+ if ( ! $this->_login())
+ {
+ if ($this->debug == TRUE)
+ {
+ $this->_error('ftp_unable_to_login');
+ }
+ return FALSE;
+ }
+
+ // Set passive mode if needed
+ if ($this->passive == TRUE)
+ {
+ ftp_pasv($this->conn_id, TRUE);
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * FTP Login
+ *
+ * @access private
+ * @return bool
+ */
+ function _login()
+ {
+ return @ftp_login($this->conn_id, $this->username, $this->password);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Validates the connection ID
+ *
+ * @access private
+ * @return bool
+ */
+ function _is_conn()
+ {
+ if ( ! is_resource($this->conn_id))
+ {
+ if ($this->debug == TRUE)
+ {
+ $this->_error('ftp_no_connection');
+ }
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+
+ /**
+ * Change direcotry
+ *
+ * The second parameter lets us momentarily turn off debugging so that
+ * this function can be used to test for the existance of a folder
+ * without throwing an error. There's no FTP equivalent to is_dir()
+ * so we do it by trying to change to a particular directory.
+ * Internally, this paramter is only used by the "mirror" function below.
+ *
+ * @access public
+ * @param string
+ * @param bool
+ * @return bool
+ */
+ function changedir($path = '', $supress_debug = FALSE)
+ {
+ if ($path == '' OR ! $this->_is_conn())
+ {
+ return FALSE;
+ }
+
+ $result = @ftp_chdir($this->conn_id, $path);
+
+ if ($result === FALSE)
+ {
+ if ($this->debug == TRUE AND $supress_debug == FALSE)
+ {
+ $this->_error('ftp_unable_to_changedir');
+ }
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create a directory
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function mkdir($path = '', $permissions = NULL)
+ {
+ if ($path == '' OR ! $this->_is_conn())
+ {
+ return FALSE;
+ }
+
+ $result = @ftp_mkdir($this->conn_id, $path);
+
+ if ($result === FALSE)
+ {
+ if ($this->debug == TRUE)
+ {
+ $this->_error('ftp_unable_to_makdir');
+ }
+ return FALSE;
+ }
+
+ // Set file permissions if needed
+ if ( ! is_null($permissions))
+ {
+ $this->chmod($path, (int)$permissions);
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Upload a file to the server
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @param string
+ * @return bool
+ */
+ function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL)
+ {
+ if ( ! $this->_is_conn())
+ {
+ return FALSE;
+ }
+
+ if ( ! file_exists($locpath))
+ {
+ $this->_error('ftp_no_source_file');
+ return FALSE;
+ }
+
+ // Set the mode if not specified
+ if ($mode == 'auto')
+ {
+ // Get the file extension so we can set the upload type
+ $ext = $this->_getext($locpath);
+ $mode = $this->_settype($ext);
+ }
+
+ $mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;
+
+ $result = @ftp_put($this->conn_id, $rempath, $locpath, $mode);
+
+ if ($result === FALSE)
+ {
+ if ($this->debug == TRUE)
+ {
+ $this->_error('ftp_unable_to_upload');
+ }
+ return FALSE;
+ }
+
+ // Set file permissions if needed
+ if ( ! is_null($permissions))
+ {
+ $this->chmod($rempath, (int)$permissions);
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rename (or move) a file
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @param bool
+ * @return bool
+ */
+ function rename($old_file, $new_file, $move = FALSE)
+ {
+ if ( ! $this->_is_conn())
+ {
+ return FALSE;
+ }
+
+ $result = @ftp_rename($this->conn_id, $old_file, $new_file);
+
+ if ($result === FALSE)
+ {
+ if ($this->debug == TRUE)
+ {
+ $msg = ($move == FALSE) ? 'ftp_unable_to_rename' : 'ftp_unable_to_move';
+
+ $this->_error($msg);
+ }
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Move a file
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return bool
+ */
+ function move($old_file, $new_file)
+ {
+ return $this->rename($old_file, $new_file, TRUE);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Rename (or move) a file
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function delete_file($filepath)
+ {
+ if ( ! $this->_is_conn())
+ {
+ return FALSE;
+ }
+
+ $result = @ftp_delete($this->conn_id, $filepath);
+
+ if ($result === FALSE)
+ {
+ if ($this->debug == TRUE)
+ {
+ $this->_error('ftp_unable_to_delete');
+ }
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete a folder and recursively delete everything (including sub-folders)
+ * containted within it.
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function delete_dir($filepath)
+ {
+ if ( ! $this->_is_conn())
+ {
+ return FALSE;
+ }
+
+ // Add a trailing slash to the file path if needed
+ $filepath = preg_replace("/(.+?)\/*$/", "\\1/", $filepath);
+
+ $list = $this->list_files($filepath);
+
+ if ($list !== FALSE AND count($list) > 0)
+ {
+ foreach ($list as $item)
+ {
+ // If we can't delete the item it's probaly a folder so
+ // we'll recursively call delete_dir()
+ if ( ! @ftp_delete($this->conn_id, $item))
+ {
+ $this->delete_dir($item);
+ }
+ }
+ }
+
+ $result = @ftp_rmdir($this->conn_id, $filepath);
+
+ if ($result === FALSE)
+ {
+ if ($this->debug == TRUE)
+ {
+ $this->_error('ftp_unable_to_delete');
+ }
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set file permissions
+ *
+ * @access public
+ * @param string the file path
+ * @param string the permissions
+ * @return bool
+ */
+ function chmod($path, $perm)
+ {
+ if ( ! $this->_is_conn())
+ {
+ return FALSE;
+ }
+
+ // Permissions can only be set when running PHP 5
+ if ( ! function_exists('ftp_chmod'))
+ {
+ if ($this->debug == TRUE)
+ {
+ $this->_error('ftp_unable_to_chmod');
+ }
+ return FALSE;
+ }
+
+ $result = @ftp_chmod($this->conn_id, $perm, $path);
+
+ if ($result === FALSE)
+ {
+ if ($this->debug == TRUE)
+ {
+ $this->_error('ftp_unable_to_chmod');
+ }
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * FTP List files in the specified directory
+ *
+ * @access public
+ * @return array
+ */
+ function list_files($path = '.')
+ {
+ if ( ! $this->_is_conn())
+ {
+ return FALSE;
+ }
+
+ return ftp_nlist($this->conn_id, $path);
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Read a directory and recreate it remotely
+ *
+ * This function recursively reads a folder and everything it contains (including
+ * sub-folders) and creates a mirror via FTP based on it. Whatever the directory structure
+ * of the original file path will be recreated on the server.
+ *
+ * @access public
+ * @param string path to source with trailing slash
+ * @param string path to destination - include the base folder with trailing slash
+ * @return bool
+ */
+ function mirror($locpath, $rempath)
+ {
+ if ( ! $this->_is_conn())
+ {
+ return FALSE;
+ }
+
+ // Open the local file path
+ if ($fp = @opendir($locpath))
+ {
+ // Attempt to open the remote file path.
+ if ( ! $this->changedir($rempath, TRUE))
+ {
+ // If it doesn't exist we'll attempt to create the direcotory
+ if ( ! $this->mkdir($rempath) OR ! $this->changedir($rempath))
+ {
+ return FALSE;
+ }
+ }
+
+ // Recursively read the local directory
+ while (FALSE !== ($file = readdir($fp)))
+ {
+ if (@is_dir($locpath.$file) && substr($file, 0, 1) != '.')
+ {
+ $this->mirror($locpath.$file."/", $rempath.$file."/");
+ }
+ elseif (substr($file, 0, 1) != ".")
+ {
+ // Get the file extension so we can se the upload type
+ $ext = $this->_getext($file);
+ $mode = $this->_settype($ext);
+
+ $this->upload($locpath.$file, $rempath.$file, $mode);
+ }
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Extract the file extension
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _getext($filename)
+ {
+ if (FALSE === strpos($filename, '.'))
+ {
+ return 'txt';
+ }
+
+ $x = explode('.', $filename);
+ return end($x);
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the upload type
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _settype($ext)
+ {
+ $text_types = array(
+ 'txt',
+ 'text',
+ 'php',
+ 'phps',
+ 'php4',
+ 'js',
+ 'css',
+ 'htm',
+ 'html',
+ 'phtml',
+ 'shtml',
+ 'log',
+ 'xml'
+ );
+
+
+ return (in_array($ext, $text_types)) ? 'ascii' : 'binary';
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Close the connection
+ *
+ * @access public
+ * @param string path to source
+ * @param string path to destination
+ * @return bool
+ */
+ function close()
+ {
+ if ( ! $this->_is_conn())
+ {
+ return FALSE;
+ }
+
+ @ftp_close($this->conn_id);
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Display error message
+ *
+ * @access private
+ * @param string
+ * @return bool
+ */
+ function _error($line)
+ {
+ $CI =& get_instance();
+ $CI->lang->load('ftp');
+ show_error($CI->lang->line($line));
+ }
+
+
+}
+// END FTP Class
+
+/* End of file Ftp.php */
/* Location: ./system/libraries/Ftp.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Hooks Class\r
- *\r
- * Provides a mechanism to extend the base system without hacking. Most of\r
- * this class is borrowed from Paul's Extension class in ExpressionEngine.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/encryption.html\r
- */\r
-class CI_Hooks {\r
- \r
- var $enabled = FALSE;\r
- var $hooks = array();\r
- var $in_progress = FALSE;\r
- \r
- /**\r
- * Constructor\r
- *\r
- */\r
- function CI_Hooks()\r
- {\r
- $this->_initialize(); \r
- log_message('debug', "Hooks Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Initialize the Hooks Preferences\r
- *\r
- * @access private\r
- * @return void\r
- */ \r
- function _initialize()\r
- {\r
- $CFG =& load_class('Config');\r
- \r
- // If hooks are not enabled in the config file\r
- // there is nothing else to do\r
- \r
- if ($CFG->item('enable_hooks') == FALSE)\r
- {\r
- return;\r
- }\r
- \r
- // Grab the "hooks" definition file.\r
- // If there are no hooks, we're done.\r
- \r
- @include(APPPATH.'config/hooks'.EXT);\r
- \r
- if ( ! isset($hook) OR ! is_array($hook))\r
- {\r
- return;\r
- }\r
-\r
- $this->hooks =& $hook;\r
- $this->enabled = TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Call Hook\r
- *\r
- * Calls a particular hook\r
- *\r
- * @access private\r
- * @param string the hook name\r
- * @return mixed\r
- */\r
- function _call_hook($which = '')\r
- {\r
- if ( ! $this->enabled OR ! isset($this->hooks[$which]))\r
- {\r
- return FALSE;\r
- }\r
- \r
- if (isset($this->hooks[$which][0]) AND is_array($this->hooks[$which][0]))\r
- {\r
- foreach ($this->hooks[$which] as $val)\r
- {\r
- $this->_run_hook($val);\r
- }\r
- }\r
- else\r
- {\r
- $this->_run_hook($this->hooks[$which]);\r
- }\r
- \r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Run Hook\r
- *\r
- * Runs a particular hook\r
- *\r
- * @access private\r
- * @param array the hook details\r
- * @return bool\r
- */\r
- function _run_hook($data)\r
- {\r
- if ( ! is_array($data))\r
- {\r
- return FALSE;\r
- }\r
- \r
- // -----------------------------------\r
- // Safety - Prevents run-away loops\r
- // -----------------------------------\r
- \r
- // If the script being called happens to have the same\r
- // hook call within it a loop can happen\r
- \r
- if ($this->in_progress == TRUE)\r
- {\r
- return;\r
- }\r
-\r
- // -----------------------------------\r
- // Set file path\r
- // -----------------------------------\r
- \r
- if ( ! isset($data['filepath']) OR ! isset($data['filename']))\r
- {\r
- return FALSE;\r
- }\r
- \r
- $filepath = APPPATH.$data['filepath'].'/'.$data['filename'];\r
- \r
- if ( ! file_exists($filepath))\r
- {\r
- return FALSE;\r
- }\r
- \r
- // -----------------------------------\r
- // Set class/function name\r
- // -----------------------------------\r
- \r
- $class = FALSE;\r
- $function = FALSE;\r
- $params = '';\r
- \r
- if (isset($data['class']) AND $data['class'] != '')\r
- {\r
- $class = $data['class'];\r
- }\r
-\r
- if (isset($data['function']))\r
- {\r
- $function = $data['function'];\r
- }\r
-\r
- if (isset($data['params']))\r
- {\r
- $params = $data['params'];\r
- }\r
- \r
- if ($class === FALSE AND $function === FALSE)\r
- {\r
- return FALSE;\r
- }\r
- \r
- // -----------------------------------\r
- // Set the in_progress flag\r
- // -----------------------------------\r
-\r
- $this->in_progress = TRUE;\r
- \r
- // -----------------------------------\r
- // Call the requested class and/or function\r
- // -----------------------------------\r
- \r
- if ($class !== FALSE)\r
- {\r
- if ( ! class_exists($class))\r
- {\r
- require($filepath);\r
- }\r
- \r
- $HOOK = new $class;\r
- $HOOK->$function($params);\r
- }\r
- else\r
- {\r
- if ( ! function_exists($function))\r
- {\r
- require($filepath);\r
- }\r
- \r
- $function($params);\r
- }\r
- \r
- $this->in_progress = FALSE;\r
- return TRUE;\r
- }\r
-\r
-}\r
-\r
-// END CI_Hooks class\r
-\r
-/* End of file Hooks.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Hooks Class
+ *
+ * Provides a mechanism to extend the base system without hacking. Most of
+ * this class is borrowed from Paul's Extension class in ExpressionEngine.
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/encryption.html
+ */
+class CI_Hooks {
+
+ var $enabled = FALSE;
+ var $hooks = array();
+ var $in_progress = FALSE;
+
+ /**
+ * Constructor
+ *
+ */
+ function CI_Hooks()
+ {
+ $this->_initialize();
+ log_message('debug', "Hooks Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize the Hooks Preferences
+ *
+ * @access private
+ * @return void
+ */
+ function _initialize()
+ {
+ $CFG =& load_class('Config');
+
+ // If hooks are not enabled in the config file
+ // there is nothing else to do
+
+ if ($CFG->item('enable_hooks') == FALSE)
+ {
+ return;
+ }
+
+ // Grab the "hooks" definition file.
+ // If there are no hooks, we're done.
+
+ @include(APPPATH.'config/hooks'.EXT);
+
+ if ( ! isset($hook) OR ! is_array($hook))
+ {
+ return;
+ }
+
+ $this->hooks =& $hook;
+ $this->enabled = TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Call Hook
+ *
+ * Calls a particular hook
+ *
+ * @access private
+ * @param string the hook name
+ * @return mixed
+ */
+ function _call_hook($which = '')
+ {
+ if ( ! $this->enabled OR ! isset($this->hooks[$which]))
+ {
+ return FALSE;
+ }
+
+ if (isset($this->hooks[$which][0]) AND is_array($this->hooks[$which][0]))
+ {
+ foreach ($this->hooks[$which] as $val)
+ {
+ $this->_run_hook($val);
+ }
+ }
+ else
+ {
+ $this->_run_hook($this->hooks[$which]);
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Run Hook
+ *
+ * Runs a particular hook
+ *
+ * @access private
+ * @param array the hook details
+ * @return bool
+ */
+ function _run_hook($data)
+ {
+ if ( ! is_array($data))
+ {
+ return FALSE;
+ }
+
+ // -----------------------------------
+ // Safety - Prevents run-away loops
+ // -----------------------------------
+
+ // If the script being called happens to have the same
+ // hook call within it a loop can happen
+
+ if ($this->in_progress == TRUE)
+ {
+ return;
+ }
+
+ // -----------------------------------
+ // Set file path
+ // -----------------------------------
+
+ if ( ! isset($data['filepath']) OR ! isset($data['filename']))
+ {
+ return FALSE;
+ }
+
+ $filepath = APPPATH.$data['filepath'].'/'.$data['filename'];
+
+ if ( ! file_exists($filepath))
+ {
+ return FALSE;
+ }
+
+ // -----------------------------------
+ // Set class/function name
+ // -----------------------------------
+
+ $class = FALSE;
+ $function = FALSE;
+ $params = '';
+
+ if (isset($data['class']) AND $data['class'] != '')
+ {
+ $class = $data['class'];
+ }
+
+ if (isset($data['function']))
+ {
+ $function = $data['function'];
+ }
+
+ if (isset($data['params']))
+ {
+ $params = $data['params'];
+ }
+
+ if ($class === FALSE AND $function === FALSE)
+ {
+ return FALSE;
+ }
+
+ // -----------------------------------
+ // Set the in_progress flag
+ // -----------------------------------
+
+ $this->in_progress = TRUE;
+
+ // -----------------------------------
+ // Call the requested class and/or function
+ // -----------------------------------
+
+ if ($class !== FALSE)
+ {
+ if ( ! class_exists($class))
+ {
+ require($filepath);
+ }
+
+ $HOOK = new $class;
+ $HOOK->$function($params);
+ }
+ else
+ {
+ if ( ! function_exists($function))
+ {
+ require($filepath);
+ }
+
+ $function($params);
+ }
+
+ $this->in_progress = FALSE;
+ return TRUE;
+ }
+
+}
+
+// END CI_Hooks class
+
+/* End of file Hooks.php */
/* Location: ./system/libraries/Hooks.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Image Manipulation class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Image_lib\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/image_lib.html\r
- */\r
-class CI_Image_lib {\r
- \r
- var $image_library = 'gd2'; // Can be: imagemagick, netpbm, gd, gd2\r
- var $library_path = '';\r
- var $dynamic_output = FALSE; // Whether to send to browser or write to disk\r
- var $source_image = ''; \r
- var $new_image = '';\r
- var $width = '';\r
- var $height = '';\r
- var $quality = '90';\r
- var $create_thumb = FALSE;\r
- var $thumb_marker = '_thumb';\r
- var $maintain_ratio = TRUE; // Whether to maintain aspect ratio when resizing or use hard values\r
- var $master_dim = 'auto'; // auto, height, or width. Determines what to use as the master dimension\r
- var $rotation_angle = '';\r
- var $x_axis = '';\r
- var $y_axis = '';\r
- \r
- // Watermark Vars\r
- var $wm_text = ''; // Watermark text if graphic is not used\r
- var $wm_type = 'text'; // Type of watermarking. Options: text/overlay\r
- var $wm_x_transp = 4;\r
- var $wm_y_transp = 4;\r
- var $wm_overlay_path = ''; // Watermark image path\r
- var $wm_font_path = ''; // TT font\r
- var $wm_font_size = 17; // Font size (different versions of GD will either use points or pixels)\r
- var $wm_vrt_alignment = 'B'; // Vertical alignment: T M B\r
- var $wm_hor_alignment = 'C'; // Horizontal alignment: L R C\r
- var $wm_padding = 0; // Padding around text\r
- var $wm_hor_offset = 0; // Lets you push text to the right\r
- var $wm_vrt_offset = 0; // Lets you push text down\r
- var $wm_font_color = '#ffffff'; // Text color\r
- var $wm_shadow_color = ''; // Dropshadow color\r
- var $wm_shadow_distance = 2; // Dropshadow distance\r
- var $wm_opacity = 50; // Image opacity: 1 - 100 Only works with image\r
- \r
- // Private Vars\r
- var $source_folder = '';\r
- var $dest_folder = '';\r
- var $mime_type = '';\r
- var $orig_width = '';\r
- var $orig_height = '';\r
- var $image_type = '';\r
- var $size_str = '';\r
- var $full_src_path = '';\r
- var $full_dst_path = '';\r
- var $create_fnc = 'imagecreatetruecolor';\r
- var $copy_fnc = 'imagecopyresampled';\r
- var $error_msg = array();\r
- var $wm_use_drop_shadow = FALSE;\r
- var $wm_use_truetype = FALSE; \r
- \r
- /**\r
- * Constructor\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function CI_Image_lib($props = array())\r
- {\r
- if (count($props) > 0)\r
- {\r
- $this->initialize($props);\r
- }\r
- \r
- log_message('debug', "Image Lib Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Initialize image properties\r
- *\r
- * Resets values in case this class is used in a loop\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function clear()\r
- {\r
- $props = array('source_folder', 'dest_folder', 'source_image', 'full_src_path', 'full_dst_path', 'new_image', 'image_type', 'size_str', 'quality', 'orig_width', 'orig_height', 'rotation_angle', 'x_axis', 'y_axis', 'create_fnc', 'copy_fnc', 'wm_overlay_path', 'wm_use_truetype', 'dynamic_output', 'wm_font_size', 'wm_text', 'wm_vrt_alignment', 'wm_hor_alignment', 'wm_padding', 'wm_hor_offset', 'wm_vrt_offset', 'wm_font_color', 'wm_use_drop_shadow', 'wm_shadow_color', 'wm_shadow_distance', 'wm_opacity');\r
- \r
- foreach ($props as $val)\r
- {\r
- $this->$val = '';\r
- }\r
-\r
- // special consideration for master_dim\r
- $this->master_dim = 'auto';\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * initialize image preferences\r
- *\r
- * @access public\r
- * @param array\r
- * @return void\r
- */ \r
- function initialize($props = array())\r
- {\r
- /*\r
- * Convert array elements into class variables\r
- */\r
- if (count($props) > 0)\r
- {\r
- foreach ($props as $key => $val)\r
- {\r
- $this->$key = $val;\r
- }\r
- }\r
-\r
- /*\r
- * Is there a source image?\r
- *\r
- * If not, there's no reason to continue\r
- *\r
- */\r
- if ($this->source_image == '')\r
- {\r
- $this->set_error('imglib_source_image_required');\r
- return FALSE; \r
- }\r
- \r
- /*\r
- * Is getimagesize() Available?\r
- *\r
- * We use it to determine the image properties (width/height).\r
- * Note: We need to figure out how to determine image\r
- * properties using ImageMagick and NetPBM\r
- *\r
- */ \r
- if ( ! function_exists('getimagesize'))\r
- {\r
- $this->set_error('imglib_gd_required_for_props');\r
- return FALSE; \r
- }\r
- \r
- $this->image_library = strtolower($this->image_library);\r
- \r
- /*\r
- * Set the full server path\r
- *\r
- * The source image may or may not contain a path.\r
- * Either way, we'll try use realpath to generate the\r
- * full server path in order to more reliably read it.\r
- *\r
- */ \r
- if (function_exists('realpath') AND @realpath($this->source_image) !== FALSE)\r
- {\r
- $full_source_path = str_replace("\\", "/", realpath($this->source_image));\r
- }\r
- else\r
- {\r
- $full_source_path = $this->source_image;\r
- }\r
- \r
- $x = explode('/', $full_source_path);\r
- $this->source_image = end($x);\r
- $this->source_folder = str_replace($this->source_image, '', $full_source_path);\r
- \r
- // Set the Image Properties\r
- if ( ! $this->get_image_properties($this->source_folder.$this->source_image))\r
- {\r
- return FALSE; \r
- } \r
-\r
- /*\r
- * Assign the "new" image name/path\r
- *\r
- * If the user has set a "new_image" name it means\r
- * we are making a copy of the source image. If not\r
- * it means we are altering the original. We'll\r
- * set the destination filename and path accordingly.\r
- *\r
- */ \r
- if ($this->new_image == '')\r
- {\r
- $this->dest_image = $this->source_image;\r
- $this->dest_folder = $this->source_folder;\r
- }\r
- else\r
- {\r
- if (strpos($this->new_image, '/') === FALSE)\r
- {\r
- $this->dest_folder = $this->source_folder;\r
- $this->dest_image = $this->new_image;\r
- }\r
- else\r
- {\r
- if (function_exists('realpath') AND @realpath($this->new_image) !== FALSE)\r
- {\r
- $full_dest_path = str_replace("\\", "/", realpath($this->new_image));\r
- }\r
- else\r
- {\r
- $full_dest_path = $this->new_image;\r
- }\r
- \r
- // Is there a file name?\r
- if ( ! preg_match("#\.(jpg|jpeg|gif|png)$#i", $full_dest_path))\r
- {\r
- $this->dest_folder = $full_dest_path.'/';\r
- $this->dest_image = $this->source_image;\r
- }\r
- else\r
- {\r
- $x = explode('/', $full_dest_path);\r
- $this->dest_image = end($x);\r
- $this->dest_folder = str_replace($this->dest_image, '', $full_dest_path);\r
- }\r
- }\r
- }\r
-\r
- /*\r
- * Compile the finalized filenames/paths\r
- *\r
- * We'll create two master strings containing the\r
- * full server path to the source image and the\r
- * full server path to the destination image.\r
- * We'll also split the destination image name\r
- * so we can insert the thumbnail marker if needed.\r
- *\r
- */ \r
- if ($this->create_thumb === FALSE OR $this->thumb_marker == '')\r
- {\r
- $this->thumb_marker = '';\r
- }\r
-\r
- $xp = $this->explode_name($this->dest_image);\r
- \r
- $filename = $xp['name'];\r
- $file_ext = $xp['ext'];\r
- \r
- $this->full_src_path = $this->source_folder.$this->source_image; \r
- $this->full_dst_path = $this->dest_folder.$filename.$this->thumb_marker.$file_ext;\r
-\r
- /*\r
- * Should we maintain image proportions?\r
- *\r
- * When creating thumbs or copies, the target width/height\r
- * might not be in correct proportion with the source\r
- * image's width/height. We'll recalculate it here.\r
- *\r
- */ \r
- if ($this->maintain_ratio === TRUE && ($this->width != '' AND $this->height != ''))\r
- {\r
- $this->image_reproportion();\r
- }\r
-\r
- /*\r
- * Was a width and height specified?\r
- *\r
- * If the destination width/height was\r
- * not submitted we will use the values\r
- * from the actual file\r
- *\r
- */ \r
- if ($this->width == '')\r
- $this->width = $this->orig_width;\r
- \r
- if ($this->height == '')\r
- $this->height = $this->orig_height;\r
- \r
- // Set the quality\r
- $this->quality = trim(str_replace("%", "", $this->quality));\r
- \r
- if ($this->quality == '' OR $this->quality == 0 OR ! is_numeric($this->quality))\r
- $this->quality = 90;\r
- \r
- // Set the x/y coordinates\r
- $this->x_axis = ($this->x_axis == '' OR ! is_numeric($this->x_axis)) ? 0 : $this->x_axis;\r
- $this->y_axis = ($this->y_axis == '' OR ! is_numeric($this->y_axis)) ? 0 : $this->y_axis;\r
- \r
- // Watermark-related Stuff...\r
- if ($this->wm_font_color != '')\r
- {\r
- if (strlen($this->wm_font_color) == 6)\r
- {\r
- $this->wm_font_color = '#'.$this->wm_font_color;\r
- }\r
- }\r
- \r
- if ($this->wm_shadow_color != '')\r
- {\r
- if (strlen($this->wm_shadow_color) == 6)\r
- {\r
- $this->wm_shadow_color = '#'.$this->wm_shadow_color;\r
- }\r
- }\r
- \r
- if ($this->wm_overlay_path != '')\r
- {\r
- $this->wm_overlay_path = str_replace("\\", "/", realpath($this->wm_overlay_path));\r
- }\r
- \r
- if ($this->wm_shadow_color != '')\r
- {\r
- $this->wm_use_drop_shadow = TRUE;\r
- }\r
-\r
- if ($this->wm_font_path != '')\r
- {\r
- $this->wm_use_truetype = TRUE;\r
- }\r
-\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Image Resize\r
- *\r
- * This is a wrapper function that chooses the proper\r
- * resize function based on the protocol specified\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function resize()\r
- {\r
- $protocol = 'image_process_'.$this->image_library;\r
- \r
- if (eregi("gd2$", $protocol))\r
- {\r
- $protocol = 'image_process_gd';\r
- }\r
- \r
- return $this->$protocol('resize');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Image Crop\r
- *\r
- * This is a wrapper function that chooses the proper\r
- * cropping function based on the protocol specified\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function crop()\r
- {\r
- $protocol = 'image_process_'.$this->image_library;\r
- \r
- if (eregi("gd2$", $protocol))\r
- {\r
- $protocol = 'image_process_gd';\r
- }\r
- \r
- return $this->$protocol('crop');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Image Rotate\r
- *\r
- * This is a wrapper function that chooses the proper\r
- * rotation function based on the protocol specified\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function rotate()\r
- {\r
- // Allowed rotation values \r
- $degs = array(90, 180, 270, 'vrt', 'hor'); \r
- \r
- if ($this->rotation_angle == '' OR ! in_array($this->rotation_angle, $degs, TRUE))\r
- {\r
- $this->set_error('imglib_rotation_angle_required');\r
- return FALSE; \r
- }\r
- \r
- // Reassign the width and height\r
- if ($this->rotation_angle == 90 OR $this->rotation_angle == 270)\r
- {\r
- $this->width = $this->orig_height;\r
- $this->height = $this->orig_width;\r
- }\r
- else\r
- {\r
- $this->width = $this->orig_width;\r
- $this->height = $this->orig_height;\r
- }\r
- \r
-\r
- // Choose resizing function\r
- if ($this->image_library == 'imagemagick' OR $this->image_library == 'netpbm')\r
- {\r
- $protocol = 'image_process_'.$this->image_library;\r
- \r
- return $this->$protocol('rotate');\r
- }\r
- \r
- if ($this->rotation_angle == 'hor' OR $this->rotation_angle == 'vrt')\r
- {\r
- return $this->image_mirror_gd();\r
- }\r
- else\r
- { \r
- return $this->image_rotate_gd();\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Image Process Using GD/GD2\r
- *\r
- * This function will resize or crop\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function image_process_gd($action = 'resize')\r
- { \r
- $v2_override = FALSE;\r
-\r
- // If the target width/height match the source, AND if the new file name is not equal to the old file name\r
- // we'll simply make a copy of the original with the new name... assuming dynamic rendering is off.\r
- if ($this->dynamic_output === FALSE)\r
- {\r
- if ($this->orig_width == $this->width AND $this->orig_height == $this->height) \r
- {\r
- if ($this->source_image != $this->new_image)\r
- {\r
- if (@copy($this->full_src_path, $this->full_dst_path))\r
- {\r
- @chmod($this->full_dst_path, DIR_WRITE_MODE);\r
- }\r
- }\r
- \r
- return TRUE;\r
- }\r
- }\r
- \r
- // Let's set up our values based on the action\r
- if ($action == 'crop')\r
- {\r
- // Reassign the source width/height if cropping\r
- $this->orig_width = $this->width;\r
- $this->orig_height = $this->height; \r
- \r
- // GD 2.0 has a cropping bug so we'll test for it\r
- if ($this->gd_version() !== FALSE)\r
- {\r
- $gd_version = str_replace('0', '', $this->gd_version()); \r
- $v2_override = ($gd_version == 2) ? TRUE : FALSE;\r
- }\r
- }\r
- else\r
- { \r
- // If resizing the x/y axis must be zero\r
- $this->x_axis = 0;\r
- $this->y_axis = 0;\r
- }\r
- \r
- // Create the image handle\r
- if ( ! ($src_img = $this->image_create_gd()))\r
- { \r
- return FALSE;\r
- }\r
-\r
- // Create The Image\r
- //\r
- // old conditional which users report cause problems with shared GD libs who report themselves as "2.0 or greater"\r
- // it appears that this is no longer the issue that it was in 2004, so we've removed it, retaining it in the comment\r
- // below should that ever prove inaccurate.\r
- //\r
- // if ($this->image_library == 'gd2' AND function_exists('imagecreatetruecolor') AND $v2_override == FALSE)\r
- if ($this->image_library == 'gd2' AND function_exists('imagecreatetruecolor')) \r
- {\r
- $create = 'imagecreatetruecolor';\r
- $copy = 'imagecopyresampled';\r
- }\r
- else\r
- {\r
- $create = 'imagecreate'; \r
- $copy = 'imagecopyresized';\r
- }\r
- \r
- $dst_img = $create($this->width, $this->height);\r
- $copy($dst_img, $src_img, 0, 0, $this->x_axis, $this->y_axis, $this->width, $this->height, $this->orig_width, $this->orig_height);\r
-\r
- // Show the image \r
- if ($this->dynamic_output == TRUE)\r
- {\r
- $this->image_display_gd($dst_img);\r
- }\r
- else\r
- {\r
- // Or save it\r
- if ( ! $this->image_save_gd($dst_img))\r
- {\r
- return FALSE;\r
- }\r
- }\r
-\r
- // Kill the file handles\r
- imagedestroy($dst_img);\r
- imagedestroy($src_img);\r
- \r
- // Set the file to 777\r
- @chmod($this->full_dst_path, DIR_WRITE_MODE);\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Image Process Using ImageMagick\r
- *\r
- * This function will resize, crop or rotate\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function image_process_imagemagick($action = 'resize')\r
- {\r
- // Do we have a vaild library path?\r
- if ($this->library_path == '')\r
- {\r
- $this->set_error('imglib_libpath_invalid');\r
- return FALSE;\r
- }\r
- \r
- if ( ! eregi("convert$", $this->library_path))\r
- {\r
- if ( ! eregi("/$", $this->library_path)) $this->library_path .= "/";\r
- \r
- $this->library_path .= 'convert';\r
- }\r
- \r
- // Execute the command\r
- $cmd = $this->library_path." -quality ".$this->quality;\r
- \r
- if ($action == 'crop')\r
- {\r
- $cmd .= " -crop ".$this->width."x".$this->height."+".$this->x_axis."+".$this->y_axis." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1";\r
- }\r
- elseif ($action == 'rotate')\r
- {\r
- switch ($this->rotation_angle)\r
- {\r
- case 'hor' : $angle = '-flop';\r
- break;\r
- case 'vrt' : $angle = '-flip';\r
- break;\r
- default : $angle = '-rotate '.$this->rotation_angle;\r
- break;\r
- } \r
- \r
- $cmd .= " ".$angle." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1";\r
- }\r
- else // Resize\r
- {\r
- $cmd .= " -resize ".$this->width."x".$this->height." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1";\r
- }\r
- \r
- $retval = 1;\r
- \r
- @exec($cmd, $output, $retval);\r
-\r
- // Did it work? \r
- if ($retval > 0)\r
- {\r
- $this->set_error('imglib_image_process_failed');\r
- return FALSE;\r
- }\r
- \r
- // Set the file to 777\r
- @chmod($this->full_dst_path, DIR_WRITE_MODE);\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Image Process Using NetPBM\r
- *\r
- * This function will resize, crop or rotate\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function image_process_netpbm($action = 'resize')\r
- {\r
- if ($this->library_path == '')\r
- {\r
- $this->set_error('imglib_libpath_invalid');\r
- return FALSE;\r
- }\r
- \r
- // Build the resizing command\r
- switch ($this->image_type)\r
- {\r
- case 1 :\r
- $cmd_in = 'giftopnm';\r
- $cmd_out = 'ppmtogif';\r
- break;\r
- case 2 :\r
- $cmd_in = 'jpegtopnm';\r
- $cmd_out = 'ppmtojpeg'; \r
- break;\r
- case 3 :\r
- $cmd_in = 'pngtopnm';\r
- $cmd_out = 'ppmtopng';\r
- break;\r
- }\r
- \r
- if ($action == 'crop')\r
- {\r
- $cmd_inner = 'pnmcut -left '.$this->x_axis.' -top '.$this->y_axis.' -width '.$this->width.' -height '.$this->height;\r
- }\r
- elseif ($action == 'rotate')\r
- {\r
- switch ($this->rotation_angle)\r
- {\r
- case 90 : $angle = 'r270';\r
- break;\r
- case 180 : $angle = 'r180';\r
- break;\r
- case 270 : $angle = 'r90';\r
- break;\r
- case 'vrt' : $angle = 'tb';\r
- break;\r
- case 'hor' : $angle = 'lr';\r
- break;\r
- }\r
- \r
- $cmd_inner = 'pnmflip -'.$angle.' ';\r
- }\r
- else // Resize\r
- {\r
- $cmd_inner = 'pnmscale -xysize '.$this->width.' '.$this->height;\r
- }\r
- \r
- $cmd = $this->library_path.$cmd_in.' '.$this->full_src_path.' | '.$cmd_inner.' | '.$cmd_out.' > '.$this->dest_folder.'netpbm.tmp';\r
- \r
- $retval = 1;\r
- \r
- @exec($cmd, $output, $retval);\r
- \r
- // Did it work?\r
- if ($retval > 0)\r
- {\r
- $this->set_error('imglib_image_process_failed');\r
- return FALSE;\r
- }\r
- \r
- // With NetPBM we have to create a temporary image.\r
- // If you try manipulating the original it fails so\r
- // we have to rename the temp file.\r
- copy ($this->dest_folder.'netpbm.tmp', $this->full_dst_path);\r
- unlink ($this->dest_folder.'netpbm.tmp');\r
- @chmod($this->full_dst_path, DIR_WRITE_MODE);\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Image Rotate Using GD\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function image_rotate_gd()\r
- { \r
- // Is Image Rotation Supported?\r
- // this function is only supported as of PHP 4.3\r
- if ( ! function_exists('imagerotate'))\r
- {\r
- $this->set_error('imglib_rotate_unsupported');\r
- return FALSE;\r
- }\r
- \r
- // Create the image handle\r
- if ( ! ($src_img = $this->image_create_gd()))\r
- { \r
- return FALSE;\r
- }\r
-\r
- // Set the background color \r
- // This won't work with transparent PNG files so we are\r
- // going to have to figure out how to determine the color\r
- // of the alpha channel in a future release.\r
- \r
- $white = imagecolorallocate($src_img, 255, 255, 255);\r
-\r
- // Rotate it!\r
- $dst_img = imagerotate($src_img, $this->rotation_angle, $white);\r
- \r
- // Save the Image\r
- if ($this->dynamic_output == TRUE)\r
- {\r
- $this->image_display_gd($dst_img);\r
- }\r
- else\r
- {\r
- // Or save it\r
- if ( ! $this->image_save_gd($dst_img))\r
- {\r
- return FALSE;\r
- }\r
- }\r
-\r
- // Kill the file handles\r
- imagedestroy($dst_img);\r
- imagedestroy($src_img);\r
- \r
- // Set the file to 777\r
- \r
- @chmod($this->full_dst_path, DIR_WRITE_MODE);\r
- \r
- return true;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Create Mirror Image using GD\r
- *\r
- * This function will flip horizontal or vertical\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function image_mirror_gd()\r
- { \r
- if ( ! $src_img = $this->image_create_gd())\r
- {\r
- return FALSE;\r
- }\r
- \r
- $width = $this->orig_width;\r
- $height = $this->orig_height;\r
- \r
- if ($this->rotation_angle == 'hor')\r
- {\r
- for ($i = 0; $i < $height; $i++)\r
- {\r
- $left = 0;\r
- $right = $width-1;\r
- \r
- while ($left < $right)\r
- {\r
- $cl = imagecolorat($src_img, $left, $i);\r
- $cr = imagecolorat($src_img, $right, $i);\r
- \r
- imagesetpixel($src_img, $left, $i, $cr);\r
- imagesetpixel($src_img, $right, $i, $cl);\r
- \r
- $left++;\r
- $right--;\r
- }\r
- }\r
- }\r
- else\r
- {\r
- for ($i = 0; $i < $width; $i++)\r
- {\r
- $top = 0;\r
- $bot = $height-1;\r
- \r
- while ($top < $bot)\r
- {\r
- $ct = imagecolorat($src_img, $i, $top);\r
- $cb = imagecolorat($src_img, $i, $bot);\r
- \r
- imagesetpixel($src_img, $i, $top, $cb);\r
- imagesetpixel($src_img, $i, $bot, $ct);\r
- \r
- $top++;\r
- $bot--;\r
- }\r
- } \r
- } \r
-\r
- // Show the image\r
- if ($this->dynamic_output == TRUE)\r
- {\r
- $this->image_display_gd($src_img);\r
- }\r
- else\r
- {\r
- // Or save it\r
- if ( ! $this->image_save_gd($src_img))\r
- {\r
- return FALSE;\r
- }\r
- }\r
- \r
- // Kill the file handles\r
- imagedestroy($src_img);\r
- \r
- // Set the file to 777\r
- @chmod($this->full_dst_path, DIR_WRITE_MODE);\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Image Watermark\r
- *\r
- * This is a wrapper function that chooses the type\r
- * of watermarking based on the specified preference.\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function watermark()\r
- {\r
- if ($this->wm_type == 'overlay')\r
- {\r
- return $this->overlay_watermark();\r
- }\r
- else\r
- {\r
- return $this->text_watermark();\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Watermark - Graphic Version\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function overlay_watermark()\r
- {\r
- if ( ! function_exists('imagecolortransparent'))\r
- {\r
- $this->set_error('imglib_gd_required');\r
- return FALSE; \r
- }\r
- \r
- // Fetch source image properties\r
- $this->get_image_properties();\r
-\r
- // Fetch watermark image properties\r
- $props = $this->get_image_properties($this->wm_overlay_path, TRUE); \r
- $wm_img_type = $props['image_type'];\r
- $wm_width = $props['width'];\r
- $wm_height = $props['height'];\r
- \r
- // Create two image resources \r
- $wm_img = $this->image_create_gd($this->wm_overlay_path, $wm_img_type);\r
- $src_img = $this->image_create_gd($this->full_src_path);\r
- \r
- // Reverse the offset if necessary \r
- // When the image is positioned at the bottom\r
- // we don't want the vertical offset to push it\r
- // further down. We want the reverse, so we'll\r
- // invert the offset. Same with the horizontal\r
- // offset when the image is at the right\r
- \r
- $this->wm_vrt_alignment = strtoupper(substr($this->wm_vrt_alignment, 0, 1));\r
- $this->wm_hor_alignment = strtoupper(substr($this->wm_hor_alignment, 0, 1));\r
- \r
- if ($this->wm_vrt_alignment == 'B')\r
- $this->wm_vrt_offset = $this->wm_vrt_offset * -1;\r
- \r
- if ($this->wm_hor_alignment == 'R')\r
- $this->wm_hor_offset = $this->wm_hor_offset * -1;\r
-\r
- // Set the base x and y axis values\r
- $x_axis = $this->wm_hor_offset + $this->wm_padding;\r
- $y_axis = $this->wm_vrt_offset + $this->wm_padding;\r
-\r
- // Set the vertical position\r
- switch ($this->wm_vrt_alignment)\r
- {\r
- case 'T':\r
- break;\r
- case 'M': $y_axis += ($this->orig_height / 2) - ($wm_height / 2);\r
- break;\r
- case 'B': $y_axis += $this->orig_height - $wm_height;\r
- break;\r
- }\r
-\r
- // Set the horizontal position\r
- switch ($this->wm_hor_alignment)\r
- {\r
- case 'L':\r
- break; \r
- case 'C': $x_axis += ($this->orig_width / 2) - ($wm_width / 2);\r
- break;\r
- case 'R': $x_axis += $this->orig_width - $wm_width;\r
- break;\r
- }\r
- \r
- // Build the finalized image \r
- if ($wm_img_type == 3 AND function_exists('imagealphablending'))\r
- {\r
- @imagealphablending($src_img, TRUE);\r
- } \r
-\r
- // Set RGB values for text and shadow\r
- $rgba = imagecolorat($wm_img, $this->wm_x_transp, $this->wm_y_transp);\r
- $alpha = ($rgba & 0x7F000000) >> 24;\r
- \r
- // make a best guess as to whether we're dealing with an image with alpha transparency or no/binary transparency\r
- if ($alpha > 0)\r
- {\r
- // copy the image directly, the image's alpha transparency being the sole determinant of blending\r
- imagecopy($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height);\r
- }\r
- else\r
- {\r
- // set our RGB value from above to be transparent and merge the images with the specified opacity\r
- imagecolortransparent($wm_img, imagecolorat($wm_img, $this->wm_x_transp, $this->wm_y_transp));\r
- imagecopymerge($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height, $this->wm_opacity); \r
- }\r
- \r
- // Output the image\r
- if ($this->dynamic_output == TRUE)\r
- {\r
- $this->image_display_gd($src_img);\r
- }\r
- else\r
- {\r
- if ( ! $this->image_save_gd($src_img))\r
- {\r
- return FALSE;\r
- }\r
- }\r
- \r
- imagedestroy($src_img);\r
- imagedestroy($wm_img);\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Watermark - Text Version\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function text_watermark()\r
- {\r
- if ( ! ($src_img = $this->image_create_gd()))\r
- { \r
- return FALSE;\r
- }\r
- \r
- if ($this->wm_use_truetype == TRUE AND ! file_exists($this->wm_font_path))\r
- {\r
- $this->set_error('imglib_missing_font');\r
- return FALSE;\r
- }\r
- \r
- // Fetch source image properties \r
- $this->get_image_properties(); \r
- \r
- // Set RGB values for text and shadow \r
- $this->wm_font_color = str_replace('#', '', $this->wm_font_color);\r
- $this->wm_shadow_color = str_replace('#', '', $this->wm_shadow_color);\r
- \r
- $R1 = hexdec(substr($this->wm_font_color, 0, 2));\r
- $G1 = hexdec(substr($this->wm_font_color, 2, 2));\r
- $B1 = hexdec(substr($this->wm_font_color, 4, 2));\r
- \r
- $R2 = hexdec(substr($this->wm_shadow_color, 0, 2));\r
- $G2 = hexdec(substr($this->wm_shadow_color, 2, 2));\r
- $B2 = hexdec(substr($this->wm_shadow_color, 4, 2));\r
- \r
- $txt_color = imagecolorclosest($src_img, $R1, $G1, $B1);\r
- $drp_color = imagecolorclosest($src_img, $R2, $G2, $B2);\r
-\r
- // Reverse the vertical offset\r
- // When the image is positioned at the bottom\r
- // we don't want the vertical offset to push it\r
- // further down. We want the reverse, so we'll\r
- // invert the offset. Note: The horizontal\r
- // offset flips itself automatically\r
- \r
- if ($this->wm_vrt_alignment == 'B')\r
- $this->wm_vrt_offset = $this->wm_vrt_offset * -1;\r
- \r
- if ($this->wm_hor_alignment == 'R')\r
- $this->wm_hor_offset = $this->wm_hor_offset * -1;\r
-\r
- // Set font width and height\r
- // These are calculated differently depending on\r
- // whether we are using the true type font or not\r
- if ($this->wm_use_truetype == TRUE)\r
- {\r
- if ($this->wm_font_size == '')\r
- $this->wm_font_size = '17';\r
- \r
- $fontwidth = $this->wm_font_size-($this->wm_font_size/4);\r
- $fontheight = $this->wm_font_size;\r
- $this->wm_vrt_offset += $this->wm_font_size;\r
- }\r
- else\r
- {\r
- $fontwidth = imagefontwidth($this->wm_font_size);\r
- $fontheight = imagefontheight($this->wm_font_size);\r
- }\r
-\r
- // Set base X and Y axis values\r
- $x_axis = $this->wm_hor_offset + $this->wm_padding;\r
- $y_axis = $this->wm_vrt_offset + $this->wm_padding;\r
-\r
- // Set verticle alignment\r
- if ($this->wm_use_drop_shadow == FALSE)\r
- $this->wm_shadow_distance = 0;\r
- \r
- $this->wm_vrt_alignment = strtoupper(substr($this->wm_vrt_alignment, 0, 1));\r
- $this->wm_hor_alignment = strtoupper(substr($this->wm_hor_alignment, 0, 1));\r
- \r
- switch ($this->wm_vrt_alignment)\r
- {\r
- case "T" :\r
- break;\r
- case "M": $y_axis += ($this->orig_height/2)+($fontheight/2);\r
- break;\r
- case "B": $y_axis += ($this->orig_height - $fontheight - $this->wm_shadow_distance - ($fontheight/2));\r
- break;\r
- }\r
- \r
- $x_shad = $x_axis + $this->wm_shadow_distance;\r
- $y_shad = $y_axis + $this->wm_shadow_distance;\r
- \r
- // Set horizontal alignment\r
- switch ($this->wm_hor_alignment)\r
- {\r
- case "L":\r
- break;\r
- case "R":\r
- if ($this->wm_use_drop_shadow)\r
- $x_shad += ($this->orig_width - $fontwidth*strlen($this->wm_text));\r
- $x_axis += ($this->orig_width - $fontwidth*strlen($this->wm_text));\r
- break;\r
- case "C":\r
- if ($this->wm_use_drop_shadow)\r
- $x_shad += floor(($this->orig_width - $fontwidth*strlen($this->wm_text))/2);\r
- $x_axis += floor(($this->orig_width -$fontwidth*strlen($this->wm_text))/2);\r
- break;\r
- }\r
- \r
- // Add the text to the source image\r
- if ($this->wm_use_truetype)\r
- { \r
- if ($this->wm_use_drop_shadow)\r
- imagettftext($src_img, $this->wm_font_size, 0, $x_shad, $y_shad, $drp_color, $this->wm_font_path, $this->wm_text);\r
- imagettftext($src_img, $this->wm_font_size, 0, $x_axis, $y_axis, $txt_color, $this->wm_font_path, $this->wm_text);\r
- }\r
- else\r
- {\r
- if ($this->wm_use_drop_shadow)\r
- imagestring($src_img, $this->wm_font_size, $x_shad, $y_shad, $this->wm_text, $drp_color);\r
- imagestring($src_img, $this->wm_font_size, $x_axis, $y_axis, $this->wm_text, $txt_color);\r
- }\r
- \r
- // Output the final image\r
- if ($this->dynamic_output == TRUE)\r
- {\r
- $this->image_display_gd($src_img);\r
- }\r
- else\r
- {\r
- $this->image_save_gd($src_img);\r
- }\r
- \r
- imagedestroy($src_img);\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Create Image - GD\r
- *\r
- * This simply creates an image resource handle\r
- * based on the type of image being processed\r
- *\r
- * @access public\r
- * @param string\r
- * @return resource\r
- */ \r
- function image_create_gd($path = '', $image_type = '')\r
- {\r
- if ($path == '')\r
- $path = $this->full_src_path;\r
- \r
- if ($image_type == '')\r
- $image_type = $this->image_type;\r
- \r
- \r
- switch ($image_type)\r
- {\r
- case 1 :\r
- if ( ! function_exists('imagecreatefromgif'))\r
- {\r
- $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_gif_not_supported'));\r
- return FALSE;\r
- }\r
- \r
- return imagecreatefromgif($path);\r
- break;\r
- case 2 :\r
- if ( ! function_exists('imagecreatefromjpeg'))\r
- {\r
- $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_jpg_not_supported'));\r
- return FALSE;\r
- }\r
- \r
- return imagecreatefromjpeg($path);\r
- break;\r
- case 3 :\r
- if ( ! function_exists('imagecreatefrompng'))\r
- {\r
- $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_png_not_supported')); \r
- return FALSE;\r
- }\r
- \r
- return imagecreatefrompng($path);\r
- break; \r
- \r
- }\r
- \r
- $this->set_error(array('imglib_unsupported_imagecreate'));\r
- return FALSE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Write image file to disk - GD\r
- *\r
- * Takes an image resource as input and writes the file\r
- * to the specified destination\r
- *\r
- * @access public\r
- * @param resource\r
- * @return bool\r
- */ \r
- function image_save_gd($resource)\r
- { \r
- switch ($this->image_type)\r
- {\r
- case 1 :\r
- if ( ! function_exists('imagegif'))\r
- {\r
- $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_gif_not_supported'));\r
- return FALSE; \r
- }\r
- \r
- @imagegif($resource, $this->full_dst_path);\r
- break;\r
- case 2 :\r
- if ( ! function_exists('imagejpeg'))\r
- {\r
- $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_jpg_not_supported'));\r
- return FALSE; \r
- }\r
- \r
- if (phpversion() == '4.4.1')\r
- {\r
- @touch($this->full_dst_path); // PHP 4.4.1 bug #35060 - workaround\r
- }\r
- \r
- @imagejpeg($resource, $this->full_dst_path, $this->quality);\r
- break;\r
- case 3 :\r
- if ( ! function_exists('imagepng'))\r
- {\r
- $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_png_not_supported'));\r
- return FALSE; \r
- }\r
- \r
- @imagepng($resource, $this->full_dst_path);\r
- break;\r
- default :\r
- $this->set_error(array('imglib_unsupported_imagecreate'));\r
- return FALSE; \r
- break; \r
- }\r
- \r
- return TRUE;\r
- } \r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Dynamically outputs an image\r
- *\r
- * @access public\r
- * @param resource\r
- * @return void\r
- */ \r
- function image_display_gd($resource)\r
- { \r
- header("Content-Disposition: filename={$this->source_image};");\r
- header("Content-Type: {$this->mime_type}");\r
- header('Content-Transfer-Encoding: binary');\r
- header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');\r
- \r
- switch ($this->image_type)\r
- {\r
- case 1 : imagegif($resource);\r
- break;\r
- case 2 : imagejpeg($resource, '', $this->quality);\r
- break;\r
- case 3 : imagepng($resource);\r
- break;\r
- default : echo 'Unable to display the image';\r
- break; \r
- } \r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Re-proportion Image Width/Height\r
- *\r
- * When creating thumbs, the desired width/height\r
- * can end up warping the image due to an incorrect\r
- * ratio between the full-sized image and the thumb.\r
- *\r
- * This function lets us re-proportion the width/height\r
- * if users choose to maintain the aspect ratio when resizing.\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function image_reproportion()\r
- {\r
- if ( ! is_numeric($this->width) OR ! is_numeric($this->height) OR $this->width == 0 OR $this->height == 0)\r
- return;\r
- \r
- if ( ! is_numeric($this->orig_width) OR ! is_numeric($this->orig_height) OR $this->orig_width == 0 OR $this->orig_height == 0)\r
- return;\r
- \r
- $new_width = ceil($this->orig_width*$this->height/$this->orig_height); \r
- $new_height = ceil($this->width*$this->orig_height/$this->orig_width);\r
- \r
- $ratio = (($this->orig_height/$this->orig_width) - ($this->height/$this->width));\r
- \r
- if ($this->master_dim != 'width' AND $this->master_dim != 'height')\r
- {\r
- $this->master_dim = ($ratio < 0) ? 'width' : 'height';\r
- }\r
- \r
- if (($this->width != $new_width) AND ($this->height != $new_height))\r
- {\r
- if ($this->master_dim == 'height')\r
- {\r
- $this->width = $new_width;\r
- }\r
- else\r
- {\r
- $this->height = $new_height;\r
- }\r
- }\r
- } \r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get image properties\r
- *\r
- * A helper function that gets info about the file\r
- *\r
- * @access public\r
- * @param string\r
- * @return mixed\r
- */ \r
- function get_image_properties($path = '', $return = FALSE)\r
- {\r
- // For now we require GD but we should\r
- // find a way to determine this using IM or NetPBM\r
- \r
- if ($path == '')\r
- $path = $this->full_src_path;\r
- \r
- if ( ! file_exists($path))\r
- {\r
- $this->set_error('imglib_invalid_path'); \r
- return FALSE; \r
- }\r
- \r
- $vals = @getimagesize($path);\r
- \r
- $types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png');\r
- \r
- $mime = (isset($types[$vals['2']])) ? 'image/'.$types[$vals['2']] : 'image/jpg';\r
- \r
- if ($return == TRUE)\r
- {\r
- $v['width'] = $vals['0'];\r
- $v['height'] = $vals['1'];\r
- $v['image_type'] = $vals['2'];\r
- $v['size_str'] = $vals['3'];\r
- $v['mime_type'] = $mime;\r
- \r
- return $v;\r
- }\r
- \r
- $this->orig_width = $vals['0'];\r
- $this->orig_height = $vals['1'];\r
- $this->image_type = $vals['2'];\r
- $this->size_str = $vals['3'];\r
- $this->mime_type = $mime;\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Size calculator\r
- *\r
- * This function takes a known width x height and\r
- * recalculates it to a new size. Only one\r
- * new variable needs to be known\r
- *\r
- * $props = array(\r
- * 'width' => $width,\r
- * 'height' => $height,\r
- * 'new_width' => 40,\r
- * 'new_height' => ''\r
- * );\r
- *\r
- * @access public\r
- * @param array\r
- * @return array\r
- */ \r
- function size_calculator($vals)\r
- {\r
- if ( ! is_array($vals))\r
- return;\r
- \r
- $allowed = array('new_width', 'new_height', 'width', 'height');\r
- \r
- foreach ($allowed as $item)\r
- {\r
- if ( ! isset($vals[$item]) OR $vals[$item] == '')\r
- $vals[$item] = 0;\r
- }\r
- \r
- if ($vals['width'] == 0 OR $vals['height'] == 0)\r
- {\r
- return $vals;\r
- }\r
- \r
- if ($vals['new_width'] == 0)\r
- {\r
- $vals['new_width'] = ceil($vals['width']*$vals['new_height']/$vals['height']);\r
- }\r
- elseif ($vals['new_height'] == 0)\r
- {\r
- $vals['new_height'] = ceil($vals['new_width']*$vals['height']/$vals['width']);\r
- }\r
- \r
- return $vals;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Explode source_image\r
- *\r
- * This is a helper function that extracts the extension\r
- * from the source_image. This function lets us deal with\r
- * source_images with multiple periods, like: my.cool.jpg\r
- * It returns an associative array with two elements:\r
- * $array['ext'] = '.jpg';\r
- * $array['name'] = 'my.cool';\r
- *\r
- * @access public\r
- * @param array\r
- * @return array\r
- */ \r
- function explode_name($source_image)\r
- {\r
- $x = explode('.', $source_image);\r
- $ret['ext'] = '.'.end($x);\r
- \r
- $name = '';\r
- \r
- $ct = count($x)-1;\r
- \r
- for ($i = 0; $i < $ct; $i++)\r
- {\r
- $name .= $x[$i];\r
- \r
- if ($i < ($ct - 1))\r
- {\r
- $name .= '.';\r
- }\r
- }\r
- \r
- $ret['name'] = $name;\r
- \r
- return $ret;\r
- } \r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Is GD Installed?\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function gd_loaded()\r
- {\r
- if ( ! extension_loaded('gd'))\r
- {\r
- if ( ! dl('gd.so'))\r
- {\r
- return FALSE;\r
- }\r
- }\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get GD version\r
- *\r
- * @access public\r
- * @return mixed\r
- */ \r
- function gd_version()\r
- {\r
- if (function_exists('gd_info'))\r
- {\r
- $gd_version = @gd_info();\r
- $gd_version = preg_replace("/\D/", "", $gd_version['GD Version']);\r
- \r
- return $gd_version;\r
- }\r
- \r
- return FALSE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set error message\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_error($msg)\r
- {\r
- $CI =& get_instance();\r
- $CI->lang->load('imglib');\r
- \r
- if (is_array($msg))\r
- {\r
- foreach ($msg as $val)\r
- {\r
- \r
- $msg = ($CI->lang->line($val) == FALSE) ? $val : $CI->lang->line($val);\r
- $this->error_msg[] = $msg;\r
- log_message('error', $msg);\r
- } \r
- }\r
- else\r
- {\r
- $msg = ($CI->lang->line($msg) == FALSE) ? $msg : $CI->lang->line($msg);\r
- $this->error_msg[] = $msg;\r
- log_message('error', $msg);\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Show error messages\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function display_errors($open = '<p>', $close = '</p>')\r
- { \r
- $str = '';\r
- foreach ($this->error_msg as $val)\r
- {\r
- $str .= $open.$val.$close;\r
- }\r
- \r
- return $str;\r
- }\r
-\r
-}\r
-// END Image_lib Class\r
-\r
-/* End of file Image_lib.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Image Manipulation class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Image_lib
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/image_lib.html
+ */
+class CI_Image_lib {
+
+ var $image_library = 'gd2'; // Can be: imagemagick, netpbm, gd, gd2
+ var $library_path = '';
+ var $dynamic_output = FALSE; // Whether to send to browser or write to disk
+ var $source_image = '';
+ var $new_image = '';
+ var $width = '';
+ var $height = '';
+ var $quality = '90';
+ var $create_thumb = FALSE;
+ var $thumb_marker = '_thumb';
+ var $maintain_ratio = TRUE; // Whether to maintain aspect ratio when resizing or use hard values
+ var $master_dim = 'auto'; // auto, height, or width. Determines what to use as the master dimension
+ var $rotation_angle = '';
+ var $x_axis = '';
+ var $y_axis = '';
+
+ // Watermark Vars
+ var $wm_text = ''; // Watermark text if graphic is not used
+ var $wm_type = 'text'; // Type of watermarking. Options: text/overlay
+ var $wm_x_transp = 4;
+ var $wm_y_transp = 4;
+ var $wm_overlay_path = ''; // Watermark image path
+ var $wm_font_path = ''; // TT font
+ var $wm_font_size = 17; // Font size (different versions of GD will either use points or pixels)
+ var $wm_vrt_alignment = 'B'; // Vertical alignment: T M B
+ var $wm_hor_alignment = 'C'; // Horizontal alignment: L R C
+ var $wm_padding = 0; // Padding around text
+ var $wm_hor_offset = 0; // Lets you push text to the right
+ var $wm_vrt_offset = 0; // Lets you push text down
+ var $wm_font_color = '#ffffff'; // Text color
+ var $wm_shadow_color = ''; // Dropshadow color
+ var $wm_shadow_distance = 2; // Dropshadow distance
+ var $wm_opacity = 50; // Image opacity: 1 - 100 Only works with image
+
+ // Private Vars
+ var $source_folder = '';
+ var $dest_folder = '';
+ var $mime_type = '';
+ var $orig_width = '';
+ var $orig_height = '';
+ var $image_type = '';
+ var $size_str = '';
+ var $full_src_path = '';
+ var $full_dst_path = '';
+ var $create_fnc = 'imagecreatetruecolor';
+ var $copy_fnc = 'imagecopyresampled';
+ var $error_msg = array();
+ var $wm_use_drop_shadow = FALSE;
+ var $wm_use_truetype = FALSE;
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function CI_Image_lib($props = array())
+ {
+ if (count($props) > 0)
+ {
+ $this->initialize($props);
+ }
+
+ log_message('debug', "Image Lib Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize image properties
+ *
+ * Resets values in case this class is used in a loop
+ *
+ * @access public
+ * @return void
+ */
+ function clear()
+ {
+ $props = array('source_folder', 'dest_folder', 'source_image', 'full_src_path', 'full_dst_path', 'new_image', 'image_type', 'size_str', 'quality', 'orig_width', 'orig_height', 'rotation_angle', 'x_axis', 'y_axis', 'create_fnc', 'copy_fnc', 'wm_overlay_path', 'wm_use_truetype', 'dynamic_output', 'wm_font_size', 'wm_text', 'wm_vrt_alignment', 'wm_hor_alignment', 'wm_padding', 'wm_hor_offset', 'wm_vrt_offset', 'wm_font_color', 'wm_use_drop_shadow', 'wm_shadow_color', 'wm_shadow_distance', 'wm_opacity');
+
+ foreach ($props as $val)
+ {
+ $this->$val = '';
+ }
+
+ // special consideration for master_dim
+ $this->master_dim = 'auto';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * initialize image preferences
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function initialize($props = array())
+ {
+ /*
+ * Convert array elements into class variables
+ */
+ if (count($props) > 0)
+ {
+ foreach ($props as $key => $val)
+ {
+ $this->$key = $val;
+ }
+ }
+
+ /*
+ * Is there a source image?
+ *
+ * If not, there's no reason to continue
+ *
+ */
+ if ($this->source_image == '')
+ {
+ $this->set_error('imglib_source_image_required');
+ return FALSE;
+ }
+
+ /*
+ * Is getimagesize() Available?
+ *
+ * We use it to determine the image properties (width/height).
+ * Note: We need to figure out how to determine image
+ * properties using ImageMagick and NetPBM
+ *
+ */
+ if ( ! function_exists('getimagesize'))
+ {
+ $this->set_error('imglib_gd_required_for_props');
+ return FALSE;
+ }
+
+ $this->image_library = strtolower($this->image_library);
+
+ /*
+ * Set the full server path
+ *
+ * The source image may or may not contain a path.
+ * Either way, we'll try use realpath to generate the
+ * full server path in order to more reliably read it.
+ *
+ */
+ if (function_exists('realpath') AND @realpath($this->source_image) !== FALSE)
+ {
+ $full_source_path = str_replace("\\", "/", realpath($this->source_image));
+ }
+ else
+ {
+ $full_source_path = $this->source_image;
+ }
+
+ $x = explode('/', $full_source_path);
+ $this->source_image = end($x);
+ $this->source_folder = str_replace($this->source_image, '', $full_source_path);
+
+ // Set the Image Properties
+ if ( ! $this->get_image_properties($this->source_folder.$this->source_image))
+ {
+ return FALSE;
+ }
+
+ /*
+ * Assign the "new" image name/path
+ *
+ * If the user has set a "new_image" name it means
+ * we are making a copy of the source image. If not
+ * it means we are altering the original. We'll
+ * set the destination filename and path accordingly.
+ *
+ */
+ if ($this->new_image == '')
+ {
+ $this->dest_image = $this->source_image;
+ $this->dest_folder = $this->source_folder;
+ }
+ else
+ {
+ if (strpos($this->new_image, '/') === FALSE)
+ {
+ $this->dest_folder = $this->source_folder;
+ $this->dest_image = $this->new_image;
+ }
+ else
+ {
+ if (function_exists('realpath') AND @realpath($this->new_image) !== FALSE)
+ {
+ $full_dest_path = str_replace("\\", "/", realpath($this->new_image));
+ }
+ else
+ {
+ $full_dest_path = $this->new_image;
+ }
+
+ // Is there a file name?
+ if ( ! preg_match("#\.(jpg|jpeg|gif|png)$#i", $full_dest_path))
+ {
+ $this->dest_folder = $full_dest_path.'/';
+ $this->dest_image = $this->source_image;
+ }
+ else
+ {
+ $x = explode('/', $full_dest_path);
+ $this->dest_image = end($x);
+ $this->dest_folder = str_replace($this->dest_image, '', $full_dest_path);
+ }
+ }
+ }
+
+ /*
+ * Compile the finalized filenames/paths
+ *
+ * We'll create two master strings containing the
+ * full server path to the source image and the
+ * full server path to the destination image.
+ * We'll also split the destination image name
+ * so we can insert the thumbnail marker if needed.
+ *
+ */
+ if ($this->create_thumb === FALSE OR $this->thumb_marker == '')
+ {
+ $this->thumb_marker = '';
+ }
+
+ $xp = $this->explode_name($this->dest_image);
+
+ $filename = $xp['name'];
+ $file_ext = $xp['ext'];
+
+ $this->full_src_path = $this->source_folder.$this->source_image;
+ $this->full_dst_path = $this->dest_folder.$filename.$this->thumb_marker.$file_ext;
+
+ /*
+ * Should we maintain image proportions?
+ *
+ * When creating thumbs or copies, the target width/height
+ * might not be in correct proportion with the source
+ * image's width/height. We'll recalculate it here.
+ *
+ */
+ if ($this->maintain_ratio === TRUE && ($this->width != '' AND $this->height != ''))
+ {
+ $this->image_reproportion();
+ }
+
+ /*
+ * Was a width and height specified?
+ *
+ * If the destination width/height was
+ * not submitted we will use the values
+ * from the actual file
+ *
+ */
+ if ($this->width == '')
+ $this->width = $this->orig_width;
+
+ if ($this->height == '')
+ $this->height = $this->orig_height;
+
+ // Set the quality
+ $this->quality = trim(str_replace("%", "", $this->quality));
+
+ if ($this->quality == '' OR $this->quality == 0 OR ! is_numeric($this->quality))
+ $this->quality = 90;
+
+ // Set the x/y coordinates
+ $this->x_axis = ($this->x_axis == '' OR ! is_numeric($this->x_axis)) ? 0 : $this->x_axis;
+ $this->y_axis = ($this->y_axis == '' OR ! is_numeric($this->y_axis)) ? 0 : $this->y_axis;
+
+ // Watermark-related Stuff...
+ if ($this->wm_font_color != '')
+ {
+ if (strlen($this->wm_font_color) == 6)
+ {
+ $this->wm_font_color = '#'.$this->wm_font_color;
+ }
+ }
+
+ if ($this->wm_shadow_color != '')
+ {
+ if (strlen($this->wm_shadow_color) == 6)
+ {
+ $this->wm_shadow_color = '#'.$this->wm_shadow_color;
+ }
+ }
+
+ if ($this->wm_overlay_path != '')
+ {
+ $this->wm_overlay_path = str_replace("\\", "/", realpath($this->wm_overlay_path));
+ }
+
+ if ($this->wm_shadow_color != '')
+ {
+ $this->wm_use_drop_shadow = TRUE;
+ }
+
+ if ($this->wm_font_path != '')
+ {
+ $this->wm_use_truetype = TRUE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Image Resize
+ *
+ * This is a wrapper function that chooses the proper
+ * resize function based on the protocol specified
+ *
+ * @access public
+ * @return bool
+ */
+ function resize()
+ {
+ $protocol = 'image_process_'.$this->image_library;
+
+ if (eregi("gd2$", $protocol))
+ {
+ $protocol = 'image_process_gd';
+ }
+
+ return $this->$protocol('resize');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Image Crop
+ *
+ * This is a wrapper function that chooses the proper
+ * cropping function based on the protocol specified
+ *
+ * @access public
+ * @return bool
+ */
+ function crop()
+ {
+ $protocol = 'image_process_'.$this->image_library;
+
+ if (eregi("gd2$", $protocol))
+ {
+ $protocol = 'image_process_gd';
+ }
+
+ return $this->$protocol('crop');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Image Rotate
+ *
+ * This is a wrapper function that chooses the proper
+ * rotation function based on the protocol specified
+ *
+ * @access public
+ * @return bool
+ */
+ function rotate()
+ {
+ // Allowed rotation values
+ $degs = array(90, 180, 270, 'vrt', 'hor');
+
+ if ($this->rotation_angle == '' OR ! in_array($this->rotation_angle, $degs, TRUE))
+ {
+ $this->set_error('imglib_rotation_angle_required');
+ return FALSE;
+ }
+
+ // Reassign the width and height
+ if ($this->rotation_angle == 90 OR $this->rotation_angle == 270)
+ {
+ $this->width = $this->orig_height;
+ $this->height = $this->orig_width;
+ }
+ else
+ {
+ $this->width = $this->orig_width;
+ $this->height = $this->orig_height;
+ }
+
+
+ // Choose resizing function
+ if ($this->image_library == 'imagemagick' OR $this->image_library == 'netpbm')
+ {
+ $protocol = 'image_process_'.$this->image_library;
+
+ return $this->$protocol('rotate');
+ }
+
+ if ($this->rotation_angle == 'hor' OR $this->rotation_angle == 'vrt')
+ {
+ return $this->image_mirror_gd();
+ }
+ else
+ {
+ return $this->image_rotate_gd();
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Image Process Using GD/GD2
+ *
+ * This function will resize or crop
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function image_process_gd($action = 'resize')
+ {
+ $v2_override = FALSE;
+
+ // If the target width/height match the source, AND if the new file name is not equal to the old file name
+ // we'll simply make a copy of the original with the new name... assuming dynamic rendering is off.
+ if ($this->dynamic_output === FALSE)
+ {
+ if ($this->orig_width == $this->width AND $this->orig_height == $this->height)
+ {
+ if ($this->source_image != $this->new_image)
+ {
+ if (@copy($this->full_src_path, $this->full_dst_path))
+ {
+ @chmod($this->full_dst_path, DIR_WRITE_MODE);
+ }
+ }
+
+ return TRUE;
+ }
+ }
+
+ // Let's set up our values based on the action
+ if ($action == 'crop')
+ {
+ // Reassign the source width/height if cropping
+ $this->orig_width = $this->width;
+ $this->orig_height = $this->height;
+
+ // GD 2.0 has a cropping bug so we'll test for it
+ if ($this->gd_version() !== FALSE)
+ {
+ $gd_version = str_replace('0', '', $this->gd_version());
+ $v2_override = ($gd_version == 2) ? TRUE : FALSE;
+ }
+ }
+ else
+ {
+ // If resizing the x/y axis must be zero
+ $this->x_axis = 0;
+ $this->y_axis = 0;
+ }
+
+ // Create the image handle
+ if ( ! ($src_img = $this->image_create_gd()))
+ {
+ return FALSE;
+ }
+
+ // Create The Image
+ //
+ // old conditional which users report cause problems with shared GD libs who report themselves as "2.0 or greater"
+ // it appears that this is no longer the issue that it was in 2004, so we've removed it, retaining it in the comment
+ // below should that ever prove inaccurate.
+ //
+ // if ($this->image_library == 'gd2' AND function_exists('imagecreatetruecolor') AND $v2_override == FALSE)
+ if ($this->image_library == 'gd2' AND function_exists('imagecreatetruecolor'))
+ {
+ $create = 'imagecreatetruecolor';
+ $copy = 'imagecopyresampled';
+ }
+ else
+ {
+ $create = 'imagecreate';
+ $copy = 'imagecopyresized';
+ }
+
+ $dst_img = $create($this->width, $this->height);
+ $copy($dst_img, $src_img, 0, 0, $this->x_axis, $this->y_axis, $this->width, $this->height, $this->orig_width, $this->orig_height);
+
+ // Show the image
+ if ($this->dynamic_output == TRUE)
+ {
+ $this->image_display_gd($dst_img);
+ }
+ else
+ {
+ // Or save it
+ if ( ! $this->image_save_gd($dst_img))
+ {
+ return FALSE;
+ }
+ }
+
+ // Kill the file handles
+ imagedestroy($dst_img);
+ imagedestroy($src_img);
+
+ // Set the file to 777
+ @chmod($this->full_dst_path, DIR_WRITE_MODE);
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Image Process Using ImageMagick
+ *
+ * This function will resize, crop or rotate
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function image_process_imagemagick($action = 'resize')
+ {
+ // Do we have a vaild library path?
+ if ($this->library_path == '')
+ {
+ $this->set_error('imglib_libpath_invalid');
+ return FALSE;
+ }
+
+ if ( ! eregi("convert$", $this->library_path))
+ {
+ if ( ! eregi("/$", $this->library_path)) $this->library_path .= "/";
+
+ $this->library_path .= 'convert';
+ }
+
+ // Execute the command
+ $cmd = $this->library_path." -quality ".$this->quality;
+
+ if ($action == 'crop')
+ {
+ $cmd .= " -crop ".$this->width."x".$this->height."+".$this->x_axis."+".$this->y_axis." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1";
+ }
+ elseif ($action == 'rotate')
+ {
+ switch ($this->rotation_angle)
+ {
+ case 'hor' : $angle = '-flop';
+ break;
+ case 'vrt' : $angle = '-flip';
+ break;
+ default : $angle = '-rotate '.$this->rotation_angle;
+ break;
+ }
+
+ $cmd .= " ".$angle." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1";
+ }
+ else // Resize
+ {
+ $cmd .= " -resize ".$this->width."x".$this->height." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1";
+ }
+
+ $retval = 1;
+
+ @exec($cmd, $output, $retval);
+
+ // Did it work?
+ if ($retval > 0)
+ {
+ $this->set_error('imglib_image_process_failed');
+ return FALSE;
+ }
+
+ // Set the file to 777
+ @chmod($this->full_dst_path, DIR_WRITE_MODE);
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Image Process Using NetPBM
+ *
+ * This function will resize, crop or rotate
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function image_process_netpbm($action = 'resize')
+ {
+ if ($this->library_path == '')
+ {
+ $this->set_error('imglib_libpath_invalid');
+ return FALSE;
+ }
+
+ // Build the resizing command
+ switch ($this->image_type)
+ {
+ case 1 :
+ $cmd_in = 'giftopnm';
+ $cmd_out = 'ppmtogif';
+ break;
+ case 2 :
+ $cmd_in = 'jpegtopnm';
+ $cmd_out = 'ppmtojpeg';
+ break;
+ case 3 :
+ $cmd_in = 'pngtopnm';
+ $cmd_out = 'ppmtopng';
+ break;
+ }
+
+ if ($action == 'crop')
+ {
+ $cmd_inner = 'pnmcut -left '.$this->x_axis.' -top '.$this->y_axis.' -width '.$this->width.' -height '.$this->height;
+ }
+ elseif ($action == 'rotate')
+ {
+ switch ($this->rotation_angle)
+ {
+ case 90 : $angle = 'r270';
+ break;
+ case 180 : $angle = 'r180';
+ break;
+ case 270 : $angle = 'r90';
+ break;
+ case 'vrt' : $angle = 'tb';
+ break;
+ case 'hor' : $angle = 'lr';
+ break;
+ }
+
+ $cmd_inner = 'pnmflip -'.$angle.' ';
+ }
+ else // Resize
+ {
+ $cmd_inner = 'pnmscale -xysize '.$this->width.' '.$this->height;
+ }
+
+ $cmd = $this->library_path.$cmd_in.' '.$this->full_src_path.' | '.$cmd_inner.' | '.$cmd_out.' > '.$this->dest_folder.'netpbm.tmp';
+
+ $retval = 1;
+
+ @exec($cmd, $output, $retval);
+
+ // Did it work?
+ if ($retval > 0)
+ {
+ $this->set_error('imglib_image_process_failed');
+ return FALSE;
+ }
+
+ // With NetPBM we have to create a temporary image.
+ // If you try manipulating the original it fails so
+ // we have to rename the temp file.
+ copy ($this->dest_folder.'netpbm.tmp', $this->full_dst_path);
+ unlink ($this->dest_folder.'netpbm.tmp');
+ @chmod($this->full_dst_path, DIR_WRITE_MODE);
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Image Rotate Using GD
+ *
+ * @access public
+ * @return bool
+ */
+ function image_rotate_gd()
+ {
+ // Is Image Rotation Supported?
+ // this function is only supported as of PHP 4.3
+ if ( ! function_exists('imagerotate'))
+ {
+ $this->set_error('imglib_rotate_unsupported');
+ return FALSE;
+ }
+
+ // Create the image handle
+ if ( ! ($src_img = $this->image_create_gd()))
+ {
+ return FALSE;
+ }
+
+ // Set the background color
+ // This won't work with transparent PNG files so we are
+ // going to have to figure out how to determine the color
+ // of the alpha channel in a future release.
+
+ $white = imagecolorallocate($src_img, 255, 255, 255);
+
+ // Rotate it!
+ $dst_img = imagerotate($src_img, $this->rotation_angle, $white);
+
+ // Save the Image
+ if ($this->dynamic_output == TRUE)
+ {
+ $this->image_display_gd($dst_img);
+ }
+ else
+ {
+ // Or save it
+ if ( ! $this->image_save_gd($dst_img))
+ {
+ return FALSE;
+ }
+ }
+
+ // Kill the file handles
+ imagedestroy($dst_img);
+ imagedestroy($src_img);
+
+ // Set the file to 777
+
+ @chmod($this->full_dst_path, DIR_WRITE_MODE);
+
+ return true;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create Mirror Image using GD
+ *
+ * This function will flip horizontal or vertical
+ *
+ * @access public
+ * @return bool
+ */
+ function image_mirror_gd()
+ {
+ if ( ! $src_img = $this->image_create_gd())
+ {
+ return FALSE;
+ }
+
+ $width = $this->orig_width;
+ $height = $this->orig_height;
+
+ if ($this->rotation_angle == 'hor')
+ {
+ for ($i = 0; $i < $height; $i++)
+ {
+ $left = 0;
+ $right = $width-1;
+
+ while ($left < $right)
+ {
+ $cl = imagecolorat($src_img, $left, $i);
+ $cr = imagecolorat($src_img, $right, $i);
+
+ imagesetpixel($src_img, $left, $i, $cr);
+ imagesetpixel($src_img, $right, $i, $cl);
+
+ $left++;
+ $right--;
+ }
+ }
+ }
+ else
+ {
+ for ($i = 0; $i < $width; $i++)
+ {
+ $top = 0;
+ $bot = $height-1;
+
+ while ($top < $bot)
+ {
+ $ct = imagecolorat($src_img, $i, $top);
+ $cb = imagecolorat($src_img, $i, $bot);
+
+ imagesetpixel($src_img, $i, $top, $cb);
+ imagesetpixel($src_img, $i, $bot, $ct);
+
+ $top++;
+ $bot--;
+ }
+ }
+ }
+
+ // Show the image
+ if ($this->dynamic_output == TRUE)
+ {
+ $this->image_display_gd($src_img);
+ }
+ else
+ {
+ // Or save it
+ if ( ! $this->image_save_gd($src_img))
+ {
+ return FALSE;
+ }
+ }
+
+ // Kill the file handles
+ imagedestroy($src_img);
+
+ // Set the file to 777
+ @chmod($this->full_dst_path, DIR_WRITE_MODE);
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Image Watermark
+ *
+ * This is a wrapper function that chooses the type
+ * of watermarking based on the specified preference.
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function watermark()
+ {
+ if ($this->wm_type == 'overlay')
+ {
+ return $this->overlay_watermark();
+ }
+ else
+ {
+ return $this->text_watermark();
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Watermark - Graphic Version
+ *
+ * @access public
+ * @return bool
+ */
+ function overlay_watermark()
+ {
+ if ( ! function_exists('imagecolortransparent'))
+ {
+ $this->set_error('imglib_gd_required');
+ return FALSE;
+ }
+
+ // Fetch source image properties
+ $this->get_image_properties();
+
+ // Fetch watermark image properties
+ $props = $this->get_image_properties($this->wm_overlay_path, TRUE);
+ $wm_img_type = $props['image_type'];
+ $wm_width = $props['width'];
+ $wm_height = $props['height'];
+
+ // Create two image resources
+ $wm_img = $this->image_create_gd($this->wm_overlay_path, $wm_img_type);
+ $src_img = $this->image_create_gd($this->full_src_path);
+
+ // Reverse the offset if necessary
+ // When the image is positioned at the bottom
+ // we don't want the vertical offset to push it
+ // further down. We want the reverse, so we'll
+ // invert the offset. Same with the horizontal
+ // offset when the image is at the right
+
+ $this->wm_vrt_alignment = strtoupper(substr($this->wm_vrt_alignment, 0, 1));
+ $this->wm_hor_alignment = strtoupper(substr($this->wm_hor_alignment, 0, 1));
+
+ if ($this->wm_vrt_alignment == 'B')
+ $this->wm_vrt_offset = $this->wm_vrt_offset * -1;
+
+ if ($this->wm_hor_alignment == 'R')
+ $this->wm_hor_offset = $this->wm_hor_offset * -1;
+
+ // Set the base x and y axis values
+ $x_axis = $this->wm_hor_offset + $this->wm_padding;
+ $y_axis = $this->wm_vrt_offset + $this->wm_padding;
+
+ // Set the vertical position
+ switch ($this->wm_vrt_alignment)
+ {
+ case 'T':
+ break;
+ case 'M': $y_axis += ($this->orig_height / 2) - ($wm_height / 2);
+ break;
+ case 'B': $y_axis += $this->orig_height - $wm_height;
+ break;
+ }
+
+ // Set the horizontal position
+ switch ($this->wm_hor_alignment)
+ {
+ case 'L':
+ break;
+ case 'C': $x_axis += ($this->orig_width / 2) - ($wm_width / 2);
+ break;
+ case 'R': $x_axis += $this->orig_width - $wm_width;
+ break;
+ }
+
+ // Build the finalized image
+ if ($wm_img_type == 3 AND function_exists('imagealphablending'))
+ {
+ @imagealphablending($src_img, TRUE);
+ }
+
+ // Set RGB values for text and shadow
+ $rgba = imagecolorat($wm_img, $this->wm_x_transp, $this->wm_y_transp);
+ $alpha = ($rgba & 0x7F000000) >> 24;
+
+ // make a best guess as to whether we're dealing with an image with alpha transparency or no/binary transparency
+ if ($alpha > 0)
+ {
+ // copy the image directly, the image's alpha transparency being the sole determinant of blending
+ imagecopy($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height);
+ }
+ else
+ {
+ // set our RGB value from above to be transparent and merge the images with the specified opacity
+ imagecolortransparent($wm_img, imagecolorat($wm_img, $this->wm_x_transp, $this->wm_y_transp));
+ imagecopymerge($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height, $this->wm_opacity);
+ }
+
+ // Output the image
+ if ($this->dynamic_output == TRUE)
+ {
+ $this->image_display_gd($src_img);
+ }
+ else
+ {
+ if ( ! $this->image_save_gd($src_img))
+ {
+ return FALSE;
+ }
+ }
+
+ imagedestroy($src_img);
+ imagedestroy($wm_img);
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Watermark - Text Version
+ *
+ * @access public
+ * @return bool
+ */
+ function text_watermark()
+ {
+ if ( ! ($src_img = $this->image_create_gd()))
+ {
+ return FALSE;
+ }
+
+ if ($this->wm_use_truetype == TRUE AND ! file_exists($this->wm_font_path))
+ {
+ $this->set_error('imglib_missing_font');
+ return FALSE;
+ }
+
+ // Fetch source image properties
+ $this->get_image_properties();
+
+ // Set RGB values for text and shadow
+ $this->wm_font_color = str_replace('#', '', $this->wm_font_color);
+ $this->wm_shadow_color = str_replace('#', '', $this->wm_shadow_color);
+
+ $R1 = hexdec(substr($this->wm_font_color, 0, 2));
+ $G1 = hexdec(substr($this->wm_font_color, 2, 2));
+ $B1 = hexdec(substr($this->wm_font_color, 4, 2));
+
+ $R2 = hexdec(substr($this->wm_shadow_color, 0, 2));
+ $G2 = hexdec(substr($this->wm_shadow_color, 2, 2));
+ $B2 = hexdec(substr($this->wm_shadow_color, 4, 2));
+
+ $txt_color = imagecolorclosest($src_img, $R1, $G1, $B1);
+ $drp_color = imagecolorclosest($src_img, $R2, $G2, $B2);
+
+ // Reverse the vertical offset
+ // When the image is positioned at the bottom
+ // we don't want the vertical offset to push it
+ // further down. We want the reverse, so we'll
+ // invert the offset. Note: The horizontal
+ // offset flips itself automatically
+
+ if ($this->wm_vrt_alignment == 'B')
+ $this->wm_vrt_offset = $this->wm_vrt_offset * -1;
+
+ if ($this->wm_hor_alignment == 'R')
+ $this->wm_hor_offset = $this->wm_hor_offset * -1;
+
+ // Set font width and height
+ // These are calculated differently depending on
+ // whether we are using the true type font or not
+ if ($this->wm_use_truetype == TRUE)
+ {
+ if ($this->wm_font_size == '')
+ $this->wm_font_size = '17';
+
+ $fontwidth = $this->wm_font_size-($this->wm_font_size/4);
+ $fontheight = $this->wm_font_size;
+ $this->wm_vrt_offset += $this->wm_font_size;
+ }
+ else
+ {
+ $fontwidth = imagefontwidth($this->wm_font_size);
+ $fontheight = imagefontheight($this->wm_font_size);
+ }
+
+ // Set base X and Y axis values
+ $x_axis = $this->wm_hor_offset + $this->wm_padding;
+ $y_axis = $this->wm_vrt_offset + $this->wm_padding;
+
+ // Set verticle alignment
+ if ($this->wm_use_drop_shadow == FALSE)
+ $this->wm_shadow_distance = 0;
+
+ $this->wm_vrt_alignment = strtoupper(substr($this->wm_vrt_alignment, 0, 1));
+ $this->wm_hor_alignment = strtoupper(substr($this->wm_hor_alignment, 0, 1));
+
+ switch ($this->wm_vrt_alignment)
+ {
+ case "T" :
+ break;
+ case "M": $y_axis += ($this->orig_height/2)+($fontheight/2);
+ break;
+ case "B": $y_axis += ($this->orig_height - $fontheight - $this->wm_shadow_distance - ($fontheight/2));
+ break;
+ }
+
+ $x_shad = $x_axis + $this->wm_shadow_distance;
+ $y_shad = $y_axis + $this->wm_shadow_distance;
+
+ // Set horizontal alignment
+ switch ($this->wm_hor_alignment)
+ {
+ case "L":
+ break;
+ case "R":
+ if ($this->wm_use_drop_shadow)
+ $x_shad += ($this->orig_width - $fontwidth*strlen($this->wm_text));
+ $x_axis += ($this->orig_width - $fontwidth*strlen($this->wm_text));
+ break;
+ case "C":
+ if ($this->wm_use_drop_shadow)
+ $x_shad += floor(($this->orig_width - $fontwidth*strlen($this->wm_text))/2);
+ $x_axis += floor(($this->orig_width -$fontwidth*strlen($this->wm_text))/2);
+ break;
+ }
+
+ // Add the text to the source image
+ if ($this->wm_use_truetype)
+ {
+ if ($this->wm_use_drop_shadow)
+ imagettftext($src_img, $this->wm_font_size, 0, $x_shad, $y_shad, $drp_color, $this->wm_font_path, $this->wm_text);
+ imagettftext($src_img, $this->wm_font_size, 0, $x_axis, $y_axis, $txt_color, $this->wm_font_path, $this->wm_text);
+ }
+ else
+ {
+ if ($this->wm_use_drop_shadow)
+ imagestring($src_img, $this->wm_font_size, $x_shad, $y_shad, $this->wm_text, $drp_color);
+ imagestring($src_img, $this->wm_font_size, $x_axis, $y_axis, $this->wm_text, $txt_color);
+ }
+
+ // Output the final image
+ if ($this->dynamic_output == TRUE)
+ {
+ $this->image_display_gd($src_img);
+ }
+ else
+ {
+ $this->image_save_gd($src_img);
+ }
+
+ imagedestroy($src_img);
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create Image - GD
+ *
+ * This simply creates an image resource handle
+ * based on the type of image being processed
+ *
+ * @access public
+ * @param string
+ * @return resource
+ */
+ function image_create_gd($path = '', $image_type = '')
+ {
+ if ($path == '')
+ $path = $this->full_src_path;
+
+ if ($image_type == '')
+ $image_type = $this->image_type;
+
+
+ switch ($image_type)
+ {
+ case 1 :
+ if ( ! function_exists('imagecreatefromgif'))
+ {
+ $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_gif_not_supported'));
+ return FALSE;
+ }
+
+ return imagecreatefromgif($path);
+ break;
+ case 2 :
+ if ( ! function_exists('imagecreatefromjpeg'))
+ {
+ $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_jpg_not_supported'));
+ return FALSE;
+ }
+
+ return imagecreatefromjpeg($path);
+ break;
+ case 3 :
+ if ( ! function_exists('imagecreatefrompng'))
+ {
+ $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_png_not_supported'));
+ return FALSE;
+ }
+
+ return imagecreatefrompng($path);
+ break;
+
+ }
+
+ $this->set_error(array('imglib_unsupported_imagecreate'));
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Write image file to disk - GD
+ *
+ * Takes an image resource as input and writes the file
+ * to the specified destination
+ *
+ * @access public
+ * @param resource
+ * @return bool
+ */
+ function image_save_gd($resource)
+ {
+ switch ($this->image_type)
+ {
+ case 1 :
+ if ( ! function_exists('imagegif'))
+ {
+ $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_gif_not_supported'));
+ return FALSE;
+ }
+
+ @imagegif($resource, $this->full_dst_path);
+ break;
+ case 2 :
+ if ( ! function_exists('imagejpeg'))
+ {
+ $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_jpg_not_supported'));
+ return FALSE;
+ }
+
+ if (phpversion() == '4.4.1')
+ {
+ @touch($this->full_dst_path); // PHP 4.4.1 bug #35060 - workaround
+ }
+
+ @imagejpeg($resource, $this->full_dst_path, $this->quality);
+ break;
+ case 3 :
+ if ( ! function_exists('imagepng'))
+ {
+ $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_png_not_supported'));
+ return FALSE;
+ }
+
+ @imagepng($resource, $this->full_dst_path);
+ break;
+ default :
+ $this->set_error(array('imglib_unsupported_imagecreate'));
+ return FALSE;
+ break;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Dynamically outputs an image
+ *
+ * @access public
+ * @param resource
+ * @return void
+ */
+ function image_display_gd($resource)
+ {
+ header("Content-Disposition: filename={$this->source_image};");
+ header("Content-Type: {$this->mime_type}");
+ header('Content-Transfer-Encoding: binary');
+ header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');
+
+ switch ($this->image_type)
+ {
+ case 1 : imagegif($resource);
+ break;
+ case 2 : imagejpeg($resource, '', $this->quality);
+ break;
+ case 3 : imagepng($resource);
+ break;
+ default : echo 'Unable to display the image';
+ break;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Re-proportion Image Width/Height
+ *
+ * When creating thumbs, the desired width/height
+ * can end up warping the image due to an incorrect
+ * ratio between the full-sized image and the thumb.
+ *
+ * This function lets us re-proportion the width/height
+ * if users choose to maintain the aspect ratio when resizing.
+ *
+ * @access public
+ * @return void
+ */
+ function image_reproportion()
+ {
+ if ( ! is_numeric($this->width) OR ! is_numeric($this->height) OR $this->width == 0 OR $this->height == 0)
+ return;
+
+ if ( ! is_numeric($this->orig_width) OR ! is_numeric($this->orig_height) OR $this->orig_width == 0 OR $this->orig_height == 0)
+ return;
+
+ $new_width = ceil($this->orig_width*$this->height/$this->orig_height);
+ $new_height = ceil($this->width*$this->orig_height/$this->orig_width);
+
+ $ratio = (($this->orig_height/$this->orig_width) - ($this->height/$this->width));
+
+ if ($this->master_dim != 'width' AND $this->master_dim != 'height')
+ {
+ $this->master_dim = ($ratio < 0) ? 'width' : 'height';
+ }
+
+ if (($this->width != $new_width) AND ($this->height != $new_height))
+ {
+ if ($this->master_dim == 'height')
+ {
+ $this->width = $new_width;
+ }
+ else
+ {
+ $this->height = $new_height;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get image properties
+ *
+ * A helper function that gets info about the file
+ *
+ * @access public
+ * @param string
+ * @return mixed
+ */
+ function get_image_properties($path = '', $return = FALSE)
+ {
+ // For now we require GD but we should
+ // find a way to determine this using IM or NetPBM
+
+ if ($path == '')
+ $path = $this->full_src_path;
+
+ if ( ! file_exists($path))
+ {
+ $this->set_error('imglib_invalid_path');
+ return FALSE;
+ }
+
+ $vals = @getimagesize($path);
+
+ $types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png');
+
+ $mime = (isset($types[$vals['2']])) ? 'image/'.$types[$vals['2']] : 'image/jpg';
+
+ if ($return == TRUE)
+ {
+ $v['width'] = $vals['0'];
+ $v['height'] = $vals['1'];
+ $v['image_type'] = $vals['2'];
+ $v['size_str'] = $vals['3'];
+ $v['mime_type'] = $mime;
+
+ return $v;
+ }
+
+ $this->orig_width = $vals['0'];
+ $this->orig_height = $vals['1'];
+ $this->image_type = $vals['2'];
+ $this->size_str = $vals['3'];
+ $this->mime_type = $mime;
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Size calculator
+ *
+ * This function takes a known width x height and
+ * recalculates it to a new size. Only one
+ * new variable needs to be known
+ *
+ * $props = array(
+ * 'width' => $width,
+ * 'height' => $height,
+ * 'new_width' => 40,
+ * 'new_height' => ''
+ * );
+ *
+ * @access public
+ * @param array
+ * @return array
+ */
+ function size_calculator($vals)
+ {
+ if ( ! is_array($vals))
+ return;
+
+ $allowed = array('new_width', 'new_height', 'width', 'height');
+
+ foreach ($allowed as $item)
+ {
+ if ( ! isset($vals[$item]) OR $vals[$item] == '')
+ $vals[$item] = 0;
+ }
+
+ if ($vals['width'] == 0 OR $vals['height'] == 0)
+ {
+ return $vals;
+ }
+
+ if ($vals['new_width'] == 0)
+ {
+ $vals['new_width'] = ceil($vals['width']*$vals['new_height']/$vals['height']);
+ }
+ elseif ($vals['new_height'] == 0)
+ {
+ $vals['new_height'] = ceil($vals['new_width']*$vals['height']/$vals['width']);
+ }
+
+ return $vals;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Explode source_image
+ *
+ * This is a helper function that extracts the extension
+ * from the source_image. This function lets us deal with
+ * source_images with multiple periods, like: my.cool.jpg
+ * It returns an associative array with two elements:
+ * $array['ext'] = '.jpg';
+ * $array['name'] = 'my.cool';
+ *
+ * @access public
+ * @param array
+ * @return array
+ */
+ function explode_name($source_image)
+ {
+ $x = explode('.', $source_image);
+ $ret['ext'] = '.'.end($x);
+
+ $name = '';
+
+ $ct = count($x)-1;
+
+ for ($i = 0; $i < $ct; $i++)
+ {
+ $name .= $x[$i];
+
+ if ($i < ($ct - 1))
+ {
+ $name .= '.';
+ }
+ }
+
+ $ret['name'] = $name;
+
+ return $ret;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Is GD Installed?
+ *
+ * @access public
+ * @return bool
+ */
+ function gd_loaded()
+ {
+ if ( ! extension_loaded('gd'))
+ {
+ if ( ! dl('gd.so'))
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get GD version
+ *
+ * @access public
+ * @return mixed
+ */
+ function gd_version()
+ {
+ if (function_exists('gd_info'))
+ {
+ $gd_version = @gd_info();
+ $gd_version = preg_replace("/\D/", "", $gd_version['GD Version']);
+
+ return $gd_version;
+ }
+
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set error message
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_error($msg)
+ {
+ $CI =& get_instance();
+ $CI->lang->load('imglib');
+
+ if (is_array($msg))
+ {
+ foreach ($msg as $val)
+ {
+
+ $msg = ($CI->lang->line($val) == FALSE) ? $val : $CI->lang->line($val);
+ $this->error_msg[] = $msg;
+ log_message('error', $msg);
+ }
+ }
+ else
+ {
+ $msg = ($CI->lang->line($msg) == FALSE) ? $msg : $CI->lang->line($msg);
+ $this->error_msg[] = $msg;
+ log_message('error', $msg);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show error messages
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function display_errors($open = '<p>', $close = '</p>')
+ {
+ $str = '';
+ foreach ($this->error_msg as $val)
+ {
+ $str .= $open.$val.$close;
+ }
+
+ return $str;
+ }
+
+}
+// END Image_lib Class
+
+/* End of file Image_lib.php */
/* Location: ./system/libraries/Image_lib.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Input Class\r
- *\r
- * Pre-processes global input data for security\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Input\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/input.html\r
- */\r
-class CI_Input {\r
- var $use_xss_clean = FALSE;\r
- var $xss_hash = '';\r
- var $ip_address = FALSE;\r
- var $user_agent = FALSE;\r
- var $allow_get_array = FALSE;\r
- \r
- /* never allowed, string replacement */\r
- var $never_allowed_str = array(\r
- 'document.cookie' => '[removed]',\r
- 'document.write' => '[removed]',\r
- '.parentNode' => '[removed]',\r
- '.innerHTML' => '[removed]',\r
- 'window.location' => '[removed]',\r
- '-moz-binding' => '[removed]',\r
- '<!--' => '<!--',\r
- '-->' => '-->',\r
- '<![CDATA[' => '<![CDATA['\r
- );\r
- /* never allowed, regex replacement */\r
- var $never_allowed_regex = array(\r
- "javascript\s*:" => '[removed]',\r
- "expression\s*\(" => '[removed]', // CSS and IE\r
- "Redirect\s+302" => '[removed]'\r
- );\r
- \r
- /**\r
- * Constructor\r
- *\r
- * Sets whether to globally enable the XSS processing\r
- * and whether to allow the $_GET array\r
- *\r
- * @access public\r
- */\r
- function CI_Input()\r
- {\r
- log_message('debug', "Input Class Initialized");\r
-\r
- $CFG =& load_class('Config');\r
- $this->use_xss_clean = ($CFG->item('global_xss_filtering') === TRUE) ? TRUE : FALSE;\r
- $this->allow_get_array = ($CFG->item('enable_query_strings') === TRUE) ? TRUE : FALSE;\r
- $this->_sanitize_globals();\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Sanitize Globals\r
- *\r
- * This function does the following:\r
- *\r
- * Unsets $_GET data (if query strings are not enabled)\r
- *\r
- * Unsets all globals if register_globals is enabled\r
- *\r
- * Standardizes newline characters to \n\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _sanitize_globals()\r
- {\r
- // Would kind of be "wrong" to unset any of these GLOBALS\r
- $protected = array('_SERVER', '_GET', '_POST', '_FILES', '_REQUEST', '_SESSION', '_ENV', 'GLOBALS', 'HTTP_RAW_POST_DATA',\r
- 'system_folder', 'application_folder', 'BM', 'EXT', 'CFG', 'URI', 'RTR', 'OUT', 'IN');\r
-\r
- // Unset globals for security. \r
- // This is effectively the same as register_globals = off\r
- foreach (array($_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_ENV, (isset($_SESSION) && is_array($_SESSION)) ? $_SESSION : array()) as $global)\r
- {\r
- if ( ! is_array($global))\r
- {\r
- if ( ! in_array($global, $protected))\r
- {\r
- unset($GLOBALS[$global]);\r
- }\r
- }\r
- else\r
- {\r
- foreach ($global as $key => $val)\r
- {\r
- if ( ! in_array($key, $protected))\r
- {\r
- unset($GLOBALS[$key]);\r
- }\r
- \r
- if (is_array($val))\r
- {\r
- foreach($val as $k => $v)\r
- {\r
- if ( ! in_array($k, $protected))\r
- {\r
- unset($GLOBALS[$k]);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- // Is $_GET data allowed? If not we'll set the $_GET to an empty array\r
- if ($this->allow_get_array == FALSE)\r
- {\r
- $_GET = array();\r
- }\r
- else\r
- {\r
- $_GET = $this->_clean_input_data($_GET);\r
- }\r
-\r
- // Clean $_POST Data\r
- $_POST = $this->_clean_input_data($_POST);\r
- \r
- // Clean $_COOKIE Data\r
- // Also get rid of specially treated cookies that might be set by a server\r
- // or silly application, that are of no use to a CI application anyway\r
- // but that when present will trip our 'Disallowed Key Characters' alarm\r
- // http://www.ietf.org/rfc/rfc2109.txt\r
- // note that the key names below are single quoted strings, and are not PHP variables\r
- unset($_COOKIE['$Version']);\r
- unset($_COOKIE['$Path']);\r
- unset($_COOKIE['$Domain']);\r
- $_COOKIE = $this->_clean_input_data($_COOKIE);\r
-\r
- log_message('debug', "Global POST and COOKIE data sanitized");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Clean Input Data\r
- *\r
- * This is a helper function. It escapes data and\r
- * standardizes newline characters to \n\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _clean_input_data($str)\r
- {\r
- if (is_array($str))\r
- {\r
- $new_array = array();\r
- foreach ($str as $key => $val)\r
- {\r
- $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);\r
- }\r
- return $new_array;\r
- }\r
-\r
- // We strip slashes if magic quotes is on to keep things consistent\r
- if (get_magic_quotes_gpc())\r
- {\r
- $str = stripslashes($str);\r
- }\r
-\r
- // Should we filter the input data?\r
- if ($this->use_xss_clean === TRUE)\r
- {\r
- $str = $this->xss_clean($str);\r
- }\r
-\r
- // Standardize newlines\r
- if (strpos($str, "\r") !== FALSE)\r
- {\r
- $str = str_replace(array("\r\n", "\r"), "\n", $str);\r
- }\r
- \r
- return $str;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Clean Keys\r
- *\r
- * This is a helper function. To prevent malicious users\r
- * from trying to exploit keys we make sure that keys are\r
- * only named with alpha-numeric text and a few other items.\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _clean_input_keys($str)\r
- {\r
- if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))\r
- {\r
- exit('Disallowed Key Characters.');\r
- }\r
-\r
- return $str;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch from array\r
- *\r
- * This is a helper function to retrieve values from global arrays\r
- *\r
- * @access private\r
- * @param array\r
- * @param string\r
- * @param bool\r
- * @return string\r
- */\r
- function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)\r
- {\r
- if ( ! isset($array[$index]))\r
- {\r
- return FALSE;\r
- }\r
-\r
- if ($xss_clean === TRUE)\r
- {\r
- return $this->xss_clean($array[$index]);\r
- }\r
-\r
- return $array[$index];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch an item from the GET array\r
- *\r
- * @access public\r
- * @param string\r
- * @param bool\r
- * @return string\r
- */\r
- function get($index = '', $xss_clean = FALSE)\r
- {\r
- return $this->_fetch_from_array($_GET, $index, $xss_clean);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch an item from the POST array\r
- *\r
- * @access public\r
- * @param string\r
- * @param bool\r
- * @return string\r
- */\r
- function post($index = '', $xss_clean = FALSE)\r
- {\r
- return $this->_fetch_from_array($_POST, $index, $xss_clean);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch an item from either the GET array or the POST\r
- *\r
- * @access public\r
- * @param string The index key\r
- * @param bool XSS cleaning\r
- * @return string\r
- */\r
- function get_post($index = '', $xss_clean = FALSE)\r
- { \r
- if ( ! isset($_POST[$index]) )\r
- {\r
- return $this->get($index, $xss_clean);\r
- }\r
- else\r
- {\r
- return $this->post($index, $xss_clean);\r
- } \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch an item from the COOKIE array\r
- *\r
- * @access public\r
- * @param string\r
- * @param bool\r
- * @return string\r
- */\r
- function cookie($index = '', $xss_clean = FALSE)\r
- {\r
- return $this->_fetch_from_array($_COOKIE, $index, $xss_clean);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch an item from the SERVER array\r
- *\r
- * @access public\r
- * @param string\r
- * @param bool\r
- * @return string\r
- */\r
- function server($index = '', $xss_clean = FALSE)\r
- {\r
- return $this->_fetch_from_array($_SERVER, $index, $xss_clean);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch the IP Address\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function ip_address()\r
- {\r
- if ($this->ip_address !== FALSE)\r
- {\r
- return $this->ip_address;\r
- }\r
-\r
- if ($this->server('REMOTE_ADDR') AND $this->server('HTTP_CLIENT_IP'))\r
- {\r
- $this->ip_address = $_SERVER['HTTP_CLIENT_IP'];\r
- }\r
- elseif ($this->server('REMOTE_ADDR'))\r
- {\r
- $this->ip_address = $_SERVER['REMOTE_ADDR'];\r
- }\r
- elseif ($this->server('HTTP_CLIENT_IP'))\r
- {\r
- $this->ip_address = $_SERVER['HTTP_CLIENT_IP'];\r
- }\r
- elseif ($this->server('HTTP_X_FORWARDED_FOR'))\r
- {\r
- $this->ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];\r
- }\r
-\r
- if ($this->ip_address === FALSE)\r
- {\r
- $this->ip_address = '0.0.0.0';\r
- return $this->ip_address;\r
- }\r
-\r
- if (strstr($this->ip_address, ','))\r
- {\r
- $x = explode(',', $this->ip_address);\r
- $this->ip_address = end($x);\r
- }\r
-\r
- if ( ! $this->valid_ip($this->ip_address))\r
- {\r
- $this->ip_address = '0.0.0.0';\r
- }\r
- \r
- return $this->ip_address;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Validate IP Address\r
- *\r
- * Updated version suggested by Geert De Deckere\r
- * \r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function valid_ip($ip)\r
- {\r
- $ip_segments = explode('.', $ip);\r
-\r
- // Always 4 segments needed\r
- if (count($ip_segments) != 4)\r
- {\r
- return FALSE;\r
- }\r
- // IP can not start with 0\r
- if ($ip_segments[0][0] == '0')\r
- {\r
- return FALSE;\r
- }\r
- // Check each segment\r
- foreach ($ip_segments as $segment)\r
- {\r
- // IP segments must be digits and can not be \r
- // longer than 3 digits or greater then 255\r
- if ($segment == '' OR preg_match("/[^0-9]/", $segment) OR $segment > 255 OR strlen($segment) > 3)\r
- {\r
- return FALSE;\r
- }\r
- }\r
-\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * User Agent\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function user_agent()\r
- {\r
- if ($this->user_agent !== FALSE)\r
- {\r
- return $this->user_agent;\r
- }\r
-\r
- $this->user_agent = ( ! isset($_SERVER['HTTP_USER_AGENT'])) ? FALSE : $_SERVER['HTTP_USER_AGENT'];\r
-\r
- return $this->user_agent;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Filename Security\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function filename_security($str)\r
- {\r
- $bad = array(\r
- "../",\r
- "./",\r
- "<!--",\r
- "-->",\r
- "<",\r
- ">",\r
- "'",\r
- '"',\r
- '&',\r
- '$',\r
- '#',\r
- '{',\r
- '}',\r
- '[',\r
- ']',\r
- '=',\r
- ';',\r
- '?',\r
- "%20",\r
- "%22",\r
- "%3c", // <\r
- "%253c", // <\r
- "%3e", // >\r
- "%0e", // >\r
- "%28", // ( \r
- "%29", // ) \r
- "%2528", // (\r
- "%26", // &\r
- "%24", // $\r
- "%3f", // ?\r
- "%3b", // ;\r
- "%3d" // =\r
- );\r
-\r
- return stripslashes(str_replace($bad, '', $str));\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * XSS Clean\r
- *\r
- * Sanitizes data so that Cross Site Scripting Hacks can be\r
- * prevented. This function does a fair amount of work but\r
- * it is extremely thorough, designed to prevent even the\r
- * most obscure XSS attempts. Nothing is ever 100% foolproof,\r
- * of course, but I haven't been able to get anything passed\r
- * the filter.\r
- *\r
- * Note: This function should only be used to deal with data\r
- * upon submission. It's not something that should\r
- * be used for general runtime processing.\r
- *\r
- * This function was based in part on some code and ideas I\r
- * got from Bitflux: http://blog.bitflux.ch/wiki/XSS_Prevention\r
- *\r
- * To help develop this script I used this great list of\r
- * vulnerabilities along with a few other hacks I've\r
- * harvested from examining vulnerabilities in other programs:\r
- * http://ha.ckers.org/xss.html\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function xss_clean($str, $is_image = FALSE)\r
- {\r
- /*\r
- * Is the string an array?\r
- *\r
- */\r
- if (is_array($str))\r
- {\r
- while (list($key) = each($str))\r
- {\r
- $str[$key] = $this->xss_clean($str[$key]);\r
- }\r
- \r
- return $str;\r
- }\r
-\r
- /*\r
- * Remove Invisible Characters\r
- */\r
- $str = $this->_remove_invisible_characters($str);\r
-\r
- /*\r
- * Protect GET variables in URLs\r
- */\r
- \r
- // 901119URL5918AMP18930PROTECT8198\r
- \r
- $str = preg_replace('|\&([a-z\_0-9]+)\=([a-z\_0-9]+)|i', $this->xss_hash()."\\1=\\2", $str);\r
-\r
- /*\r
- * Validate standard character entities\r
- *\r
- * Add a semicolon if missing. We do this to enable\r
- * the conversion of entities to ASCII later.\r
- *\r
- */\r
- $str = preg_replace('#(&\#?[0-9a-z]{2,})[\x00-\x20]*;?#i', "\\1;", $str);\r
-\r
- /*\r
- * Validate UTF16 two byte encoding (x00) \r
- *\r
- * Just as above, adds a semicolon if missing.\r
- *\r
- */\r
- $str = preg_replace('#(&\#x?)([0-9A-F]+);?#i',"\\1\\2;",$str);\r
-\r
- /*\r
- * Un-Protect GET variables in URLs\r
- */\r
- $str = str_replace($this->xss_hash(), '&', $str);\r
-\r
- /*\r
- * URL Decode\r
- *\r
- * Just in case stuff like this is submitted:\r
- *\r
- * <a href="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">Google</a>\r
- *\r
- * Note: Use rawurldecode() so it does not remove plus signs\r
- *\r
- */\r
- $str = rawurldecode($str);\r
- \r
- /*\r
- * Convert character entities to ASCII \r
- *\r
- * This permits our tests below to work reliably.\r
- * We only convert entities that are within tags since\r
- * these are the ones that will pose security problems.\r
- *\r
- */\r
-\r
- $str = preg_replace_callback("/[a-z]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str);\r
- \r
- $str = preg_replace_callback("/<\w+.*?(?=>|<|$)/si", array($this, '_html_entity_decode_callback'), $str);\r
-\r
- /*\r
- * Remove Invisible Characters Again!\r
- */\r
- $str = $this->_remove_invisible_characters($str);\r
- \r
- /*\r
- * Convert all tabs to spaces\r
- *\r
- * This prevents strings like this: ja vascript\r
- * NOTE: we deal with spaces between characters later.\r
- * NOTE: preg_replace was found to be amazingly slow here on large blocks of data,\r
- * so we use str_replace.\r
- *\r
- */\r
- \r
- if (strpos($str, "\t") !== FALSE)\r
- {\r
- $str = str_replace("\t", ' ', $str);\r
- }\r
- \r
- /*\r
- * Capture converted string for later comparison\r
- */\r
- $converted_string = $str;\r
- \r
- /*\r
- * Not Allowed Under Any Conditions\r
- */\r
- \r
- foreach ($this->never_allowed_str as $key => $val)\r
- {\r
- $str = str_replace($key, $val, $str); \r
- }\r
- \r
- foreach ($this->never_allowed_regex as $key => $val)\r
- {\r
- $str = preg_replace("#".$key."#i", $val, $str); \r
- }\r
-\r
- /*\r
- * Makes PHP tags safe\r
- *\r
- * Note: XML tags are inadvertently replaced too:\r
- *\r
- * <?xml\r
- *\r
- * But it doesn't seem to pose a problem.\r
- *\r
- */\r
- if ($is_image === TRUE)\r
- {\r
- // Images have a tendency to have the PHP short opening and closing tags every so often\r
- // so we skip those and only do the long opening tags.\r
- $str = str_replace(array('<?php', '<?PHP'), array('<?php', '<?PHP'), $str);\r
- }\r
- else\r
- {\r
- $str = str_replace(array('<?php', '<?PHP', '<?', '?'.'>'), array('<?php', '<?PHP', '<?', '?>'), $str);\r
- }\r
- \r
- /*\r
- * Compact any exploded words\r
- *\r
- * This corrects words like: j a v a s c r i p t\r
- * These words are compacted back to their correct state.\r
- *\r
- */\r
- $words = array('javascript', 'expression', 'vbscript', 'script', 'applet', 'alert', 'document', 'write', 'cookie', 'window');\r
- foreach ($words as $word)\r
- {\r
- $temp = '';\r
- \r
- for ($i = 0, $wordlen = strlen($word); $i < $wordlen; $i++)\r
- {\r
- $temp .= substr($word, $i, 1)."\s*";\r
- }\r
-\r
- // We only want to do this when it is followed by a non-word character\r
- // That way valid stuff like "dealer to" does not become "dealerto"\r
- $str = preg_replace_callback('#('.substr($temp, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str);\r
- }\r
- \r
- /*\r
- * Remove disallowed Javascript in links or img tags\r
- * We used to do some version comparisons and use of stripos for PHP5, but it is dog slow compared\r
- * to these simplified non-capturing preg_match(), especially if the pattern exists in the string\r
- */\r
- do\r
- {\r
- $original = $str;\r
- \r
- if (preg_match("/<a/i", $str))\r
- {\r
- $str = preg_replace_callback("#<a\s+([^>]*?)(>|$)#si", array($this, '_js_link_removal'), $str);\r
- }\r
- \r
- if (preg_match("/<img/i", $str))\r
- {\r
- $str = preg_replace_callback("#<img\s+([^>]*?)(\s?/?>|$)#si", array($this, '_js_img_removal'), $str);\r
- }\r
- \r
- if (preg_match("/script/i", $str) OR preg_match("/xss/i", $str))\r
- {\r
- $str = preg_replace("#<(/*)(script|xss)(.*?)\>#si", '[removed]', $str);\r
- }\r
- }\r
- while($original != $str);\r
-\r
- unset($original);\r
-\r
- /*\r
- * Remove JavaScript Event Handlers\r
- *\r
- * Note: This code is a little blunt. It removes\r
- * the event handler and anything up to the closing >,\r
- * but it's unlikely to be a problem.\r
- *\r
- */\r
- $event_handlers = array('[^a-z_\-]on\w*','xmlns');\r
-\r
- if ($is_image === TRUE)\r
- {\r
- /*\r
- * Adobe Photoshop puts XML metadata into JFIF images, including namespacing, \r
- * so we have to allow this for images. -Paul\r
- */\r
- unset($event_handlers[array_search('xmlns', $event_handlers)]);\r
- }\r
-\r
- $str = preg_replace("#<([^><]+?)(".implode('|', $event_handlers).")(\s*=\s*[^><]*)([><]*)#i", "<\\1\\4", $str);\r
-\r
- /*\r
- * Sanitize naughty HTML elements\r
- *\r
- * If a tag containing any of the words in the list\r
- * below is found, the tag gets converted to entities.\r
- *\r
- * So this: <blink>\r
- * Becomes: <blink>\r
- *\r
- */\r
- $naughty = 'alert|applet|audio|basefont|base|behavior|bgsound|blink|body|embed|expression|form|frameset|frame|head|html|ilayer|iframe|input|isindex|layer|link|meta|object|plaintext|style|script|textarea|title|video|xml|xss';\r
- $str = preg_replace_callback('#<(/*\s*)('.$naughty.')([^><]*)([><]*)#is', array($this, '_sanitize_naughty_html'), $str);\r
-\r
- /*\r
- * Sanitize naughty scripting elements\r
- *\r
- * Similar to above, only instead of looking for\r
- * tags it looks for PHP and JavaScript commands\r
- * that are disallowed. Rather than removing the\r
- * code, it simply converts the parenthesis to entities\r
- * rendering the code un-executable.\r
- *\r
- * For example: eval('some code')\r
- * Becomes: eval('some code')\r
- *\r
- */\r
- $str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2(\\3)", $str);\r
- \r
- /*\r
- * Final clean up\r
- *\r
- * This adds a bit of extra precaution in case\r
- * something got through the above filters\r
- *\r
- */\r
- foreach ($this->never_allowed_str as $key => $val)\r
- {\r
- $str = str_replace($key, $val, $str); \r
- }\r
- \r
- foreach ($this->never_allowed_regex as $key => $val)\r
- {\r
- $str = preg_replace("#".$key."#i", $val, $str);\r
- }\r
-\r
- /*\r
- * Images are Handled in a Special Way\r
- * - Essentially, we want to know that after all of the character conversion is done whether\r
- * any unwanted, likely XSS, code was found. If not, we return TRUE, as the image is clean.\r
- * However, if the string post-conversion does not matched the string post-removal of XSS,\r
- * then it fails, as there was unwanted XSS code found and removed/changed during processing.\r
- */\r
-\r
- if ($is_image === TRUE)\r
- {\r
- if ($str == $converted_string)\r
- {\r
- return TRUE;\r
- }\r
- else\r
- {\r
- return FALSE;\r
- }\r
- }\r
- \r
- log_message('debug', "XSS Filtering completed");\r
- return $str;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Random Hash for protecting URLs\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function xss_hash()\r
- {\r
- if ($this->xss_hash == '')\r
- {\r
- if (phpversion() >= 4.2)\r
- mt_srand();\r
- else\r
- mt_srand(hexdec(substr(md5(microtime()), -8)) & 0x7fffffff);\r
-\r
- $this->xss_hash = md5(time() + mt_rand(0, 1999999999));\r
- }\r
-\r
- return $this->xss_hash;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Remove Invisible Characters\r
- *\r
- * This prevents sandwiching null characters\r
- * between ascii characters, like Java\0script.\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function _remove_invisible_characters($str)\r
- {\r
- static $non_displayables;\r
- \r
- if ( ! isset($non_displayables))\r
- {\r
- // every control character except newline (dec 10), carriage return (dec 13), and horizontal tab (dec 09),\r
- $non_displayables = array(\r
- '/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15\r
- '/%1[0-9a-f]/', // url encoded 16-31\r
- '/[\x00-\x08]/', // 00-08\r
- '/\x0b/', '/\x0c/', // 11, 12\r
- '/[\x0e-\x1f]/' // 14-31\r
- );\r
- }\r
-\r
- do\r
- {\r
- $cleaned = $str;\r
- $str = preg_replace($non_displayables, '', $str);\r
- }\r
- while ($cleaned != $str);\r
-\r
- return $str;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Compact Exploded Words\r
- *\r
- * Callback function for xss_clean() to remove whitespace from\r
- * things like j a v a s c r i p t\r
- *\r
- * @access public\r
- * @param type\r
- * @return type\r
- */\r
- function _compact_exploded_words($matches)\r
- {\r
- return preg_replace('/\s+/s', '', $matches[1]).$matches[2];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Sanitize Naughty HTML\r
- *\r
- * Callback function for xss_clean() to remove naughty HTML elements\r
- *\r
- * @access private\r
- * @param array\r
- * @return string\r
- */\r
- function _sanitize_naughty_html($matches)\r
- {\r
- // encode opening brace\r
- $str = '<'.$matches[1].$matches[2].$matches[3];\r
- \r
- // encode captured opening or closing brace to prevent recursive vectors\r
- $str .= str_replace(array('>', '<'), array('>', '<'), $matches[4]);\r
- \r
- return $str;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * JS Link Removal\r
- *\r
- * Callback function for xss_clean() to sanitize links\r
- * This limits the PCRE backtracks, making it more performance friendly\r
- * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in\r
- * PHP 5.2+ on link-heavy strings\r
- *\r
- * @access private\r
- * @param array\r
- * @return string\r
- */\r
- function _js_link_removal($match)\r
- {\r
- $attributes = $this->_filter_attributes(str_replace(array('<', '>'), '', $match[1]));\r
- return str_replace($match[1], preg_replace("#href=.*?(alert\(|alert&\#40;|javascript\:|charset\=|window\.|document\.|\.cookie|<script|<xss|base64\s*,)#si", "", $attributes), $match[0]);\r
- }\r
-\r
- /**\r
- * JS Image Removal\r
- *\r
- * Callback function for xss_clean() to sanitize image tags\r
- * This limits the PCRE backtracks, making it more performance friendly\r
- * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in\r
- * PHP 5.2+ on image tag heavy strings\r
- *\r
- * @access private\r
- * @param array\r
- * @return string\r
- */\r
- function _js_img_removal($match)\r
- {\r
- $attributes = $this->_filter_attributes(str_replace(array('<', '>'), '', $match[1]));\r
- return str_replace($match[1], preg_replace("#src=.*?(alert\(|alert&\#40;|javascript\:|charset\=|window\.|document\.|\.cookie|<script|<xss|base64\s*,)#si", "", $attributes), $match[0]);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Attribute Conversion\r
- *\r
- * Used as a callback for XSS Clean\r
- *\r
- * @access public\r
- * @param array\r
- * @return string\r
- */\r
- function _convert_attribute($match)\r
- {\r
- return str_replace(array('>', '<'), array('>', '<'), $match[0]);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * HTML Entity Decode Callback\r
- *\r
- * Used as a callback for XSS Clean\r
- *\r
- * @access public\r
- * @param array\r
- * @return string\r
- */\r
- function _html_entity_decode_callback($match)\r
- {\r
- $CFG =& load_class('Config');\r
- $charset = $CFG->item('charset');\r
-\r
- return $this->_html_entity_decode($match[0], strtoupper($charset));\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * HTML Entities Decode\r
- *\r
- * This function is a replacement for html_entity_decode()\r
- *\r
- * In some versions of PHP the native function does not work\r
- * when UTF-8 is the specified character set, so this gives us\r
- * a work-around. More info here:\r
- * http://bugs.php.net/bug.php?id=25670\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- /* -------------------------------------------------\r
- /* Replacement for html_entity_decode()\r
- /* -------------------------------------------------*/\r
-\r
- /*\r
- NOTE: html_entity_decode() has a bug in some PHP versions when UTF-8 is the\r
- character set, and the PHP developers said they were not back porting the\r
- fix to versions other than PHP 5.x.\r
- */\r
- function _html_entity_decode($str, $charset='UTF-8')\r
- {\r
- if (stristr($str, '&') === FALSE) return $str;\r
-\r
- // The reason we are not using html_entity_decode() by itself is because\r
- // while it is not technically correct to leave out the semicolon\r
- // at the end of an entity most browsers will still interpret the entity\r
- // correctly. html_entity_decode() does not convert entities without\r
- // semicolons, so we are left with our own little solution here. Bummer.\r
-\r
- if (function_exists('html_entity_decode') && (strtolower($charset) != 'utf-8' OR version_compare(phpversion(), '5.0.0', '>=')))\r
- {\r
- $str = html_entity_decode($str, ENT_COMPAT, $charset);\r
- $str = preg_replace('~&#x(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\\1"))', $str);\r
- return preg_replace('~&#([0-9]{2,4})~e', 'chr(\\1)', $str);\r
- }\r
-\r
- // Numeric Entities\r
- $str = preg_replace('~&#x(0*[0-9a-f]{2,5});{0,1}~ei', 'chr(hexdec("\\1"))', $str);\r
- $str = preg_replace('~&#([0-9]{2,4});{0,1}~e', 'chr(\\1)', $str);\r
-\r
- // Literal Entities - Slightly slow so we do another check\r
- if (stristr($str, '&') === FALSE)\r
- {\r
- $str = strtr($str, array_flip(get_html_translation_table(HTML_ENTITIES)));\r
- }\r
-\r
- return $str;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Filter Attributes\r
- *\r
- * Filters tag attributes for consistency and safety\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function _filter_attributes($str)\r
- {\r
- $out = '';\r
-\r
- if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches))\r
- {\r
- foreach ($matches[0] as $match)\r
- {\r
- $out .= "{$match}";\r
- } \r
- }\r
-\r
- return $out;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
-}\r
-// END Input class\r
-\r
-/* End of file Input.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Input Class
+ *
+ * Pre-processes global input data for security
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Input
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/input.html
+ */
+class CI_Input {
+ var $use_xss_clean = FALSE;
+ var $xss_hash = '';
+ var $ip_address = FALSE;
+ var $user_agent = FALSE;
+ var $allow_get_array = FALSE;
+
+ /* never allowed, string replacement */
+ var $never_allowed_str = array(
+ 'document.cookie' => '[removed]',
+ 'document.write' => '[removed]',
+ '.parentNode' => '[removed]',
+ '.innerHTML' => '[removed]',
+ 'window.location' => '[removed]',
+ '-moz-binding' => '[removed]',
+ '<!--' => '<!--',
+ '-->' => '-->',
+ '<![CDATA[' => '<![CDATA['
+ );
+ /* never allowed, regex replacement */
+ var $never_allowed_regex = array(
+ "javascript\s*:" => '[removed]',
+ "expression\s*\(" => '[removed]', // CSS and IE
+ "Redirect\s+302" => '[removed]'
+ );
+
+ /**
+ * Constructor
+ *
+ * Sets whether to globally enable the XSS processing
+ * and whether to allow the $_GET array
+ *
+ * @access public
+ */
+ function CI_Input()
+ {
+ log_message('debug', "Input Class Initialized");
+
+ $CFG =& load_class('Config');
+ $this->use_xss_clean = ($CFG->item('global_xss_filtering') === TRUE) ? TRUE : FALSE;
+ $this->allow_get_array = ($CFG->item('enable_query_strings') === TRUE) ? TRUE : FALSE;
+ $this->_sanitize_globals();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Sanitize Globals
+ *
+ * This function does the following:
+ *
+ * Unsets $_GET data (if query strings are not enabled)
+ *
+ * Unsets all globals if register_globals is enabled
+ *
+ * Standardizes newline characters to \n
+ *
+ * @access private
+ * @return void
+ */
+ function _sanitize_globals()
+ {
+ // Would kind of be "wrong" to unset any of these GLOBALS
+ $protected = array('_SERVER', '_GET', '_POST', '_FILES', '_REQUEST', '_SESSION', '_ENV', 'GLOBALS', 'HTTP_RAW_POST_DATA',
+ 'system_folder', 'application_folder', 'BM', 'EXT', 'CFG', 'URI', 'RTR', 'OUT', 'IN');
+
+ // Unset globals for security.
+ // This is effectively the same as register_globals = off
+ foreach (array($_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_ENV, (isset($_SESSION) && is_array($_SESSION)) ? $_SESSION : array()) as $global)
+ {
+ if ( ! is_array($global))
+ {
+ if ( ! in_array($global, $protected))
+ {
+ unset($GLOBALS[$global]);
+ }
+ }
+ else
+ {
+ foreach ($global as $key => $val)
+ {
+ if ( ! in_array($key, $protected))
+ {
+ unset($GLOBALS[$key]);
+ }
+
+ if (is_array($val))
+ {
+ foreach($val as $k => $v)
+ {
+ if ( ! in_array($k, $protected))
+ {
+ unset($GLOBALS[$k]);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Is $_GET data allowed? If not we'll set the $_GET to an empty array
+ if ($this->allow_get_array == FALSE)
+ {
+ $_GET = array();
+ }
+ else
+ {
+ $_GET = $this->_clean_input_data($_GET);
+ }
+
+ // Clean $_POST Data
+ $_POST = $this->_clean_input_data($_POST);
+
+ // Clean $_COOKIE Data
+ // Also get rid of specially treated cookies that might be set by a server
+ // or silly application, that are of no use to a CI application anyway
+ // but that when present will trip our 'Disallowed Key Characters' alarm
+ // http://www.ietf.org/rfc/rfc2109.txt
+ // note that the key names below are single quoted strings, and are not PHP variables
+ unset($_COOKIE['$Version']);
+ unset($_COOKIE['$Path']);
+ unset($_COOKIE['$Domain']);
+ $_COOKIE = $this->_clean_input_data($_COOKIE);
+
+ log_message('debug', "Global POST and COOKIE data sanitized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Clean Input Data
+ *
+ * This is a helper function. It escapes data and
+ * standardizes newline characters to \n
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _clean_input_data($str)
+ {
+ if (is_array($str))
+ {
+ $new_array = array();
+ foreach ($str as $key => $val)
+ {
+ $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
+ }
+ return $new_array;
+ }
+
+ // We strip slashes if magic quotes is on to keep things consistent
+ if (get_magic_quotes_gpc())
+ {
+ $str = stripslashes($str);
+ }
+
+ // Should we filter the input data?
+ if ($this->use_xss_clean === TRUE)
+ {
+ $str = $this->xss_clean($str);
+ }
+
+ // Standardize newlines
+ if (strpos($str, "\r") !== FALSE)
+ {
+ $str = str_replace(array("\r\n", "\r"), "\n", $str);
+ }
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Clean Keys
+ *
+ * This is a helper function. To prevent malicious users
+ * from trying to exploit keys we make sure that keys are
+ * only named with alpha-numeric text and a few other items.
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _clean_input_keys($str)
+ {
+ if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
+ {
+ exit('Disallowed Key Characters.');
+ }
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch from array
+ *
+ * This is a helper function to retrieve values from global arrays
+ *
+ * @access private
+ * @param array
+ * @param string
+ * @param bool
+ * @return string
+ */
+ function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)
+ {
+ if ( ! isset($array[$index]))
+ {
+ return FALSE;
+ }
+
+ if ($xss_clean === TRUE)
+ {
+ return $this->xss_clean($array[$index]);
+ }
+
+ return $array[$index];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch an item from the GET array
+ *
+ * @access public
+ * @param string
+ * @param bool
+ * @return string
+ */
+ function get($index = '', $xss_clean = FALSE)
+ {
+ return $this->_fetch_from_array($_GET, $index, $xss_clean);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch an item from the POST array
+ *
+ * @access public
+ * @param string
+ * @param bool
+ * @return string
+ */
+ function post($index = '', $xss_clean = FALSE)
+ {
+ return $this->_fetch_from_array($_POST, $index, $xss_clean);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch an item from either the GET array or the POST
+ *
+ * @access public
+ * @param string The index key
+ * @param bool XSS cleaning
+ * @return string
+ */
+ function get_post($index = '', $xss_clean = FALSE)
+ {
+ if ( ! isset($_POST[$index]) )
+ {
+ return $this->get($index, $xss_clean);
+ }
+ else
+ {
+ return $this->post($index, $xss_clean);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch an item from the COOKIE array
+ *
+ * @access public
+ * @param string
+ * @param bool
+ * @return string
+ */
+ function cookie($index = '', $xss_clean = FALSE)
+ {
+ return $this->_fetch_from_array($_COOKIE, $index, $xss_clean);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch an item from the SERVER array
+ *
+ * @access public
+ * @param string
+ * @param bool
+ * @return string
+ */
+ function server($index = '', $xss_clean = FALSE)
+ {
+ return $this->_fetch_from_array($_SERVER, $index, $xss_clean);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch the IP Address
+ *
+ * @access public
+ * @return string
+ */
+ function ip_address()
+ {
+ if ($this->ip_address !== FALSE)
+ {
+ return $this->ip_address;
+ }
+
+ if ($this->server('REMOTE_ADDR') AND $this->server('HTTP_CLIENT_IP'))
+ {
+ $this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
+ }
+ elseif ($this->server('REMOTE_ADDR'))
+ {
+ $this->ip_address = $_SERVER['REMOTE_ADDR'];
+ }
+ elseif ($this->server('HTTP_CLIENT_IP'))
+ {
+ $this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
+ }
+ elseif ($this->server('HTTP_X_FORWARDED_FOR'))
+ {
+ $this->ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
+ }
+
+ if ($this->ip_address === FALSE)
+ {
+ $this->ip_address = '0.0.0.0';
+ return $this->ip_address;
+ }
+
+ if (strstr($this->ip_address, ','))
+ {
+ $x = explode(',', $this->ip_address);
+ $this->ip_address = end($x);
+ }
+
+ if ( ! $this->valid_ip($this->ip_address))
+ {
+ $this->ip_address = '0.0.0.0';
+ }
+
+ return $this->ip_address;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Validate IP Address
+ *
+ * Updated version suggested by Geert De Deckere
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function valid_ip($ip)
+ {
+ $ip_segments = explode('.', $ip);
+
+ // Always 4 segments needed
+ if (count($ip_segments) != 4)
+ {
+ return FALSE;
+ }
+ // IP can not start with 0
+ if ($ip_segments[0][0] == '0')
+ {
+ return FALSE;
+ }
+ // Check each segment
+ foreach ($ip_segments as $segment)
+ {
+ // IP segments must be digits and can not be
+ // longer than 3 digits or greater then 255
+ if ($segment == '' OR preg_match("/[^0-9]/", $segment) OR $segment > 255 OR strlen($segment) > 3)
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * User Agent
+ *
+ * @access public
+ * @return string
+ */
+ function user_agent()
+ {
+ if ($this->user_agent !== FALSE)
+ {
+ return $this->user_agent;
+ }
+
+ $this->user_agent = ( ! isset($_SERVER['HTTP_USER_AGENT'])) ? FALSE : $_SERVER['HTTP_USER_AGENT'];
+
+ return $this->user_agent;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Filename Security
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function filename_security($str)
+ {
+ $bad = array(
+ "../",
+ "./",
+ "<!--",
+ "-->",
+ "<",
+ ">",
+ "'",
+ '"',
+ '&',
+ '$',
+ '#',
+ '{',
+ '}',
+ '[',
+ ']',
+ '=',
+ ';',
+ '?',
+ "%20",
+ "%22",
+ "%3c", // <
+ "%253c", // <
+ "%3e", // >
+ "%0e", // >
+ "%28", // (
+ "%29", // )
+ "%2528", // (
+ "%26", // &
+ "%24", // $
+ "%3f", // ?
+ "%3b", // ;
+ "%3d" // =
+ );
+
+ return stripslashes(str_replace($bad, '', $str));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * XSS Clean
+ *
+ * Sanitizes data so that Cross Site Scripting Hacks can be
+ * prevented. This function does a fair amount of work but
+ * it is extremely thorough, designed to prevent even the
+ * most obscure XSS attempts. Nothing is ever 100% foolproof,
+ * of course, but I haven't been able to get anything passed
+ * the filter.
+ *
+ * Note: This function should only be used to deal with data
+ * upon submission. It's not something that should
+ * be used for general runtime processing.
+ *
+ * This function was based in part on some code and ideas I
+ * got from Bitflux: http://blog.bitflux.ch/wiki/XSS_Prevention
+ *
+ * To help develop this script I used this great list of
+ * vulnerabilities along with a few other hacks I've
+ * harvested from examining vulnerabilities in other programs:
+ * http://ha.ckers.org/xss.html
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function xss_clean($str, $is_image = FALSE)
+ {
+ /*
+ * Is the string an array?
+ *
+ */
+ if (is_array($str))
+ {
+ while (list($key) = each($str))
+ {
+ $str[$key] = $this->xss_clean($str[$key]);
+ }
+
+ return $str;
+ }
+
+ /*
+ * Remove Invisible Characters
+ */
+ $str = $this->_remove_invisible_characters($str);
+
+ /*
+ * Protect GET variables in URLs
+ */
+
+ // 901119URL5918AMP18930PROTECT8198
+
+ $str = preg_replace('|\&([a-z\_0-9]+)\=([a-z\_0-9]+)|i', $this->xss_hash()."\\1=\\2", $str);
+
+ /*
+ * Validate standard character entities
+ *
+ * Add a semicolon if missing. We do this to enable
+ * the conversion of entities to ASCII later.
+ *
+ */
+ $str = preg_replace('#(&\#?[0-9a-z]{2,})[\x00-\x20]*;?#i', "\\1;", $str);
+
+ /*
+ * Validate UTF16 two byte encoding (x00)
+ *
+ * Just as above, adds a semicolon if missing.
+ *
+ */
+ $str = preg_replace('#(&\#x?)([0-9A-F]+);?#i',"\\1\\2;",$str);
+
+ /*
+ * Un-Protect GET variables in URLs
+ */
+ $str = str_replace($this->xss_hash(), '&', $str);
+
+ /*
+ * URL Decode
+ *
+ * Just in case stuff like this is submitted:
+ *
+ * <a href="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">Google</a>
+ *
+ * Note: Use rawurldecode() so it does not remove plus signs
+ *
+ */
+ $str = rawurldecode($str);
+
+ /*
+ * Convert character entities to ASCII
+ *
+ * This permits our tests below to work reliably.
+ * We only convert entities that are within tags since
+ * these are the ones that will pose security problems.
+ *
+ */
+
+ $str = preg_replace_callback("/[a-z]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str);
+
+ $str = preg_replace_callback("/<\w+.*?(?=>|<|$)/si", array($this, '_html_entity_decode_callback'), $str);
+
+ /*
+ * Remove Invisible Characters Again!
+ */
+ $str = $this->_remove_invisible_characters($str);
+
+ /*
+ * Convert all tabs to spaces
+ *
+ * This prevents strings like this: ja vascript
+ * NOTE: we deal with spaces between characters later.
+ * NOTE: preg_replace was found to be amazingly slow here on large blocks of data,
+ * so we use str_replace.
+ *
+ */
+
+ if (strpos($str, "\t") !== FALSE)
+ {
+ $str = str_replace("\t", ' ', $str);
+ }
+
+ /*
+ * Capture converted string for later comparison
+ */
+ $converted_string = $str;
+
+ /*
+ * Not Allowed Under Any Conditions
+ */
+
+ foreach ($this->never_allowed_str as $key => $val)
+ {
+ $str = str_replace($key, $val, $str);
+ }
+
+ foreach ($this->never_allowed_regex as $key => $val)
+ {
+ $str = preg_replace("#".$key."#i", $val, $str);
+ }
+
+ /*
+ * Makes PHP tags safe
+ *
+ * Note: XML tags are inadvertently replaced too:
+ *
+ * <?xml
+ *
+ * But it doesn't seem to pose a problem.
+ *
+ */
+ if ($is_image === TRUE)
+ {
+ // Images have a tendency to have the PHP short opening and closing tags every so often
+ // so we skip those and only do the long opening tags.
+ $str = str_replace(array('<?php', '<?PHP'), array('<?php', '<?PHP'), $str);
+ }
+ else
+ {
+ $str = str_replace(array('<?php', '<?PHP', '<?', '?'.'>'), array('<?php', '<?PHP', '<?', '?>'), $str);
+ }
+
+ /*
+ * Compact any exploded words
+ *
+ * This corrects words like: j a v a s c r i p t
+ * These words are compacted back to their correct state.
+ *
+ */
+ $words = array('javascript', 'expression', 'vbscript', 'script', 'applet', 'alert', 'document', 'write', 'cookie', 'window');
+ foreach ($words as $word)
+ {
+ $temp = '';
+
+ for ($i = 0, $wordlen = strlen($word); $i < $wordlen; $i++)
+ {
+ $temp .= substr($word, $i, 1)."\s*";
+ }
+
+ // We only want to do this when it is followed by a non-word character
+ // That way valid stuff like "dealer to" does not become "dealerto"
+ $str = preg_replace_callback('#('.substr($temp, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str);
+ }
+
+ /*
+ * Remove disallowed Javascript in links or img tags
+ * We used to do some version comparisons and use of stripos for PHP5, but it is dog slow compared
+ * to these simplified non-capturing preg_match(), especially if the pattern exists in the string
+ */
+ do
+ {
+ $original = $str;
+
+ if (preg_match("/<a/i", $str))
+ {
+ $str = preg_replace_callback("#<a\s+([^>]*?)(>|$)#si", array($this, '_js_link_removal'), $str);
+ }
+
+ if (preg_match("/<img/i", $str))
+ {
+ $str = preg_replace_callback("#<img\s+([^>]*?)(\s?/?>|$)#si", array($this, '_js_img_removal'), $str);
+ }
+
+ if (preg_match("/script/i", $str) OR preg_match("/xss/i", $str))
+ {
+ $str = preg_replace("#<(/*)(script|xss)(.*?)\>#si", '[removed]', $str);
+ }
+ }
+ while($original != $str);
+
+ unset($original);
+
+ /*
+ * Remove JavaScript Event Handlers
+ *
+ * Note: This code is a little blunt. It removes
+ * the event handler and anything up to the closing >,
+ * but it's unlikely to be a problem.
+ *
+ */
+ $event_handlers = array('[^a-z_\-]on\w*','xmlns');
+
+ if ($is_image === TRUE)
+ {
+ /*
+ * Adobe Photoshop puts XML metadata into JFIF images, including namespacing,
+ * so we have to allow this for images. -Paul
+ */
+ unset($event_handlers[array_search('xmlns', $event_handlers)]);
+ }
+
+ $str = preg_replace("#<([^><]+?)(".implode('|', $event_handlers).")(\s*=\s*[^><]*)([><]*)#i", "<\\1\\4", $str);
+
+ /*
+ * Sanitize naughty HTML elements
+ *
+ * If a tag containing any of the words in the list
+ * below is found, the tag gets converted to entities.
+ *
+ * So this: <blink>
+ * Becomes: <blink>
+ *
+ */
+ $naughty = 'alert|applet|audio|basefont|base|behavior|bgsound|blink|body|embed|expression|form|frameset|frame|head|html|ilayer|iframe|input|isindex|layer|link|meta|object|plaintext|style|script|textarea|title|video|xml|xss';
+ $str = preg_replace_callback('#<(/*\s*)('.$naughty.')([^><]*)([><]*)#is', array($this, '_sanitize_naughty_html'), $str);
+
+ /*
+ * Sanitize naughty scripting elements
+ *
+ * Similar to above, only instead of looking for
+ * tags it looks for PHP and JavaScript commands
+ * that are disallowed. Rather than removing the
+ * code, it simply converts the parenthesis to entities
+ * rendering the code un-executable.
+ *
+ * For example: eval('some code')
+ * Becomes: eval('some code')
+ *
+ */
+ $str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2(\\3)", $str);
+
+ /*
+ * Final clean up
+ *
+ * This adds a bit of extra precaution in case
+ * something got through the above filters
+ *
+ */
+ foreach ($this->never_allowed_str as $key => $val)
+ {
+ $str = str_replace($key, $val, $str);
+ }
+
+ foreach ($this->never_allowed_regex as $key => $val)
+ {
+ $str = preg_replace("#".$key."#i", $val, $str);
+ }
+
+ /*
+ * Images are Handled in a Special Way
+ * - Essentially, we want to know that after all of the character conversion is done whether
+ * any unwanted, likely XSS, code was found. If not, we return TRUE, as the image is clean.
+ * However, if the string post-conversion does not matched the string post-removal of XSS,
+ * then it fails, as there was unwanted XSS code found and removed/changed during processing.
+ */
+
+ if ($is_image === TRUE)
+ {
+ if ($str == $converted_string)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+
+ log_message('debug', "XSS Filtering completed");
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Random Hash for protecting URLs
+ *
+ * @access public
+ * @return string
+ */
+ function xss_hash()
+ {
+ if ($this->xss_hash == '')
+ {
+ if (phpversion() >= 4.2)
+ mt_srand();
+ else
+ mt_srand(hexdec(substr(md5(microtime()), -8)) & 0x7fffffff);
+
+ $this->xss_hash = md5(time() + mt_rand(0, 1999999999));
+ }
+
+ return $this->xss_hash;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Remove Invisible Characters
+ *
+ * This prevents sandwiching null characters
+ * between ascii characters, like Java\0script.
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function _remove_invisible_characters($str)
+ {
+ static $non_displayables;
+
+ if ( ! isset($non_displayables))
+ {
+ // every control character except newline (dec 10), carriage return (dec 13), and horizontal tab (dec 09),
+ $non_displayables = array(
+ '/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15
+ '/%1[0-9a-f]/', // url encoded 16-31
+ '/[\x00-\x08]/', // 00-08
+ '/\x0b/', '/\x0c/', // 11, 12
+ '/[\x0e-\x1f]/' // 14-31
+ );
+ }
+
+ do
+ {
+ $cleaned = $str;
+ $str = preg_replace($non_displayables, '', $str);
+ }
+ while ($cleaned != $str);
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Compact Exploded Words
+ *
+ * Callback function for xss_clean() to remove whitespace from
+ * things like j a v a s c r i p t
+ *
+ * @access public
+ * @param type
+ * @return type
+ */
+ function _compact_exploded_words($matches)
+ {
+ return preg_replace('/\s+/s', '', $matches[1]).$matches[2];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Sanitize Naughty HTML
+ *
+ * Callback function for xss_clean() to remove naughty HTML elements
+ *
+ * @access private
+ * @param array
+ * @return string
+ */
+ function _sanitize_naughty_html($matches)
+ {
+ // encode opening brace
+ $str = '<'.$matches[1].$matches[2].$matches[3];
+
+ // encode captured opening or closing brace to prevent recursive vectors
+ $str .= str_replace(array('>', '<'), array('>', '<'), $matches[4]);
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * JS Link Removal
+ *
+ * Callback function for xss_clean() to sanitize links
+ * This limits the PCRE backtracks, making it more performance friendly
+ * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in
+ * PHP 5.2+ on link-heavy strings
+ *
+ * @access private
+ * @param array
+ * @return string
+ */
+ function _js_link_removal($match)
+ {
+ $attributes = $this->_filter_attributes(str_replace(array('<', '>'), '', $match[1]));
+ return str_replace($match[1], preg_replace("#href=.*?(alert\(|alert&\#40;|javascript\:|charset\=|window\.|document\.|\.cookie|<script|<xss|base64\s*,)#si", "", $attributes), $match[0]);
+ }
+
+ /**
+ * JS Image Removal
+ *
+ * Callback function for xss_clean() to sanitize image tags
+ * This limits the PCRE backtracks, making it more performance friendly
+ * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in
+ * PHP 5.2+ on image tag heavy strings
+ *
+ * @access private
+ * @param array
+ * @return string
+ */
+ function _js_img_removal($match)
+ {
+ $attributes = $this->_filter_attributes(str_replace(array('<', '>'), '', $match[1]));
+ return str_replace($match[1], preg_replace("#src=.*?(alert\(|alert&\#40;|javascript\:|charset\=|window\.|document\.|\.cookie|<script|<xss|base64\s*,)#si", "", $attributes), $match[0]);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Attribute Conversion
+ *
+ * Used as a callback for XSS Clean
+ *
+ * @access public
+ * @param array
+ * @return string
+ */
+ function _convert_attribute($match)
+ {
+ return str_replace(array('>', '<'), array('>', '<'), $match[0]);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * HTML Entity Decode Callback
+ *
+ * Used as a callback for XSS Clean
+ *
+ * @access public
+ * @param array
+ * @return string
+ */
+ function _html_entity_decode_callback($match)
+ {
+ $CFG =& load_class('Config');
+ $charset = $CFG->item('charset');
+
+ return $this->_html_entity_decode($match[0], strtoupper($charset));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * HTML Entities Decode
+ *
+ * This function is a replacement for html_entity_decode()
+ *
+ * In some versions of PHP the native function does not work
+ * when UTF-8 is the specified character set, so this gives us
+ * a work-around. More info here:
+ * http://bugs.php.net/bug.php?id=25670
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @return string
+ */
+ /* -------------------------------------------------
+ /* Replacement for html_entity_decode()
+ /* -------------------------------------------------*/
+
+ /*
+ NOTE: html_entity_decode() has a bug in some PHP versions when UTF-8 is the
+ character set, and the PHP developers said they were not back porting the
+ fix to versions other than PHP 5.x.
+ */
+ function _html_entity_decode($str, $charset='UTF-8')
+ {
+ if (stristr($str, '&') === FALSE) return $str;
+
+ // The reason we are not using html_entity_decode() by itself is because
+ // while it is not technically correct to leave out the semicolon
+ // at the end of an entity most browsers will still interpret the entity
+ // correctly. html_entity_decode() does not convert entities without
+ // semicolons, so we are left with our own little solution here. Bummer.
+
+ if (function_exists('html_entity_decode') && (strtolower($charset) != 'utf-8' OR version_compare(phpversion(), '5.0.0', '>=')))
+ {
+ $str = html_entity_decode($str, ENT_COMPAT, $charset);
+ $str = preg_replace('~&#x(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\\1"))', $str);
+ return preg_replace('~&#([0-9]{2,4})~e', 'chr(\\1)', $str);
+ }
+
+ // Numeric Entities
+ $str = preg_replace('~&#x(0*[0-9a-f]{2,5});{0,1}~ei', 'chr(hexdec("\\1"))', $str);
+ $str = preg_replace('~&#([0-9]{2,4});{0,1}~e', 'chr(\\1)', $str);
+
+ // Literal Entities - Slightly slow so we do another check
+ if (stristr($str, '&') === FALSE)
+ {
+ $str = strtr($str, array_flip(get_html_translation_table(HTML_ENTITIES)));
+ }
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Filter Attributes
+ *
+ * Filters tag attributes for consistency and safety
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function _filter_attributes($str)
+ {
+ $out = '';
+
+ if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches))
+ {
+ foreach ($matches[0] as $match)
+ {
+ $out .= "{$match}";
+ }
+ }
+
+ return $out;
+ }
+
+ // --------------------------------------------------------------------
+
+}
+// END Input class
+
+/* End of file Input.php */
/* Location: ./system/libraries/Input.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Language Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Language\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/language.html\r
- */\r
-class CI_Language {\r
-\r
- var $language = array();\r
- var $is_loaded = array();\r
-\r
- /**\r
- * Constructor\r
- *\r
- * @access public\r
- */ \r
- function CI_Language()\r
- {\r
- log_message('debug', "Language Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Load a language file\r
- *\r
- * @access public\r
- * @param mixed the name of the language file to be loaded. Can be an array\r
- * @param string the language (english, etc.)\r
- * @return void\r
- */\r
- function load($langfile = '', $idiom = '', $return = FALSE)\r
- { \r
- $langfile = str_replace(EXT, '', str_replace('_lang.', '', $langfile)).'_lang'.EXT;\r
- \r
- if (in_array($langfile, $this->is_loaded, TRUE))\r
- {\r
- return;\r
- }\r
- \r
- if ($idiom == '')\r
- {\r
- $CI =& get_instance();\r
- $deft_lang = $CI->config->item('language');\r
- $idiom = ($deft_lang == '') ? 'english' : $deft_lang;\r
- }\r
- \r
- // Determine where the language file is and load it\r
- if (file_exists(APPPATH.'language/'.$idiom.'/'.$langfile))\r
- {\r
- include(APPPATH.'language/'.$idiom.'/'.$langfile);\r
- }\r
- else\r
- { \r
- if (file_exists(BASEPATH.'language/'.$idiom.'/'.$langfile))\r
- {\r
- include(BASEPATH.'language/'.$idiom.'/'.$langfile);\r
- }\r
- else\r
- {\r
- show_error('Unable to load the requested language file: language/'.$langfile);\r
- }\r
- }\r
-\r
- \r
- if ( ! isset($lang))\r
- {\r
- log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);\r
- return;\r
- }\r
- \r
- if ($return == TRUE)\r
- {\r
- return $lang;\r
- }\r
- \r
- $this->is_loaded[] = $langfile;\r
- $this->language = array_merge($this->language, $lang);\r
- unset($lang);\r
- \r
- log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile);\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch a single line of text from the language array\r
- *\r
- * @access public\r
- * @param string $line the language line\r
- * @return string\r
- */\r
- function line($line = '')\r
- {\r
- $line = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line];\r
- return $line;\r
- }\r
-\r
-}\r
-// END Language Class\r
-\r
-/* End of file Language.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Language Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Language
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/language.html
+ */
+class CI_Language {
+
+ var $language = array();
+ var $is_loaded = array();
+
+ /**
+ * Constructor
+ *
+ * @access public
+ */
+ function CI_Language()
+ {
+ log_message('debug', "Language Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load a language file
+ *
+ * @access public
+ * @param mixed the name of the language file to be loaded. Can be an array
+ * @param string the language (english, etc.)
+ * @return void
+ */
+ function load($langfile = '', $idiom = '', $return = FALSE)
+ {
+ $langfile = str_replace(EXT, '', str_replace('_lang.', '', $langfile)).'_lang'.EXT;
+
+ if (in_array($langfile, $this->is_loaded, TRUE))
+ {
+ return;
+ }
+
+ if ($idiom == '')
+ {
+ $CI =& get_instance();
+ $deft_lang = $CI->config->item('language');
+ $idiom = ($deft_lang == '') ? 'english' : $deft_lang;
+ }
+
+ // Determine where the language file is and load it
+ if (file_exists(APPPATH.'language/'.$idiom.'/'.$langfile))
+ {
+ include(APPPATH.'language/'.$idiom.'/'.$langfile);
+ }
+ else
+ {
+ if (file_exists(BASEPATH.'language/'.$idiom.'/'.$langfile))
+ {
+ include(BASEPATH.'language/'.$idiom.'/'.$langfile);
+ }
+ else
+ {
+ show_error('Unable to load the requested language file: language/'.$langfile);
+ }
+ }
+
+
+ if ( ! isset($lang))
+ {
+ log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);
+ return;
+ }
+
+ if ($return == TRUE)
+ {
+ return $lang;
+ }
+
+ $this->is_loaded[] = $langfile;
+ $this->language = array_merge($this->language, $lang);
+ unset($lang);
+
+ log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile);
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch a single line of text from the language array
+ *
+ * @access public
+ * @param string $line the language line
+ * @return string
+ */
+ function line($line = '')
+ {
+ $line = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line];
+ return $line;
+ }
+
+}
+// END Language Class
+
+/* End of file Language.php */
/* Location: ./system/libraries/Language.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Loader Class\r
- *\r
- * Loads views and files\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @category Loader\r
- * @link http://codeigniter.com/user_guide/libraries/loader.html\r
- */\r
-class CI_Loader {\r
-\r
- // All these are set automatically. Don't mess with them.\r
- var $_ci_ob_level;\r
- var $_ci_view_path = '';\r
- var $_ci_is_php5 = FALSE;\r
- var $_ci_is_instance = FALSE; // Whether we should use $this or $CI =& get_instance()\r
- var $_ci_cached_vars = array();\r
- var $_ci_classes = array();\r
- var $_ci_loaded_files = array();\r
- var $_ci_models = array();\r
- var $_ci_helpers = array();\r
- var $_ci_plugins = array();\r
- var $_ci_varmap = array('unit_test' => 'unit', 'user_agent' => 'agent');\r
- \r
-\r
- /**\r
- * Constructor\r
- *\r
- * Sets the path to the view files and gets the initial output buffering level\r
- *\r
- * @access public\r
- */\r
- function CI_Loader()\r
- { \r
- $this->_ci_is_php5 = (floor(phpversion()) >= 5) ? TRUE : FALSE;\r
- $this->_ci_view_path = APPPATH.'views/';\r
- $this->_ci_ob_level = ob_get_level();\r
- \r
- log_message('debug', "Loader Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Class Loader\r
- *\r
- * This function lets users load and instantiate classes.\r
- * It is designed to be called from a user's app controllers.\r
- *\r
- * @access public\r
- * @param string the name of the class\r
- * @param mixed the optional parameters\r
- * @param string an optional object name\r
- * @return void\r
- */ \r
- function library($library = '', $params = NULL, $object_name = NULL)\r
- {\r
- if ($library == '')\r
- {\r
- return FALSE;\r
- }\r
-\r
- if ( ! is_null($params) AND ! is_array($params))\r
- {\r
- $params = NULL;\r
- }\r
-\r
- if (is_array($library))\r
- {\r
- foreach ($library as $class)\r
- {\r
- $this->_ci_load_class($class, $params, $object_name);\r
- }\r
- }\r
- else\r
- {\r
- $this->_ci_load_class($library, $params, $object_name);\r
- }\r
- \r
- $this->_ci_assign_to_models();\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Model Loader\r
- *\r
- * This function lets users load and instantiate models.\r
- *\r
- * @access public\r
- * @param string the name of the class\r
- * @param string name for the model\r
- * @param bool database connection\r
- * @return void\r
- */ \r
- function model($model, $name = '', $db_conn = FALSE)\r
- { \r
- if (is_array($model))\r
- {\r
- foreach($model as $babe)\r
- {\r
- $this->model($babe); \r
- }\r
- return;\r
- }\r
-\r
- if ($model == '')\r
- {\r
- return;\r
- }\r
- \r
- // Is the model in a sub-folder? If so, parse out the filename and path.\r
- if (strpos($model, '/') === FALSE)\r
- {\r
- $path = '';\r
- }\r
- else\r
- {\r
- $x = explode('/', $model);\r
- $model = end($x); \r
- unset($x[count($x)-1]);\r
- $path = implode('/', $x).'/';\r
- }\r
- \r
- if ($name == '')\r
- {\r
- $name = $model;\r
- }\r
- \r
- if (in_array($name, $this->_ci_models, TRUE))\r
- {\r
- return;\r
- }\r
- \r
- $CI =& get_instance();\r
- if (isset($CI->$name))\r
- {\r
- show_error('The model name you are loading is the name of a resource that is already being used: '.$name);\r
- }\r
- \r
- $model = strtolower($model);\r
- \r
- if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))\r
- {\r
- show_error('Unable to locate the model you have specified: '.$model);\r
- }\r
- \r
- if ($db_conn !== FALSE AND ! class_exists('CI_DB'))\r
- {\r
- if ($db_conn === TRUE)\r
- $db_conn = '';\r
- \r
- $CI->load->database($db_conn, FALSE, TRUE);\r
- }\r
- \r
- if ( ! class_exists('Model'))\r
- {\r
- load_class('Model', FALSE);\r
- }\r
-\r
- require_once(APPPATH.'models/'.$path.$model.EXT);\r
-\r
- $model = ucfirst($model);\r
- \r
- $CI->$name = new $model();\r
- $CI->$name->_assign_libraries();\r
- \r
- $this->_ci_models[] = $name; \r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Database Loader\r
- *\r
- * @access public\r
- * @param string the DB credentials\r
- * @param bool whether to return the DB object\r
- * @param bool whether to enable active record (this allows us to override the config setting)\r
- * @return object\r
- */ \r
- function database($params = '', $return = FALSE, $active_record = FALSE)\r
- {\r
- // Grab the super object\r
- $CI =& get_instance();\r
- \r
- // Do we even need to load the database class?\r
- if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE AND isset($CI->db) AND is_object($CI->db))\r
- {\r
- return FALSE;\r
- } \r
- \r
- require_once(BASEPATH.'database/DB'.EXT);\r
-\r
- if ($return === TRUE)\r
- {\r
- return DB($params, $active_record);\r
- }\r
- \r
- // Initialize the db variable. Needed to prevent \r
- // reference errors with some configurations\r
- $CI->db = '';\r
- \r
- // Load the DB class\r
- $CI->db =& DB($params, $active_record); \r
- \r
- // Assign the DB object to any existing models\r
- $this->_ci_assign_to_models();\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Load the Utilities Class\r
- *\r
- * @access public\r
- * @return string \r
- */ \r
- function dbutil()\r
- {\r
- if ( ! class_exists('CI_DB'))\r
- {\r
- $this->database();\r
- }\r
- \r
- $CI =& get_instance();\r
-\r
- // for backwards compatibility, load dbforge so we can extend dbutils off it\r
- // this use is deprecated and strongly discouraged\r
- $CI->load->dbforge();\r
- \r
- require_once(BASEPATH.'database/DB_utility'.EXT);\r
- require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility'.EXT);\r
- $class = 'CI_DB_'.$CI->db->dbdriver.'_utility';\r
-\r
- $CI->dbutil =& new $class();\r
-\r
- $CI->load->_ci_assign_to_models();\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Load the Database Forge Class\r
- *\r
- * @access public\r
- * @return string \r
- */ \r
- function dbforge()\r
- {\r
- if ( ! class_exists('CI_DB'))\r
- {\r
- $this->database();\r
- }\r
- \r
- $CI =& get_instance();\r
- \r
- require_once(BASEPATH.'database/DB_forge'.EXT);\r
- require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_forge'.EXT);\r
- $class = 'CI_DB_'.$CI->db->dbdriver.'_forge';\r
-\r
- $CI->dbforge = new $class();\r
- \r
- $CI->load->_ci_assign_to_models();\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Load View\r
- *\r
- * This function is used to load a "view" file. It has three parameters:\r
- *\r
- * 1. The name of the "view" file to be included.\r
- * 2. An associative array of data to be extracted for use in the view.\r
- * 3. TRUE/FALSE - whether to return the data or load it. In\r
- * some cases it's advantageous to be able to return data so that\r
- * a developer can process it in some way.\r
- *\r
- * @access public\r
- * @param string\r
- * @param array\r
- * @param bool\r
- * @return void\r
- */\r
- function view($view, $vars = array(), $return = FALSE)\r
- {\r
- return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Load File\r
- *\r
- * This is a generic file loader\r
- *\r
- * @access public\r
- * @param string\r
- * @param bool\r
- * @return string\r
- */\r
- function file($path, $return = FALSE)\r
- {\r
- return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Variables\r
- *\r
- * Once variables are set they become available within\r
- * the controller class and its "view" files.\r
- *\r
- * @access public\r
- * @param array\r
- * @return void\r
- */\r
- function vars($vars = array(), $val = '')\r
- {\r
- if ($val != '' AND is_string($vars))\r
- {\r
- $vars = array($vars => $val);\r
- }\r
- \r
- $vars = $this->_ci_object_to_array($vars);\r
- \r
- if (is_array($vars) AND count($vars) > 0)\r
- {\r
- foreach ($vars as $key => $val)\r
- {\r
- $this->_ci_cached_vars[$key] = $val;\r
- }\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Load Helper\r
- *\r
- * This function loads the specified helper file.\r
- *\r
- * @access public\r
- * @param mixed\r
- * @return void\r
- */\r
- function helper($helpers = array())\r
- {\r
- if ( ! is_array($helpers))\r
- {\r
- $helpers = array($helpers);\r
- }\r
- \r
- foreach ($helpers as $helper)\r
- { \r
- $helper = strtolower(str_replace(EXT, '', str_replace('_helper', '', $helper)).'_helper');\r
-\r
- if (isset($this->_ci_helpers[$helper]))\r
- {\r
- continue;\r
- }\r
- \r
- $ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.EXT;\r
-\r
- // Is this a helper extension request? \r
- if (file_exists($ext_helper))\r
- {\r
- $base_helper = BASEPATH.'helpers/'.$helper.EXT;\r
- \r
- if ( ! file_exists($base_helper))\r
- {\r
- show_error('Unable to load the requested file: helpers/'.$helper.EXT);\r
- }\r
- \r
- include_once($ext_helper);\r
- include_once($base_helper);\r
- }\r
- elseif (file_exists(APPPATH.'helpers/'.$helper.EXT))\r
- { \r
- include_once(APPPATH.'helpers/'.$helper.EXT);\r
- }\r
- else\r
- { \r
- if (file_exists(BASEPATH.'helpers/'.$helper.EXT))\r
- {\r
- include_once(BASEPATH.'helpers/'.$helper.EXT);\r
- }\r
- else\r
- {\r
- show_error('Unable to load the requested file: helpers/'.$helper.EXT);\r
- }\r
- }\r
-\r
- $this->_ci_helpers[$helper] = TRUE;\r
- log_message('debug', 'Helper loaded: '.$helper); \r
- } \r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Load Helpers\r
- *\r
- * This is simply an alias to the above function in case the\r
- * user has written the plural form of this function.\r
- *\r
- * @access public\r
- * @param array\r
- * @return void\r
- */\r
- function helpers($helpers = array())\r
- {\r
- $this->helper($helpers);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Load Plugin\r
- *\r
- * This function loads the specified plugin.\r
- *\r
- * @access public\r
- * @param array\r
- * @return void\r
- */\r
- function plugin($plugins = array())\r
- {\r
- if ( ! is_array($plugins))\r
- {\r
- $plugins = array($plugins);\r
- }\r
- \r
- foreach ($plugins as $plugin)\r
- { \r
- $plugin = strtolower(str_replace(EXT, '', str_replace('_pi', '', $plugin)).'_pi'); \r
-\r
- if (isset($this->_ci_plugins[$plugin]))\r
- {\r
- continue;\r
- }\r
-\r
- if (file_exists(APPPATH.'plugins/'.$plugin.EXT))\r
- {\r
- include_once(APPPATH.'plugins/'.$plugin.EXT); \r
- }\r
- else\r
- {\r
- if (file_exists(BASEPATH.'plugins/'.$plugin.EXT))\r
- {\r
- include_once(BASEPATH.'plugins/'.$plugin.EXT); \r
- }\r
- else\r
- {\r
- show_error('Unable to load the requested file: plugins/'.$plugin.EXT);\r
- }\r
- }\r
- \r
- $this->_ci_plugins[$plugin] = TRUE;\r
- log_message('debug', 'Plugin loaded: '.$plugin);\r
- } \r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Load Plugins\r
- *\r
- * This is simply an alias to the above function in case the\r
- * user has written the plural form of this function.\r
- *\r
- * @access public\r
- * @param array\r
- * @return void\r
- */\r
- function plugins($plugins = array())\r
- {\r
- $this->plugin($plugins);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Loads a language file\r
- *\r
- * @access public\r
- * @param array\r
- * @param string\r
- * @return void\r
- */\r
- function language($file = array(), $lang = '')\r
- {\r
- $CI =& get_instance();\r
-\r
- if ( ! is_array($file))\r
- {\r
- $file = array($file);\r
- }\r
-\r
- foreach ($file as $langfile)\r
- { \r
- $CI->lang->load($langfile, $lang);\r
- }\r
- }\r
-\r
- /**\r
- * Loads language files for scaffolding\r
- *\r
- * @access public\r
- * @param string\r
- * @return arra\r
- */\r
- function scaffold_language($file = '', $lang = '', $return = FALSE)\r
- {\r
- $CI =& get_instance();\r
- return $CI->lang->load($file, $lang, $return);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Loads a config file\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */\r
- function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)\r
- { \r
- $CI =& get_instance();\r
- $CI->config->load($file, $use_sections, $fail_gracefully);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Scaffolding Loader\r
- *\r
- * This initializing function works a bit different than the\r
- * others. It doesn't load the class. Instead, it simply\r
- * sets a flag indicating that scaffolding is allowed to be\r
- * used. The actual scaffolding function below is\r
- * called by the front controller based on whether the\r
- * second segment of the URL matches the "secret" scaffolding\r
- * word stored in the application/config/routes.php\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function scaffolding($table = '')\r
- { \r
- if ($table === FALSE)\r
- {\r
- show_error('You must include the name of the table you would like to access when you initialize scaffolding');\r
- }\r
- \r
- $CI =& get_instance();\r
- $CI->_ci_scaffolding = TRUE;\r
- $CI->_ci_scaff_table = $table;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Loader\r
- *\r
- * This function is used to load views and files.\r
- * Variables are prefixed with _ci_ to avoid symbol collision with\r
- * variables made available to view files\r
- *\r
- * @access private\r
- * @param array\r
- * @return void\r
- */\r
- function _ci_load($_ci_data)\r
- {\r
- // Set the default data variables\r
- foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)\r
- {\r
- $$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];\r
- }\r
-\r
- // Set the path to the requested file\r
- if ($_ci_path == '')\r
- {\r
- $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);\r
- $_ci_file = ($_ci_ext == '') ? $_ci_view.EXT : $_ci_view;\r
- $_ci_path = $this->_ci_view_path.$_ci_file;\r
- }\r
- else\r
- {\r
- $_ci_x = explode('/', $_ci_path);\r
- $_ci_file = end($_ci_x);\r
- }\r
- \r
- if ( ! file_exists($_ci_path))\r
- {\r
- show_error('Unable to load the requested file: '.$_ci_file);\r
- }\r
- \r
- // This allows anything loaded using $this->load (views, files, etc.)\r
- // to become accessible from within the Controller and Model functions.\r
- // Only needed when running PHP 5\r
- \r
- if ($this->_ci_is_instance())\r
- {\r
- $_ci_CI =& get_instance();\r
- foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)\r
- {\r
- if ( ! isset($this->$_ci_key))\r
- {\r
- $this->$_ci_key =& $_ci_CI->$_ci_key;\r
- }\r
- }\r
- }\r
-\r
- /*\r
- * Extract and cache variables\r
- *\r
- * You can either set variables using the dedicated $this->load_vars()\r
- * function or via the second parameter of this function. We'll merge\r
- * the two types and cache them so that views that are embedded within\r
- * other views can have access to these variables.\r
- */ \r
- if (is_array($_ci_vars))\r
- {\r
- $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);\r
- }\r
- extract($this->_ci_cached_vars);\r
- \r
- /*\r
- * Buffer the output\r
- *\r
- * We buffer the output for two reasons:\r
- * 1. Speed. You get a significant speed boost.\r
- * 2. So that the final rendered template can be\r
- * post-processed by the output class. Why do we\r
- * need post processing? For one thing, in order to\r
- * show the elapsed page load time. Unless we\r
- * can intercept the content right before it's sent to\r
- * the browser and then stop the timer it won't be accurate.\r
- */\r
- ob_start();\r
- \r
- // If the PHP installation does not support short tags we'll\r
- // do a little string replacement, changing the short tags\r
- // to standard PHP echo statements.\r
- \r
- if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)\r
- {\r
- echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));\r
- }\r
- else\r
- {\r
- include($_ci_path); // include() vs include_once() allows for multiple views with the same name\r
- }\r
- \r
- log_message('debug', 'File loaded: '.$_ci_path);\r
- \r
- // Return the file data if requested\r
- if ($_ci_return === TRUE)\r
- { \r
- $buffer = ob_get_contents();\r
- @ob_end_clean();\r
- return $buffer;\r
- }\r
-\r
- /*\r
- * Flush the buffer... or buff the flusher?\r
- *\r
- * In order to permit views to be nested within\r
- * other views, we need to flush the content back out whenever\r
- * we are beyond the first level of output buffering so that\r
- * it can be seen and included properly by the first included\r
- * template and any subsequent ones. Oy!\r
- *\r
- */ \r
- if (ob_get_level() > $this->_ci_ob_level + 1)\r
- {\r
- ob_end_flush();\r
- }\r
- else\r
- {\r
- // PHP 4 requires that we use a global\r
- global $OUT;\r
- $OUT->append_output(ob_get_contents());\r
- @ob_end_clean();\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Load class\r
- *\r
- * This function loads the requested class.\r
- *\r
- * @access private\r
- * @param string the item that is being loaded\r
- * @param mixed any additional parameters\r
- * @param string an optional object name\r
- * @return void\r
- */\r
- function _ci_load_class($class, $params = NULL, $object_name = NULL)\r
- { \r
- // Get the class name, and while we're at it trim any slashes. \r
- // The directory path can be included as part of the class name, \r
- // but we don't want a leading slash\r
- $class = str_replace(EXT, '', trim($class, '/'));\r
- \r
- // Was the path included with the class name?\r
- // We look for a slash to determine this\r
- $subdir = '';\r
- if (strpos($class, '/') !== FALSE)\r
- {\r
- // explode the path so we can separate the filename from the path\r
- $x = explode('/', $class); \r
- \r
- // Reset the $class variable now that we know the actual filename\r
- $class = end($x);\r
- \r
- // Kill the filename from the array\r
- unset($x[count($x)-1]);\r
- \r
- // Glue the path back together, sans filename\r
- $subdir = implode($x, '/').'/';\r
- }\r
-\r
- // We'll test for both lowercase and capitalized versions of the file name\r
- foreach (array(ucfirst($class), strtolower($class)) as $class)\r
- {\r
- $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.EXT;\r
-\r
- // Is this a class extension request? \r
- if (file_exists($subclass))\r
- {\r
- $baseclass = BASEPATH.'libraries/'.ucfirst($class).EXT;\r
- \r
- if ( ! file_exists($baseclass))\r
- {\r
- log_message('error', "Unable to load the requested class: ".$class);\r
- show_error("Unable to load the requested class: ".$class);\r
- }\r
-\r
- // Safety: Was the class already loaded by a previous call?\r
- if (in_array($subclass, $this->_ci_loaded_files))\r
- {\r
- // Before we deem this to be a duplicate request, let's see\r
- // if a custom object name is being supplied. If so, we'll\r
- // return a new instance of the object\r
- if ( ! is_null($object_name))\r
- {\r
- $CI =& get_instance();\r
- if ( ! isset($CI->$object_name))\r
- {\r
- return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name); \r
- }\r
- }\r
- \r
- $is_duplicate = TRUE;\r
- log_message('debug', $class." class already loaded. Second attempt ignored.");\r
- return;\r
- }\r
- \r
- include_once($baseclass); \r
- include_once($subclass);\r
- $this->_ci_loaded_files[] = $subclass;\r
- \r
- return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name); \r
- }\r
- \r
- // Lets search for the requested library file and load it.\r
- $is_duplicate = FALSE; \r
- for ($i = 1; $i < 3; $i++)\r
- {\r
- $path = ($i % 2) ? APPPATH : BASEPATH; \r
- $filepath = $path.'libraries/'.$subdir.$class.EXT;\r
- \r
- // Does the file exist? No? Bummer...\r
- if ( ! file_exists($filepath))\r
- {\r
- continue;\r
- }\r
- \r
- // Safety: Was the class already loaded by a previous call?\r
- if (in_array($filepath, $this->_ci_loaded_files))\r
- {\r
- // Before we deem this to be a duplicate request, let's see\r
- // if a custom object name is being supplied. If so, we'll\r
- // return a new instance of the object\r
- if ( ! is_null($object_name))\r
- {\r
- $CI =& get_instance();\r
- if ( ! isset($CI->$object_name))\r
- {\r
- return $this->_ci_init_class($class, '', $params, $object_name);\r
- }\r
- }\r
- \r
- $is_duplicate = TRUE;\r
- log_message('debug', $class." class already loaded. Second attempt ignored.");\r
- return;\r
- }\r
- \r
- include_once($filepath);\r
- $this->_ci_loaded_files[] = $filepath;\r
- return $this->_ci_init_class($class, '', $params, $object_name);\r
- }\r
- } // END FOREACH\r
-\r
- // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified?\r
- if ($subdir == '')\r
- {\r
- $path = strtolower($class).'/'.$class;\r
- return $this->_ci_load_class($path, $params);\r
- }\r
- \r
- // If we got this far we were unable to find the requested class.\r
- // We do not issue errors if the load call failed due to a duplicate request\r
- if ($is_duplicate == FALSE)\r
- {\r
- log_message('error', "Unable to load the requested class: ".$class);\r
- show_error("Unable to load the requested class: ".$class);\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Instantiates a class\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @param string an optional object name\r
- * @return null\r
- */\r
- function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)\r
- { \r
- // Is there an associated config file for this class?\r
- if ($config === NULL)\r
- {\r
- // We test for both uppercase and lowercase, for servers that\r
- // are case-sensitive with regard to file names\r
- if (file_exists(APPPATH.'config/'.strtolower($class).EXT))\r
- {\r
- include_once(APPPATH.'config/'.strtolower($class).EXT);\r
- } \r
- else\r
- {\r
- if (file_exists(APPPATH.'config/'.ucfirst(strtolower($class)).EXT))\r
- {\r
- include_once(APPPATH.'config/'.ucfirst(strtolower($class)).EXT);\r
- } \r
- }\r
- }\r
- \r
- if ($prefix == '')\r
- { \r
- if (class_exists('CI_'.$class)) \r
- {\r
- $name = 'CI_'.$class;\r
- }\r
- elseif (class_exists(config_item('subclass_prefix').$class)) \r
- {\r
- $name = config_item('subclass_prefix').$class;\r
- }\r
- else\r
- {\r
- $name = $class;\r
- }\r
- }\r
- else\r
- {\r
- $name = $prefix.$class;\r
- }\r
- \r
- // Is the class name valid?\r
- if ( ! class_exists($name))\r
- {\r
- log_message('error', "Non-existent class: ".$name);\r
- show_error("Non-existent class: ".$class);\r
- }\r
- \r
- // Set the variable name we will assign the class to\r
- // Was a custom class name supplied? If so we'll use it\r
- $class = strtolower($class);\r
- \r
- if (is_null($object_name))\r
- {\r
- $classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];\r
- }\r
- else\r
- {\r
- $classvar = $object_name;\r
- }\r
-\r
- // Save the class name and object name \r
- $this->_ci_classes[$class] = $classvar;\r
-\r
- // Instantiate the class \r
- $CI =& get_instance();\r
- if ($config !== NULL)\r
- {\r
- $CI->$classvar = new $name($config);\r
- }\r
- else\r
- { \r
- $CI->$classvar = new $name;\r
- } \r
- } \r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Autoloader\r
- *\r
- * The config/autoload.php file contains an array that permits sub-systems,\r
- * libraries, plugins, and helpers to be loaded automatically.\r
- *\r
- * @access private\r
- * @param array\r
- * @return void\r
- */\r
- function _ci_autoloader()\r
- { \r
- include_once(APPPATH.'config/autoload'.EXT);\r
- \r
- if ( ! isset($autoload))\r
- {\r
- return FALSE;\r
- }\r
- \r
- // Load any custom config file\r
- if (count($autoload['config']) > 0)\r
- { \r
- $CI =& get_instance();\r
- foreach ($autoload['config'] as $key => $val)\r
- {\r
- $CI->config->load($val);\r
- }\r
- } \r
-\r
- // Autoload plugins, helpers and languages\r
- foreach (array('helper', 'plugin', 'language') as $type)\r
- { \r
- if (isset($autoload[$type]) AND count($autoload[$type]) > 0)\r
- {\r
- $this->$type($autoload[$type]);\r
- } \r
- }\r
-\r
- // A little tweak to remain backward compatible\r
- // The $autoload['core'] item was deprecated\r
- if ( ! isset($autoload['libraries']))\r
- {\r
- $autoload['libraries'] = $autoload['core'];\r
- }\r
- \r
- // Load libraries\r
- if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)\r
- {\r
- // Load the database driver.\r
- if (in_array('database', $autoload['libraries']))\r
- {\r
- $this->database();\r
- $autoload['libraries'] = array_diff($autoload['libraries'], array('database'));\r
- }\r
-\r
- // Load scaffolding\r
- if (in_array('scaffolding', $autoload['libraries']))\r
- {\r
- $this->scaffolding();\r
- $autoload['libraries'] = array_diff($autoload['libraries'], array('scaffolding'));\r
- }\r
- \r
- // Load all other libraries\r
- foreach ($autoload['libraries'] as $item)\r
- {\r
- $this->library($item);\r
- }\r
- } \r
-\r
- // Autoload models\r
- if (isset($autoload['model']))\r
- {\r
- $this->model($autoload['model']);\r
- }\r
-\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Assign to Models\r
- *\r
- * Makes sure that anything loaded by the loader class (libraries, plugins, etc.)\r
- * will be available to models, if any exist.\r
- *\r
- * @access private\r
- * @param object\r
- * @return array\r
- */\r
- function _ci_assign_to_models()\r
- {\r
- if (count($this->_ci_models) == 0)\r
- {\r
- return;\r
- }\r
- \r
- if ($this->_ci_is_instance())\r
- {\r
- $CI =& get_instance();\r
- foreach ($this->_ci_models as $model)\r
- { \r
- $CI->$model->_assign_libraries();\r
- }\r
- }\r
- else\r
- { \r
- foreach ($this->_ci_models as $model)\r
- { \r
- $this->$model->_assign_libraries();\r
- }\r
- }\r
- } \r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Object to Array\r
- *\r
- * Takes an object as input and converts the class variables to array key/vals\r
- *\r
- * @access private\r
- * @param object\r
- * @return array\r
- */\r
- function _ci_object_to_array($object)\r
- {\r
- return (is_object($object)) ? get_object_vars($object) : $object;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Determines whether we should use the CI instance or $this\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
- function _ci_is_instance()\r
- {\r
- if ($this->_ci_is_php5 == TRUE)\r
- {\r
- return TRUE;\r
- }\r
- \r
- global $CI;\r
- return (is_object($CI)) ? TRUE : FALSE;\r
- }\r
-\r
-}\r
-\r
-/* End of file Loader.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Loader Class
+ *
+ * Loads views and files
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @author ExpressionEngine Dev Team
+ * @category Loader
+ * @link http://codeigniter.com/user_guide/libraries/loader.html
+ */
+class CI_Loader {
+
+ // All these are set automatically. Don't mess with them.
+ var $_ci_ob_level;
+ var $_ci_view_path = '';
+ var $_ci_is_php5 = FALSE;
+ var $_ci_is_instance = FALSE; // Whether we should use $this or $CI =& get_instance()
+ var $_ci_cached_vars = array();
+ var $_ci_classes = array();
+ var $_ci_loaded_files = array();
+ var $_ci_models = array();
+ var $_ci_helpers = array();
+ var $_ci_plugins = array();
+ var $_ci_varmap = array('unit_test' => 'unit', 'user_agent' => 'agent');
+
+
+ /**
+ * Constructor
+ *
+ * Sets the path to the view files and gets the initial output buffering level
+ *
+ * @access public
+ */
+ function CI_Loader()
+ {
+ $this->_ci_is_php5 = (floor(phpversion()) >= 5) ? TRUE : FALSE;
+ $this->_ci_view_path = APPPATH.'views/';
+ $this->_ci_ob_level = ob_get_level();
+
+ log_message('debug', "Loader Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Class Loader
+ *
+ * This function lets users load and instantiate classes.
+ * It is designed to be called from a user's app controllers.
+ *
+ * @access public
+ * @param string the name of the class
+ * @param mixed the optional parameters
+ * @param string an optional object name
+ * @return void
+ */
+ function library($library = '', $params = NULL, $object_name = NULL)
+ {
+ if ($library == '')
+ {
+ return FALSE;
+ }
+
+ if ( ! is_null($params) AND ! is_array($params))
+ {
+ $params = NULL;
+ }
+
+ if (is_array($library))
+ {
+ foreach ($library as $class)
+ {
+ $this->_ci_load_class($class, $params, $object_name);
+ }
+ }
+ else
+ {
+ $this->_ci_load_class($library, $params, $object_name);
+ }
+
+ $this->_ci_assign_to_models();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Model Loader
+ *
+ * This function lets users load and instantiate models.
+ *
+ * @access public
+ * @param string the name of the class
+ * @param string name for the model
+ * @param bool database connection
+ * @return void
+ */
+ function model($model, $name = '', $db_conn = FALSE)
+ {
+ if (is_array($model))
+ {
+ foreach($model as $babe)
+ {
+ $this->model($babe);
+ }
+ return;
+ }
+
+ if ($model == '')
+ {
+ return;
+ }
+
+ // Is the model in a sub-folder? If so, parse out the filename and path.
+ if (strpos($model, '/') === FALSE)
+ {
+ $path = '';
+ }
+ else
+ {
+ $x = explode('/', $model);
+ $model = end($x);
+ unset($x[count($x)-1]);
+ $path = implode('/', $x).'/';
+ }
+
+ if ($name == '')
+ {
+ $name = $model;
+ }
+
+ if (in_array($name, $this->_ci_models, TRUE))
+ {
+ return;
+ }
+
+ $CI =& get_instance();
+ if (isset($CI->$name))
+ {
+ show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
+ }
+
+ $model = strtolower($model);
+
+ if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))
+ {
+ show_error('Unable to locate the model you have specified: '.$model);
+ }
+
+ if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
+ {
+ if ($db_conn === TRUE)
+ $db_conn = '';
+
+ $CI->load->database($db_conn, FALSE, TRUE);
+ }
+
+ if ( ! class_exists('Model'))
+ {
+ load_class('Model', FALSE);
+ }
+
+ require_once(APPPATH.'models/'.$path.$model.EXT);
+
+ $model = ucfirst($model);
+
+ $CI->$name = new $model();
+ $CI->$name->_assign_libraries();
+
+ $this->_ci_models[] = $name;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Database Loader
+ *
+ * @access public
+ * @param string the DB credentials
+ * @param bool whether to return the DB object
+ * @param bool whether to enable active record (this allows us to override the config setting)
+ * @return object
+ */
+ function database($params = '', $return = FALSE, $active_record = FALSE)
+ {
+ // Grab the super object
+ $CI =& get_instance();
+
+ // Do we even need to load the database class?
+ if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE AND isset($CI->db) AND is_object($CI->db))
+ {
+ return FALSE;
+ }
+
+ require_once(BASEPATH.'database/DB'.EXT);
+
+ if ($return === TRUE)
+ {
+ return DB($params, $active_record);
+ }
+
+ // Initialize the db variable. Needed to prevent
+ // reference errors with some configurations
+ $CI->db = '';
+
+ // Load the DB class
+ $CI->db =& DB($params, $active_record);
+
+ // Assign the DB object to any existing models
+ $this->_ci_assign_to_models();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load the Utilities Class
+ *
+ * @access public
+ * @return string
+ */
+ function dbutil()
+ {
+ if ( ! class_exists('CI_DB'))
+ {
+ $this->database();
+ }
+
+ $CI =& get_instance();
+
+ // for backwards compatibility, load dbforge so we can extend dbutils off it
+ // this use is deprecated and strongly discouraged
+ $CI->load->dbforge();
+
+ require_once(BASEPATH.'database/DB_utility'.EXT);
+ require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility'.EXT);
+ $class = 'CI_DB_'.$CI->db->dbdriver.'_utility';
+
+ $CI->dbutil =& new $class();
+
+ $CI->load->_ci_assign_to_models();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load the Database Forge Class
+ *
+ * @access public
+ * @return string
+ */
+ function dbforge()
+ {
+ if ( ! class_exists('CI_DB'))
+ {
+ $this->database();
+ }
+
+ $CI =& get_instance();
+
+ require_once(BASEPATH.'database/DB_forge'.EXT);
+ require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_forge'.EXT);
+ $class = 'CI_DB_'.$CI->db->dbdriver.'_forge';
+
+ $CI->dbforge = new $class();
+
+ $CI->load->_ci_assign_to_models();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load View
+ *
+ * This function is used to load a "view" file. It has three parameters:
+ *
+ * 1. The name of the "view" file to be included.
+ * 2. An associative array of data to be extracted for use in the view.
+ * 3. TRUE/FALSE - whether to return the data or load it. In
+ * some cases it's advantageous to be able to return data so that
+ * a developer can process it in some way.
+ *
+ * @access public
+ * @param string
+ * @param array
+ * @param bool
+ * @return void
+ */
+ function view($view, $vars = array(), $return = FALSE)
+ {
+ return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load File
+ *
+ * This is a generic file loader
+ *
+ * @access public
+ * @param string
+ * @param bool
+ * @return string
+ */
+ function file($path, $return = FALSE)
+ {
+ return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Variables
+ *
+ * Once variables are set they become available within
+ * the controller class and its "view" files.
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function vars($vars = array(), $val = '')
+ {
+ if ($val != '' AND is_string($vars))
+ {
+ $vars = array($vars => $val);
+ }
+
+ $vars = $this->_ci_object_to_array($vars);
+
+ if (is_array($vars) AND count($vars) > 0)
+ {
+ foreach ($vars as $key => $val)
+ {
+ $this->_ci_cached_vars[$key] = $val;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load Helper
+ *
+ * This function loads the specified helper file.
+ *
+ * @access public
+ * @param mixed
+ * @return void
+ */
+ function helper($helpers = array())
+ {
+ if ( ! is_array($helpers))
+ {
+ $helpers = array($helpers);
+ }
+
+ foreach ($helpers as $helper)
+ {
+ $helper = strtolower(str_replace(EXT, '', str_replace('_helper', '', $helper)).'_helper');
+
+ if (isset($this->_ci_helpers[$helper]))
+ {
+ continue;
+ }
+
+ $ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.EXT;
+
+ // Is this a helper extension request?
+ if (file_exists($ext_helper))
+ {
+ $base_helper = BASEPATH.'helpers/'.$helper.EXT;
+
+ if ( ! file_exists($base_helper))
+ {
+ show_error('Unable to load the requested file: helpers/'.$helper.EXT);
+ }
+
+ include_once($ext_helper);
+ include_once($base_helper);
+ }
+ elseif (file_exists(APPPATH.'helpers/'.$helper.EXT))
+ {
+ include_once(APPPATH.'helpers/'.$helper.EXT);
+ }
+ else
+ {
+ if (file_exists(BASEPATH.'helpers/'.$helper.EXT))
+ {
+ include_once(BASEPATH.'helpers/'.$helper.EXT);
+ }
+ else
+ {
+ show_error('Unable to load the requested file: helpers/'.$helper.EXT);
+ }
+ }
+
+ $this->_ci_helpers[$helper] = TRUE;
+ log_message('debug', 'Helper loaded: '.$helper);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load Helpers
+ *
+ * This is simply an alias to the above function in case the
+ * user has written the plural form of this function.
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function helpers($helpers = array())
+ {
+ $this->helper($helpers);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load Plugin
+ *
+ * This function loads the specified plugin.
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function plugin($plugins = array())
+ {
+ if ( ! is_array($plugins))
+ {
+ $plugins = array($plugins);
+ }
+
+ foreach ($plugins as $plugin)
+ {
+ $plugin = strtolower(str_replace(EXT, '', str_replace('_pi', '', $plugin)).'_pi');
+
+ if (isset($this->_ci_plugins[$plugin]))
+ {
+ continue;
+ }
+
+ if (file_exists(APPPATH.'plugins/'.$plugin.EXT))
+ {
+ include_once(APPPATH.'plugins/'.$plugin.EXT);
+ }
+ else
+ {
+ if (file_exists(BASEPATH.'plugins/'.$plugin.EXT))
+ {
+ include_once(BASEPATH.'plugins/'.$plugin.EXT);
+ }
+ else
+ {
+ show_error('Unable to load the requested file: plugins/'.$plugin.EXT);
+ }
+ }
+
+ $this->_ci_plugins[$plugin] = TRUE;
+ log_message('debug', 'Plugin loaded: '.$plugin);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load Plugins
+ *
+ * This is simply an alias to the above function in case the
+ * user has written the plural form of this function.
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function plugins($plugins = array())
+ {
+ $this->plugin($plugins);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Loads a language file
+ *
+ * @access public
+ * @param array
+ * @param string
+ * @return void
+ */
+ function language($file = array(), $lang = '')
+ {
+ $CI =& get_instance();
+
+ if ( ! is_array($file))
+ {
+ $file = array($file);
+ }
+
+ foreach ($file as $langfile)
+ {
+ $CI->lang->load($langfile, $lang);
+ }
+ }
+
+ /**
+ * Loads language files for scaffolding
+ *
+ * @access public
+ * @param string
+ * @return arra
+ */
+ function scaffold_language($file = '', $lang = '', $return = FALSE)
+ {
+ $CI =& get_instance();
+ return $CI->lang->load($file, $lang, $return);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Loads a config file
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
+ {
+ $CI =& get_instance();
+ $CI->config->load($file, $use_sections, $fail_gracefully);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Scaffolding Loader
+ *
+ * This initializing function works a bit different than the
+ * others. It doesn't load the class. Instead, it simply
+ * sets a flag indicating that scaffolding is allowed to be
+ * used. The actual scaffolding function below is
+ * called by the front controller based on whether the
+ * second segment of the URL matches the "secret" scaffolding
+ * word stored in the application/config/routes.php
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function scaffolding($table = '')
+ {
+ if ($table === FALSE)
+ {
+ show_error('You must include the name of the table you would like to access when you initialize scaffolding');
+ }
+
+ $CI =& get_instance();
+ $CI->_ci_scaffolding = TRUE;
+ $CI->_ci_scaff_table = $table;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Loader
+ *
+ * This function is used to load views and files.
+ * Variables are prefixed with _ci_ to avoid symbol collision with
+ * variables made available to view files
+ *
+ * @access private
+ * @param array
+ * @return void
+ */
+ function _ci_load($_ci_data)
+ {
+ // Set the default data variables
+ foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)
+ {
+ $$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];
+ }
+
+ // Set the path to the requested file
+ if ($_ci_path == '')
+ {
+ $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
+ $_ci_file = ($_ci_ext == '') ? $_ci_view.EXT : $_ci_view;
+ $_ci_path = $this->_ci_view_path.$_ci_file;
+ }
+ else
+ {
+ $_ci_x = explode('/', $_ci_path);
+ $_ci_file = end($_ci_x);
+ }
+
+ if ( ! file_exists($_ci_path))
+ {
+ show_error('Unable to load the requested file: '.$_ci_file);
+ }
+
+ // This allows anything loaded using $this->load (views, files, etc.)
+ // to become accessible from within the Controller and Model functions.
+ // Only needed when running PHP 5
+
+ if ($this->_ci_is_instance())
+ {
+ $_ci_CI =& get_instance();
+ foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)
+ {
+ if ( ! isset($this->$_ci_key))
+ {
+ $this->$_ci_key =& $_ci_CI->$_ci_key;
+ }
+ }
+ }
+
+ /*
+ * Extract and cache variables
+ *
+ * You can either set variables using the dedicated $this->load_vars()
+ * function or via the second parameter of this function. We'll merge
+ * the two types and cache them so that views that are embedded within
+ * other views can have access to these variables.
+ */
+ if (is_array($_ci_vars))
+ {
+ $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
+ }
+ extract($this->_ci_cached_vars);
+
+ /*
+ * Buffer the output
+ *
+ * We buffer the output for two reasons:
+ * 1. Speed. You get a significant speed boost.
+ * 2. So that the final rendered template can be
+ * post-processed by the output class. Why do we
+ * need post processing? For one thing, in order to
+ * show the elapsed page load time. Unless we
+ * can intercept the content right before it's sent to
+ * the browser and then stop the timer it won't be accurate.
+ */
+ ob_start();
+
+ // If the PHP installation does not support short tags we'll
+ // do a little string replacement, changing the short tags
+ // to standard PHP echo statements.
+
+ if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
+ {
+ echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));
+ }
+ else
+ {
+ include($_ci_path); // include() vs include_once() allows for multiple views with the same name
+ }
+
+ log_message('debug', 'File loaded: '.$_ci_path);
+
+ // Return the file data if requested
+ if ($_ci_return === TRUE)
+ {
+ $buffer = ob_get_contents();
+ @ob_end_clean();
+ return $buffer;
+ }
+
+ /*
+ * Flush the buffer... or buff the flusher?
+ *
+ * In order to permit views to be nested within
+ * other views, we need to flush the content back out whenever
+ * we are beyond the first level of output buffering so that
+ * it can be seen and included properly by the first included
+ * template and any subsequent ones. Oy!
+ *
+ */
+ if (ob_get_level() > $this->_ci_ob_level + 1)
+ {
+ ob_end_flush();
+ }
+ else
+ {
+ // PHP 4 requires that we use a global
+ global $OUT;
+ $OUT->append_output(ob_get_contents());
+ @ob_end_clean();
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Load class
+ *
+ * This function loads the requested class.
+ *
+ * @access private
+ * @param string the item that is being loaded
+ * @param mixed any additional parameters
+ * @param string an optional object name
+ * @return void
+ */
+ function _ci_load_class($class, $params = NULL, $object_name = NULL)
+ {
+ // Get the class name, and while we're at it trim any slashes.
+ // The directory path can be included as part of the class name,
+ // but we don't want a leading slash
+ $class = str_replace(EXT, '', trim($class, '/'));
+
+ // Was the path included with the class name?
+ // We look for a slash to determine this
+ $subdir = '';
+ if (strpos($class, '/') !== FALSE)
+ {
+ // explode the path so we can separate the filename from the path
+ $x = explode('/', $class);
+
+ // Reset the $class variable now that we know the actual filename
+ $class = end($x);
+
+ // Kill the filename from the array
+ unset($x[count($x)-1]);
+
+ // Glue the path back together, sans filename
+ $subdir = implode($x, '/').'/';
+ }
+
+ // We'll test for both lowercase and capitalized versions of the file name
+ foreach (array(ucfirst($class), strtolower($class)) as $class)
+ {
+ $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.EXT;
+
+ // Is this a class extension request?
+ if (file_exists($subclass))
+ {
+ $baseclass = BASEPATH.'libraries/'.ucfirst($class).EXT;
+
+ if ( ! file_exists($baseclass))
+ {
+ log_message('error', "Unable to load the requested class: ".$class);
+ show_error("Unable to load the requested class: ".$class);
+ }
+
+ // Safety: Was the class already loaded by a previous call?
+ if (in_array($subclass, $this->_ci_loaded_files))
+ {
+ // Before we deem this to be a duplicate request, let's see
+ // if a custom object name is being supplied. If so, we'll
+ // return a new instance of the object
+ if ( ! is_null($object_name))
+ {
+ $CI =& get_instance();
+ if ( ! isset($CI->$object_name))
+ {
+ return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
+ }
+ }
+
+ $is_duplicate = TRUE;
+ log_message('debug', $class." class already loaded. Second attempt ignored.");
+ return;
+ }
+
+ include_once($baseclass);
+ include_once($subclass);
+ $this->_ci_loaded_files[] = $subclass;
+
+ return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
+ }
+
+ // Lets search for the requested library file and load it.
+ $is_duplicate = FALSE;
+ for ($i = 1; $i < 3; $i++)
+ {
+ $path = ($i % 2) ? APPPATH : BASEPATH;
+ $filepath = $path.'libraries/'.$subdir.$class.EXT;
+
+ // Does the file exist? No? Bummer...
+ if ( ! file_exists($filepath))
+ {
+ continue;
+ }
+
+ // Safety: Was the class already loaded by a previous call?
+ if (in_array($filepath, $this->_ci_loaded_files))
+ {
+ // Before we deem this to be a duplicate request, let's see
+ // if a custom object name is being supplied. If so, we'll
+ // return a new instance of the object
+ if ( ! is_null($object_name))
+ {
+ $CI =& get_instance();
+ if ( ! isset($CI->$object_name))
+ {
+ return $this->_ci_init_class($class, '', $params, $object_name);
+ }
+ }
+
+ $is_duplicate = TRUE;
+ log_message('debug', $class." class already loaded. Second attempt ignored.");
+ return;
+ }
+
+ include_once($filepath);
+ $this->_ci_loaded_files[] = $filepath;
+ return $this->_ci_init_class($class, '', $params, $object_name);
+ }
+ } // END FOREACH
+
+ // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified?
+ if ($subdir == '')
+ {
+ $path = strtolower($class).'/'.$class;
+ return $this->_ci_load_class($path, $params);
+ }
+
+ // If we got this far we were unable to find the requested class.
+ // We do not issue errors if the load call failed due to a duplicate request
+ if ($is_duplicate == FALSE)
+ {
+ log_message('error', "Unable to load the requested class: ".$class);
+ show_error("Unable to load the requested class: ".$class);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Instantiates a class
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @param string an optional object name
+ * @return null
+ */
+ function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)
+ {
+ // Is there an associated config file for this class?
+ if ($config === NULL)
+ {
+ // We test for both uppercase and lowercase, for servers that
+ // are case-sensitive with regard to file names
+ if (file_exists(APPPATH.'config/'.strtolower($class).EXT))
+ {
+ include_once(APPPATH.'config/'.strtolower($class).EXT);
+ }
+ else
+ {
+ if (file_exists(APPPATH.'config/'.ucfirst(strtolower($class)).EXT))
+ {
+ include_once(APPPATH.'config/'.ucfirst(strtolower($class)).EXT);
+ }
+ }
+ }
+
+ if ($prefix == '')
+ {
+ if (class_exists('CI_'.$class))
+ {
+ $name = 'CI_'.$class;
+ }
+ elseif (class_exists(config_item('subclass_prefix').$class))
+ {
+ $name = config_item('subclass_prefix').$class;
+ }
+ else
+ {
+ $name = $class;
+ }
+ }
+ else
+ {
+ $name = $prefix.$class;
+ }
+
+ // Is the class name valid?
+ if ( ! class_exists($name))
+ {
+ log_message('error', "Non-existent class: ".$name);
+ show_error("Non-existent class: ".$class);
+ }
+
+ // Set the variable name we will assign the class to
+ // Was a custom class name supplied? If so we'll use it
+ $class = strtolower($class);
+
+ if (is_null($object_name))
+ {
+ $classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];
+ }
+ else
+ {
+ $classvar = $object_name;
+ }
+
+ // Save the class name and object name
+ $this->_ci_classes[$class] = $classvar;
+
+ // Instantiate the class
+ $CI =& get_instance();
+ if ($config !== NULL)
+ {
+ $CI->$classvar = new $name($config);
+ }
+ else
+ {
+ $CI->$classvar = new $name;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Autoloader
+ *
+ * The config/autoload.php file contains an array that permits sub-systems,
+ * libraries, plugins, and helpers to be loaded automatically.
+ *
+ * @access private
+ * @param array
+ * @return void
+ */
+ function _ci_autoloader()
+ {
+ include_once(APPPATH.'config/autoload'.EXT);
+
+ if ( ! isset($autoload))
+ {
+ return FALSE;
+ }
+
+ // Load any custom config file
+ if (count($autoload['config']) > 0)
+ {
+ $CI =& get_instance();
+ foreach ($autoload['config'] as $key => $val)
+ {
+ $CI->config->load($val);
+ }
+ }
+
+ // Autoload plugins, helpers and languages
+ foreach (array('helper', 'plugin', 'language') as $type)
+ {
+ if (isset($autoload[$type]) AND count($autoload[$type]) > 0)
+ {
+ $this->$type($autoload[$type]);
+ }
+ }
+
+ // A little tweak to remain backward compatible
+ // The $autoload['core'] item was deprecated
+ if ( ! isset($autoload['libraries']))
+ {
+ $autoload['libraries'] = $autoload['core'];
+ }
+
+ // Load libraries
+ if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)
+ {
+ // Load the database driver.
+ if (in_array('database', $autoload['libraries']))
+ {
+ $this->database();
+ $autoload['libraries'] = array_diff($autoload['libraries'], array('database'));
+ }
+
+ // Load scaffolding
+ if (in_array('scaffolding', $autoload['libraries']))
+ {
+ $this->scaffolding();
+ $autoload['libraries'] = array_diff($autoload['libraries'], array('scaffolding'));
+ }
+
+ // Load all other libraries
+ foreach ($autoload['libraries'] as $item)
+ {
+ $this->library($item);
+ }
+ }
+
+ // Autoload models
+ if (isset($autoload['model']))
+ {
+ $this->model($autoload['model']);
+ }
+
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Assign to Models
+ *
+ * Makes sure that anything loaded by the loader class (libraries, plugins, etc.)
+ * will be available to models, if any exist.
+ *
+ * @access private
+ * @param object
+ * @return array
+ */
+ function _ci_assign_to_models()
+ {
+ if (count($this->_ci_models) == 0)
+ {
+ return;
+ }
+
+ if ($this->_ci_is_instance())
+ {
+ $CI =& get_instance();
+ foreach ($this->_ci_models as $model)
+ {
+ $CI->$model->_assign_libraries();
+ }
+ }
+ else
+ {
+ foreach ($this->_ci_models as $model)
+ {
+ $this->$model->_assign_libraries();
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Object to Array
+ *
+ * Takes an object as input and converts the class variables to array key/vals
+ *
+ * @access private
+ * @param object
+ * @return array
+ */
+ function _ci_object_to_array($object)
+ {
+ return (is_object($object)) ? get_object_vars($object) : $object;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Determines whether we should use the CI instance or $this
+ *
+ * @access private
+ * @return bool
+ */
+ function _ci_is_instance()
+ {
+ if ($this->_ci_is_php5 == TRUE)
+ {
+ return TRUE;
+ }
+
+ global $CI;
+ return (is_object($CI)) ? TRUE : FALSE;
+ }
+
+}
+
+/* End of file Loader.php */
/* Location: ./system/libraries/Loader.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Logging Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Logging\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/general/errors.html\r
- */\r
-class CI_Log {\r
-\r
- var $log_path;\r
- var $_threshold = 1;\r
- var $_date_fmt = 'Y-m-d H:i:s';\r
- var $_enabled = TRUE;\r
- var $_levels = array('ERROR' => '1', 'DEBUG' => '2', 'INFO' => '3', 'ALL' => '4');\r
-\r
- /**\r
- * Constructor\r
- *\r
- * @access public\r
- */\r
- function CI_Log()\r
- {\r
- $config =& get_config();\r
- \r
- $this->log_path = ($config['log_path'] != '') ? $config['log_path'] : BASEPATH.'logs/';\r
- \r
- if ( ! is_dir($this->log_path) OR ! is_really_writable($this->log_path))\r
- {\r
- $this->_enabled = FALSE;\r
- }\r
- \r
- if (is_numeric($config['log_threshold']))\r
- {\r
- $this->_threshold = $config['log_threshold'];\r
- }\r
- \r
- if ($config['log_date_format'] != '')\r
- {\r
- $this->_date_fmt = $config['log_date_format'];\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Write Log File\r
- *\r
- * Generally this function will be called using the global log_message() function\r
- *\r
- * @access public\r
- * @param string the error level\r
- * @param string the error message\r
- * @param bool whether the error is a native PHP error\r
- * @return bool\r
- */ \r
- function write_log($level = 'error', $msg, $php_error = FALSE)\r
- { \r
- if ($this->_enabled === FALSE)\r
- {\r
- return FALSE;\r
- }\r
- \r
- $level = strtoupper($level);\r
- \r
- if ( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))\r
- {\r
- return FALSE;\r
- }\r
- \r
- $filepath = $this->log_path.'log-'.date('Y-m-d').EXT;\r
- $message = '';\r
- \r
- if ( ! file_exists($filepath))\r
- {\r
- $message .= "<"."?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?".">\n\n";\r
- }\r
- \r
- if ( ! $fp = @fopen($filepath, FOPEN_WRITE_CREATE))\r
- {\r
- return FALSE;\r
- }\r
-\r
- $message .= $level.' '.(($level == 'INFO') ? ' -' : '-').' '.date($this->_date_fmt). ' --> '.$msg."\n";\r
- \r
- flock($fp, LOCK_EX); \r
- fwrite($fp, $message);\r
- flock($fp, LOCK_UN);\r
- fclose($fp);\r
- \r
- @chmod($filepath, FILE_WRITE_MODE); \r
- return TRUE;\r
- }\r
-\r
-}\r
-// END Log Class\r
-\r
-/* End of file Log.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Logging Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Logging
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/general/errors.html
+ */
+class CI_Log {
+
+ var $log_path;
+ var $_threshold = 1;
+ var $_date_fmt = 'Y-m-d H:i:s';
+ var $_enabled = TRUE;
+ var $_levels = array('ERROR' => '1', 'DEBUG' => '2', 'INFO' => '3', 'ALL' => '4');
+
+ /**
+ * Constructor
+ *
+ * @access public
+ */
+ function CI_Log()
+ {
+ $config =& get_config();
+
+ $this->log_path = ($config['log_path'] != '') ? $config['log_path'] : BASEPATH.'logs/';
+
+ if ( ! is_dir($this->log_path) OR ! is_really_writable($this->log_path))
+ {
+ $this->_enabled = FALSE;
+ }
+
+ if (is_numeric($config['log_threshold']))
+ {
+ $this->_threshold = $config['log_threshold'];
+ }
+
+ if ($config['log_date_format'] != '')
+ {
+ $this->_date_fmt = $config['log_date_format'];
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Write Log File
+ *
+ * Generally this function will be called using the global log_message() function
+ *
+ * @access public
+ * @param string the error level
+ * @param string the error message
+ * @param bool whether the error is a native PHP error
+ * @return bool
+ */
+ function write_log($level = 'error', $msg, $php_error = FALSE)
+ {
+ if ($this->_enabled === FALSE)
+ {
+ return FALSE;
+ }
+
+ $level = strtoupper($level);
+
+ if ( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))
+ {
+ return FALSE;
+ }
+
+ $filepath = $this->log_path.'log-'.date('Y-m-d').EXT;
+ $message = '';
+
+ if ( ! file_exists($filepath))
+ {
+ $message .= "<"."?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?".">\n\n";
+ }
+
+ if ( ! $fp = @fopen($filepath, FOPEN_WRITE_CREATE))
+ {
+ return FALSE;
+ }
+
+ $message .= $level.' '.(($level == 'INFO') ? ' -' : '-').' '.date($this->_date_fmt). ' --> '.$msg."\n";
+
+ flock($fp, LOCK_EX);
+ fwrite($fp, $message);
+ flock($fp, LOCK_UN);
+ fclose($fp);
+
+ @chmod($filepath, FILE_WRITE_MODE);
+ return TRUE;
+ }
+
+}
+// END Log Class
+
+/* End of file Log.php */
/* Location: ./system/libraries/Log.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Model Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/config.html\r
- */\r
-class Model {\r
-\r
- var $_parent_name = '';\r
-\r
- /**\r
- * Constructor\r
- *\r
- * @access public\r
- */\r
- function Model()\r
- {\r
- // If the magic __get() or __set() methods are used in a Model references can't be used.\r
- $this->_assign_libraries( (method_exists($this, '__get') OR method_exists($this, '__set')) ? FALSE : TRUE );\r
- \r
- // We don't want to assign the model object to itself when using the\r
- // assign_libraries function below so we'll grab the name of the model parent\r
- $this->_parent_name = ucfirst(get_class($this));\r
- \r
- log_message('debug', "Model Class Initialized");\r
- }\r
-\r
- /**\r
- * Assign Libraries\r
- *\r
- * Creates local references to all currently instantiated objects\r
- * so that any syntax that can be legally used in a controller\r
- * can be used within models. \r
- *\r
- * @access private\r
- */ \r
- function _assign_libraries($use_reference = TRUE)\r
- {\r
- $CI =& get_instance(); \r
- foreach (array_keys(get_object_vars($CI)) as $key)\r
- {\r
- if ( ! isset($this->$key) AND $key != $this->_parent_name)\r
- { \r
- // In some cases using references can cause\r
- // problems so we'll conditionally use them\r
- if ($use_reference == TRUE)\r
- {\r
- $this->$key = NULL; // Needed to prevent reference errors with some configurations\r
- $this->$key =& $CI->$key;\r
- }\r
- else\r
- {\r
- $this->$key = $CI->$key;\r
- }\r
- }\r
- } \r
- }\r
-\r
-}\r
-// END Model Class\r
-\r
-/* End of file Model.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Model Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/config.html
+ */
+class Model {
+
+ var $_parent_name = '';
+
+ /**
+ * Constructor
+ *
+ * @access public
+ */
+ function Model()
+ {
+ // If the magic __get() or __set() methods are used in a Model references can't be used.
+ $this->_assign_libraries( (method_exists($this, '__get') OR method_exists($this, '__set')) ? FALSE : TRUE );
+
+ // We don't want to assign the model object to itself when using the
+ // assign_libraries function below so we'll grab the name of the model parent
+ $this->_parent_name = ucfirst(get_class($this));
+
+ log_message('debug', "Model Class Initialized");
+ }
+
+ /**
+ * Assign Libraries
+ *
+ * Creates local references to all currently instantiated objects
+ * so that any syntax that can be legally used in a controller
+ * can be used within models.
+ *
+ * @access private
+ */
+ function _assign_libraries($use_reference = TRUE)
+ {
+ $CI =& get_instance();
+ foreach (array_keys(get_object_vars($CI)) as $key)
+ {
+ if ( ! isset($this->$key) AND $key != $this->_parent_name)
+ {
+ // In some cases using references can cause
+ // problems so we'll conditionally use them
+ if ($use_reference == TRUE)
+ {
+ $this->$key = NULL; // Needed to prevent reference errors with some configurations
+ $this->$key =& $CI->$key;
+ }
+ else
+ {
+ $this->$key = $CI->$key;
+ }
+ }
+ }
+ }
+
+}
+// END Model Class
+
+/* End of file Model.php */
/* Location: ./system/libraries/Model.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Output Class\r
- *\r
- * Responsible for sending final output to browser\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Output\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/output.html\r
- */\r
-class CI_Output {\r
-\r
- var $final_output;\r
- var $cache_expiration = 0;\r
- var $headers = array();\r
- var $enable_profiler = FALSE;\r
-\r
-\r
- function CI_Output()\r
- {\r
- log_message('debug', "Output Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get Output\r
- *\r
- * Returns the current output string\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function get_output()\r
- {\r
- return $this->final_output;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Output\r
- *\r
- * Sets the output string\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_output($output)\r
- {\r
- $this->final_output = $output;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Append Output\r
- *\r
- * Appends data onto the output string\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function append_output($output)\r
- {\r
- if ($this->final_output == '')\r
- {\r
- $this->final_output = $output;\r
- }\r
- else\r
- {\r
- $this->final_output .= $output;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set Header\r
- *\r
- * Lets you set a server header which will be outputted with the final display.\r
- *\r
- * Note: If a file is cached, headers will not be sent. We need to figure out\r
- * how to permit header data to be saved with the cache data...\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_header($header, $replace = TRUE)\r
- {\r
- $this->headers[] = array($header, $replace);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set HTTP Status Header\r
- *\r
- * @access public\r
- * @param int the status code\r
- * @param string \r
- * @return void\r
- */ \r
- function set_status_header($code = '200', $text = '')\r
- {\r
- $stati = array(\r
- '200' => 'OK',\r
- '201' => 'Created',\r
- '202' => 'Accepted',\r
- '203' => 'Non-Authoritative Information',\r
- '204' => 'No Content',\r
- '205' => 'Reset Content',\r
- '206' => 'Partial Content',\r
- \r
- '300' => 'Multiple Choices',\r
- '301' => 'Moved Permanently',\r
- '302' => 'Found',\r
- '304' => 'Not Modified',\r
- '305' => 'Use Proxy',\r
- '307' => 'Temporary Redirect',\r
- \r
- '400' => 'Bad Request',\r
- '401' => 'Unauthorized',\r
- '403' => 'Forbidden',\r
- '404' => 'Not Found',\r
- '405' => 'Method Not Allowed',\r
- '406' => 'Not Acceptable',\r
- '407' => 'Proxy Authentication Required',\r
- '408' => 'Request Timeout',\r
- '409' => 'Conflict',\r
- '410' => 'Gone',\r
- '411' => 'Length Required',\r
- '412' => 'Precondition Failed',\r
- '413' => 'Request Entity Too Large',\r
- '414' => 'Request-URI Too Long',\r
- '415' => 'Unsupported Media Type',\r
- '416' => 'Requested Range Not Satisfiable',\r
- '417' => 'Expectation Failed',\r
- \r
- '500' => 'Internal Server Error',\r
- '501' => 'Not Implemented',\r
- '502' => 'Bad Gateway',\r
- '503' => 'Service Unavailable',\r
- '504' => 'Gateway Timeout',\r
- '505' => 'HTTP Version Not Supported'\r
- );\r
-\r
- if ($code == '' OR ! is_numeric($code))\r
- {\r
- show_error('Status codes must be numeric');\r
- }\r
-\r
- if (isset($stati[$code]) AND $text == '')\r
- { \r
- $text = $stati[$code];\r
- }\r
- \r
- if ($text == '')\r
- {\r
- show_error('No status text available. Please check your status code number or supply your own message text.');\r
- }\r
- \r
- $server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : FALSE;\r
- \r
- if (substr(php_sapi_name(), 0, 3) == 'cgi')\r
- {\r
- header("Status: {$code} {$text}", TRUE);\r
- }\r
- elseif ($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0')\r
- {\r
- header($server_protocol." {$code} {$text}", TRUE, $code);\r
- }\r
- else\r
- {\r
- header("HTTP/1.1 {$code} {$text}", TRUE, $code);\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Enable/disable Profiler\r
- *\r
- * @access public\r
- * @param bool\r
- * @return void\r
- */ \r
- function enable_profiler($val = TRUE)\r
- {\r
- $this->enable_profiler = (is_bool($val)) ? $val : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Cache\r
- *\r
- * @access public\r
- * @param integer\r
- * @return void\r
- */ \r
- function cache($time)\r
- {\r
- $this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Display Output\r
- *\r
- * All "view" data is automatically put into this variable by the controller class:\r
- *\r
- * $this->final_output\r
- *\r
- * This function sends the finalized output data to the browser along\r
- * with any server headers and profile data. It also stops the\r
- * benchmark timer so the page rendering speed and memory usage can be shown.\r
- *\r
- * @access public\r
- * @return mixed\r
- */ \r
- function _display($output = '')\r
- { \r
- // Note: We use globals because we can't use $CI =& get_instance()\r
- // since this function is sometimes called by the caching mechanism,\r
- // which happens before the CI super object is available.\r
- global $BM, $CFG;\r
- \r
- // --------------------------------------------------------------------\r
- \r
- // Set the output data\r
- if ($output == '')\r
- {\r
- $output =& $this->final_output;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- // Do we need to write a cache file?\r
- if ($this->cache_expiration > 0)\r
- {\r
- $this->_write_cache($output);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- // Parse out the elapsed time and memory usage,\r
- // then swap the pseudo-variables with the data\r
-\r
- $elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end'); \r
- $output = str_replace('{elapsed_time}', $elapsed, $output);\r
- \r
- $memory = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB';\r
- $output = str_replace('{memory_usage}', $memory, $output); \r
-\r
- // --------------------------------------------------------------------\r
- \r
- // Is compression requested?\r
- if ($CFG->item('compress_output') === TRUE)\r
- {\r
- if (extension_loaded('zlib'))\r
- {\r
- if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) AND strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)\r
- {\r
- ob_start('ob_gzhandler');\r
- }\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- // Are there any server headers to send?\r
- if (count($this->headers) > 0)\r
- {\r
- foreach ($this->headers as $header)\r
- {\r
- @header($header[0], $header[1]);\r
- }\r
- } \r
-\r
- // --------------------------------------------------------------------\r
- \r
- // Does the get_instance() function exist?\r
- // If not we know we are dealing with a cache file so we'll\r
- // simply echo out the data and exit.\r
- if ( ! function_exists('get_instance'))\r
- {\r
- echo $output;\r
- log_message('debug', "Final output sent to browser");\r
- log_message('debug', "Total execution time: ".$elapsed);\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- // Grab the super object. We'll need it in a moment...\r
- $CI =& get_instance();\r
- \r
- // Do we need to generate profile data?\r
- // If so, load the Profile class and run it.\r
- if ($this->enable_profiler == TRUE)\r
- {\r
- $CI->load->library('profiler'); \r
- \r
- // If the output data contains closing </body> and </html> tags\r
- // we will remove them and add them back after we insert the profile data\r
- if (preg_match("|</body>.*?</html>|is", $output))\r
- {\r
- $output = preg_replace("|</body>.*?</html>|is", '', $output);\r
- $output .= $CI->profiler->run();\r
- $output .= '</body></html>';\r
- }\r
- else\r
- {\r
- $output .= $CI->profiler->run();\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- // Does the controller contain a function named _output()?\r
- // If so send the output there. Otherwise, echo it.\r
- if (method_exists($CI, '_output'))\r
- {\r
- $CI->_output($output);\r
- }\r
- else\r
- {\r
- echo $output; // Send it to the browser!\r
- }\r
- \r
- log_message('debug', "Final output sent to browser");\r
- log_message('debug', "Total execution time: ".$elapsed); \r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Write a Cache File\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function _write_cache($output)\r
- {\r
- $CI =& get_instance(); \r
- $path = $CI->config->item('cache_path');\r
- \r
- $cache_path = ($path == '') ? BASEPATH.'cache/' : $path;\r
- \r
- if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))\r
- {\r
- return;\r
- }\r
- \r
- $uri = $CI->config->item('base_url').\r
- $CI->config->item('index_page').\r
- $CI->uri->uri_string();\r
- \r
- $cache_path .= md5($uri);\r
-\r
- if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE))\r
- {\r
- log_message('error', "Unable to write cache file: ".$cache_path);\r
- return;\r
- }\r
- \r
- $expire = time() + ($this->cache_expiration * 60);\r
- \r
- if (flock($fp, LOCK_EX))\r
- {\r
- fwrite($fp, $expire.'TS--->'.$output);\r
- flock($fp, LOCK_UN);\r
- }\r
- else\r
- {\r
- log_message('error', "Unable to secure a file lock for file at: ".$cache_path);\r
- return;\r
- }\r
- fclose($fp);\r
- @chmod($cache_path, DIR_WRITE_MODE);\r
-\r
- log_message('debug', "Cache file written: ".$cache_path);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Update/serve a cached file\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function _display_cache(&$CFG, &$URI)\r
- {\r
- $cache_path = ($CFG->item('cache_path') == '') ? BASEPATH.'cache/' : $CFG->item('cache_path');\r
- \r
- if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))\r
- {\r
- return FALSE;\r
- }\r
- \r
- // Build the file path. The file name is an MD5 hash of the full URI\r
- $uri = $CFG->item('base_url').\r
- $CFG->item('index_page').\r
- $URI->uri_string;\r
- \r
- $filepath = $cache_path.md5($uri);\r
- \r
- if ( ! @file_exists($filepath))\r
- {\r
- return FALSE;\r
- }\r
- \r
- if ( ! $fp = @fopen($filepath, FOPEN_READ))\r
- {\r
- return FALSE;\r
- }\r
- \r
- flock($fp, LOCK_SH);\r
- \r
- $cache = '';\r
- if (filesize($filepath) > 0)\r
- {\r
- $cache = fread($fp, filesize($filepath));\r
- }\r
- \r
- flock($fp, LOCK_UN);\r
- fclose($fp);\r
- \r
- // Strip out the embedded timestamp \r
- if ( ! preg_match("/(\d+TS--->)/", $cache, $match))\r
- {\r
- return FALSE;\r
- }\r
- \r
- // Has the file expired? If so we'll delete it.\r
- if (time() >= trim(str_replace('TS--->', '', $match['1'])))\r
- { \r
- @unlink($filepath);\r
- log_message('debug', "Cache file has expired. File deleted");\r
- return FALSE;\r
- }\r
-\r
- // Display the cache\r
- $this->_display(str_replace($match['0'], '', $cache));\r
- log_message('debug', "Cache file is current. Sending it to browser."); \r
- return TRUE;\r
- }\r
-\r
-\r
-}\r
-// END Output Class\r
-\r
-/* End of file Output.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Output Class
+ *
+ * Responsible for sending final output to browser
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Output
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/output.html
+ */
+class CI_Output {
+
+ var $final_output;
+ var $cache_expiration = 0;
+ var $headers = array();
+ var $enable_profiler = FALSE;
+
+
+ function CI_Output()
+ {
+ log_message('debug', "Output Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Output
+ *
+ * Returns the current output string
+ *
+ * @access public
+ * @return string
+ */
+ function get_output()
+ {
+ return $this->final_output;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Output
+ *
+ * Sets the output string
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_output($output)
+ {
+ $this->final_output = $output;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Append Output
+ *
+ * Appends data onto the output string
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function append_output($output)
+ {
+ if ($this->final_output == '')
+ {
+ $this->final_output = $output;
+ }
+ else
+ {
+ $this->final_output .= $output;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Header
+ *
+ * Lets you set a server header which will be outputted with the final display.
+ *
+ * Note: If a file is cached, headers will not be sent. We need to figure out
+ * how to permit header data to be saved with the cache data...
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_header($header, $replace = TRUE)
+ {
+ $this->headers[] = array($header, $replace);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set HTTP Status Header
+ *
+ * @access public
+ * @param int the status code
+ * @param string
+ * @return void
+ */
+ function set_status_header($code = '200', $text = '')
+ {
+ $stati = array(
+ '200' => 'OK',
+ '201' => 'Created',
+ '202' => 'Accepted',
+ '203' => 'Non-Authoritative Information',
+ '204' => 'No Content',
+ '205' => 'Reset Content',
+ '206' => 'Partial Content',
+
+ '300' => 'Multiple Choices',
+ '301' => 'Moved Permanently',
+ '302' => 'Found',
+ '304' => 'Not Modified',
+ '305' => 'Use Proxy',
+ '307' => 'Temporary Redirect',
+
+ '400' => 'Bad Request',
+ '401' => 'Unauthorized',
+ '403' => 'Forbidden',
+ '404' => 'Not Found',
+ '405' => 'Method Not Allowed',
+ '406' => 'Not Acceptable',
+ '407' => 'Proxy Authentication Required',
+ '408' => 'Request Timeout',
+ '409' => 'Conflict',
+ '410' => 'Gone',
+ '411' => 'Length Required',
+ '412' => 'Precondition Failed',
+ '413' => 'Request Entity Too Large',
+ '414' => 'Request-URI Too Long',
+ '415' => 'Unsupported Media Type',
+ '416' => 'Requested Range Not Satisfiable',
+ '417' => 'Expectation Failed',
+
+ '500' => 'Internal Server Error',
+ '501' => 'Not Implemented',
+ '502' => 'Bad Gateway',
+ '503' => 'Service Unavailable',
+ '504' => 'Gateway Timeout',
+ '505' => 'HTTP Version Not Supported'
+ );
+
+ if ($code == '' OR ! is_numeric($code))
+ {
+ show_error('Status codes must be numeric');
+ }
+
+ if (isset($stati[$code]) AND $text == '')
+ {
+ $text = $stati[$code];
+ }
+
+ if ($text == '')
+ {
+ show_error('No status text available. Please check your status code number or supply your own message text.');
+ }
+
+ $server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : FALSE;
+
+ if (substr(php_sapi_name(), 0, 3) == 'cgi')
+ {
+ header("Status: {$code} {$text}", TRUE);
+ }
+ elseif ($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0')
+ {
+ header($server_protocol." {$code} {$text}", TRUE, $code);
+ }
+ else
+ {
+ header("HTTP/1.1 {$code} {$text}", TRUE, $code);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Enable/disable Profiler
+ *
+ * @access public
+ * @param bool
+ * @return void
+ */
+ function enable_profiler($val = TRUE)
+ {
+ $this->enable_profiler = (is_bool($val)) ? $val : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Cache
+ *
+ * @access public
+ * @param integer
+ * @return void
+ */
+ function cache($time)
+ {
+ $this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Display Output
+ *
+ * All "view" data is automatically put into this variable by the controller class:
+ *
+ * $this->final_output
+ *
+ * This function sends the finalized output data to the browser along
+ * with any server headers and profile data. It also stops the
+ * benchmark timer so the page rendering speed and memory usage can be shown.
+ *
+ * @access public
+ * @return mixed
+ */
+ function _display($output = '')
+ {
+ // Note: We use globals because we can't use $CI =& get_instance()
+ // since this function is sometimes called by the caching mechanism,
+ // which happens before the CI super object is available.
+ global $BM, $CFG;
+
+ // --------------------------------------------------------------------
+
+ // Set the output data
+ if ($output == '')
+ {
+ $output =& $this->final_output;
+ }
+
+ // --------------------------------------------------------------------
+
+ // Do we need to write a cache file?
+ if ($this->cache_expiration > 0)
+ {
+ $this->_write_cache($output);
+ }
+
+ // --------------------------------------------------------------------
+
+ // Parse out the elapsed time and memory usage,
+ // then swap the pseudo-variables with the data
+
+ $elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end');
+ $output = str_replace('{elapsed_time}', $elapsed, $output);
+
+ $memory = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB';
+ $output = str_replace('{memory_usage}', $memory, $output);
+
+ // --------------------------------------------------------------------
+
+ // Is compression requested?
+ if ($CFG->item('compress_output') === TRUE)
+ {
+ if (extension_loaded('zlib'))
+ {
+ if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) AND strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE)
+ {
+ ob_start('ob_gzhandler');
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ // Are there any server headers to send?
+ if (count($this->headers) > 0)
+ {
+ foreach ($this->headers as $header)
+ {
+ @header($header[0], $header[1]);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ // Does the get_instance() function exist?
+ // If not we know we are dealing with a cache file so we'll
+ // simply echo out the data and exit.
+ if ( ! function_exists('get_instance'))
+ {
+ echo $output;
+ log_message('debug', "Final output sent to browser");
+ log_message('debug', "Total execution time: ".$elapsed);
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ // Grab the super object. We'll need it in a moment...
+ $CI =& get_instance();
+
+ // Do we need to generate profile data?
+ // If so, load the Profile class and run it.
+ if ($this->enable_profiler == TRUE)
+ {
+ $CI->load->library('profiler');
+
+ // If the output data contains closing </body> and </html> tags
+ // we will remove them and add them back after we insert the profile data
+ if (preg_match("|</body>.*?</html>|is", $output))
+ {
+ $output = preg_replace("|</body>.*?</html>|is", '', $output);
+ $output .= $CI->profiler->run();
+ $output .= '</body></html>';
+ }
+ else
+ {
+ $output .= $CI->profiler->run();
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ // Does the controller contain a function named _output()?
+ // If so send the output there. Otherwise, echo it.
+ if (method_exists($CI, '_output'))
+ {
+ $CI->_output($output);
+ }
+ else
+ {
+ echo $output; // Send it to the browser!
+ }
+
+ log_message('debug', "Final output sent to browser");
+ log_message('debug', "Total execution time: ".$elapsed);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Write a Cache File
+ *
+ * @access public
+ * @return void
+ */
+ function _write_cache($output)
+ {
+ $CI =& get_instance();
+ $path = $CI->config->item('cache_path');
+
+ $cache_path = ($path == '') ? BASEPATH.'cache/' : $path;
+
+ if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
+ {
+ return;
+ }
+
+ $uri = $CI->config->item('base_url').
+ $CI->config->item('index_page').
+ $CI->uri->uri_string();
+
+ $cache_path .= md5($uri);
+
+ if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE))
+ {
+ log_message('error', "Unable to write cache file: ".$cache_path);
+ return;
+ }
+
+ $expire = time() + ($this->cache_expiration * 60);
+
+ if (flock($fp, LOCK_EX))
+ {
+ fwrite($fp, $expire.'TS--->'.$output);
+ flock($fp, LOCK_UN);
+ }
+ else
+ {
+ log_message('error', "Unable to secure a file lock for file at: ".$cache_path);
+ return;
+ }
+ fclose($fp);
+ @chmod($cache_path, DIR_WRITE_MODE);
+
+ log_message('debug', "Cache file written: ".$cache_path);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Update/serve a cached file
+ *
+ * @access public
+ * @return void
+ */
+ function _display_cache(&$CFG, &$URI)
+ {
+ $cache_path = ($CFG->item('cache_path') == '') ? BASEPATH.'cache/' : $CFG->item('cache_path');
+
+ if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
+ {
+ return FALSE;
+ }
+
+ // Build the file path. The file name is an MD5 hash of the full URI
+ $uri = $CFG->item('base_url').
+ $CFG->item('index_page').
+ $URI->uri_string;
+
+ $filepath = $cache_path.md5($uri);
+
+ if ( ! @file_exists($filepath))
+ {
+ return FALSE;
+ }
+
+ if ( ! $fp = @fopen($filepath, FOPEN_READ))
+ {
+ return FALSE;
+ }
+
+ flock($fp, LOCK_SH);
+
+ $cache = '';
+ if (filesize($filepath) > 0)
+ {
+ $cache = fread($fp, filesize($filepath));
+ }
+
+ flock($fp, LOCK_UN);
+ fclose($fp);
+
+ // Strip out the embedded timestamp
+ if ( ! preg_match("/(\d+TS--->)/", $cache, $match))
+ {
+ return FALSE;
+ }
+
+ // Has the file expired? If so we'll delete it.
+ if (time() >= trim(str_replace('TS--->', '', $match['1'])))
+ {
+ @unlink($filepath);
+ log_message('debug', "Cache file has expired. File deleted");
+ return FALSE;
+ }
+
+ // Display the cache
+ $this->_display(str_replace($match['0'], '', $cache));
+ log_message('debug', "Cache file is current. Sending it to browser.");
+ return TRUE;
+ }
+
+
+}
+// END Output Class
+
+/* End of file Output.php */
/* Location: ./system/libraries/Output.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Pagination Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Pagination\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/pagination.html\r
- */\r
-class CI_Pagination {\r
-\r
- var $base_url = ''; // The page we are linking to\r
- var $total_rows = ''; // Total number of items (database results)\r
- var $per_page = 10; // Max number of items you want shown per page\r
- var $num_links = 2; // Number of "digit" links to show before/after the currently viewed page\r
- var $cur_page = 0; // The current page being viewed\r
- var $first_link = '‹ First';\r
- var $next_link = '>';\r
- var $prev_link = '<';\r
- var $last_link = 'Last ›';\r
- var $uri_segment = 3;\r
- var $full_tag_open = '';\r
- var $full_tag_close = '';\r
- var $first_tag_open = '';\r
- var $first_tag_close = ' ';\r
- var $last_tag_open = ' ';\r
- var $last_tag_close = '';\r
- var $cur_tag_open = ' <b>';\r
- var $cur_tag_close = '</b>';\r
- var $next_tag_open = ' ';\r
- var $next_tag_close = ' ';\r
- var $prev_tag_open = ' ';\r
- var $prev_tag_close = '';\r
- var $num_tag_open = ' ';\r
- var $num_tag_close = '';\r
- var $page_query_string = FALSE;\r
- var $query_string_segment = 'per_page';\r
-\r
- /**\r
- * Constructor\r
- *\r
- * @access public\r
- * @param array initialization parameters\r
- */\r
- function CI_Pagination($params = array())\r
- {\r
- if (count($params) > 0)\r
- {\r
- $this->initialize($params); \r
- }\r
- \r
- log_message('debug', "Pagination Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Initialize Preferences\r
- *\r
- * @access public\r
- * @param array initialization parameters\r
- * @return void\r
- */\r
- function initialize($params = array())\r
- {\r
- if (count($params) > 0)\r
- {\r
- foreach ($params as $key => $val)\r
- {\r
- if (isset($this->$key))\r
- {\r
- $this->$key = $val;\r
- }\r
- }\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Generate the pagination links\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function create_links()\r
- {\r
- // If our item count or per-page total is zero there is no need to continue.\r
- if ($this->total_rows == 0 OR $this->per_page == 0)\r
- {\r
- return '';\r
- }\r
-\r
- // Calculate the total number of pages\r
- $num_pages = ceil($this->total_rows / $this->per_page);\r
-\r
- // Is there only one page? Hm... nothing more to do here then.\r
- if ($num_pages == 1)\r
- {\r
- return '';\r
- }\r
-\r
- // Determine the current page number. \r
- $CI =& get_instance();\r
- \r
- if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)\r
- {\r
- if ($CI->input->get($this->query_string_segment) != 0)\r
- {\r
- $this->cur_page = $CI->input->get($this->query_string_segment);\r
- \r
- // Prep the current page - no funny business!\r
- $this->cur_page = (int) $this->cur_page;\r
- }\r
- }\r
- else\r
- {\r
- if ($CI->uri->segment($this->uri_segment) != 0)\r
- {\r
- $this->cur_page = $CI->uri->segment($this->uri_segment);\r
- \r
- // Prep the current page - no funny business!\r
- $this->cur_page = (int) $this->cur_page;\r
- }\r
- }\r
-\r
- $this->num_links = (int)$this->num_links;\r
- \r
- if ($this->num_links < 1)\r
- {\r
- show_error('Your number of links must be a positive number.');\r
- }\r
- \r
- if ( ! is_numeric($this->cur_page))\r
- {\r
- $this->cur_page = 0;\r
- }\r
- \r
- // Is the page number beyond the result range?\r
- // If so we show the last page\r
- if ($this->cur_page > $this->total_rows)\r
- {\r
- $this->cur_page = ($num_pages - 1) * $this->per_page;\r
- }\r
- \r
- $uri_page_number = $this->cur_page;\r
- $this->cur_page = floor(($this->cur_page/$this->per_page) + 1);\r
-\r
- // Calculate the start and end numbers. These determine\r
- // which number to start and end the digit links with\r
- $start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1;\r
- $end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages;\r
-\r
- // Is pagination being used over GET or POST? If get, add a per_page query\r
- // string. If post, add a trailing slash to the base URL if needed\r
- if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)\r
- {\r
- $this->base_url = rtrim($this->base_url).'&'.$this->query_string_segment.'=';\r
- }\r
- else\r
- {\r
- $this->base_url = rtrim($this->base_url, '/') .'/';\r
- }\r
-\r
- // And here we go...\r
- $output = '';\r
-\r
- // Render the "First" link\r
- if ($this->cur_page > ($this->num_links + 1))\r
- {\r
- $output .= $this->first_tag_open.'<a href="'.$this->base_url.'">'.$this->first_link.'</a>'.$this->first_tag_close;\r
- }\r
-\r
- // Render the "previous" link\r
- if ($this->cur_page != 1)\r
- {\r
- $i = $uri_page_number - $this->per_page;\r
- if ($i == 0) $i = '';\r
- $output .= $this->prev_tag_open.'<a href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close;\r
- }\r
-\r
- // Write the digit links\r
- for ($loop = $start -1; $loop <= $end; $loop++)\r
- {\r
- $i = ($loop * $this->per_page) - $this->per_page;\r
- \r
- if ($i >= 0)\r
- {\r
- if ($this->cur_page == $loop)\r
- {\r
- $output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page\r
- }\r
- else\r
- {\r
- $n = ($i == 0) ? '' : $i;\r
- $output .= $this->num_tag_open.'<a href="'.$this->base_url.$n.'">'.$loop.'</a>'.$this->num_tag_close;\r
- }\r
- }\r
- }\r
-\r
- // Render the "next" link\r
- if ($this->cur_page < $num_pages)\r
- {\r
- $output .= $this->next_tag_open.'<a href="'.$this->base_url.($this->cur_page * $this->per_page).'">'.$this->next_link.'</a>'.$this->next_tag_close;\r
- }\r
-\r
- // Render the "Last" link\r
- if (($this->cur_page + $this->num_links) < $num_pages)\r
- {\r
- $i = (($num_pages * $this->per_page) - $this->per_page);\r
- $output .= $this->last_tag_open.'<a href="'.$this->base_url.$i.'">'.$this->last_link.'</a>'.$this->last_tag_close;\r
- }\r
-\r
- // Kill double slashes. Note: Sometimes we can end up with a double slash\r
- // in the penultimate link so we'll kill all double slashes.\r
- $output = preg_replace("#([^:])//+#", "\\1/", $output);\r
-\r
- // Add the wrapper HTML if exists\r
- $output = $this->full_tag_open.$output.$this->full_tag_close;\r
- \r
- return $output; \r
- }\r
-}\r
-// END Pagination Class\r
-\r
-/* End of file Pagination.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Pagination Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Pagination
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/pagination.html
+ */
+class CI_Pagination {
+
+ var $base_url = ''; // The page we are linking to
+ var $total_rows = ''; // Total number of items (database results)
+ var $per_page = 10; // Max number of items you want shown per page
+ var $num_links = 2; // Number of "digit" links to show before/after the currently viewed page
+ var $cur_page = 0; // The current page being viewed
+ var $first_link = '‹ First';
+ var $next_link = '>';
+ var $prev_link = '<';
+ var $last_link = 'Last ›';
+ var $uri_segment = 3;
+ var $full_tag_open = '';
+ var $full_tag_close = '';
+ var $first_tag_open = '';
+ var $first_tag_close = ' ';
+ var $last_tag_open = ' ';
+ var $last_tag_close = '';
+ var $cur_tag_open = ' <b>';
+ var $cur_tag_close = '</b>';
+ var $next_tag_open = ' ';
+ var $next_tag_close = ' ';
+ var $prev_tag_open = ' ';
+ var $prev_tag_close = '';
+ var $num_tag_open = ' ';
+ var $num_tag_close = '';
+ var $page_query_string = FALSE;
+ var $query_string_segment = 'per_page';
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param array initialization parameters
+ */
+ function CI_Pagination($params = array())
+ {
+ if (count($params) > 0)
+ {
+ $this->initialize($params);
+ }
+
+ log_message('debug', "Pagination Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize Preferences
+ *
+ * @access public
+ * @param array initialization parameters
+ * @return void
+ */
+ function initialize($params = array())
+ {
+ if (count($params) > 0)
+ {
+ foreach ($params as $key => $val)
+ {
+ if (isset($this->$key))
+ {
+ $this->$key = $val;
+ }
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate the pagination links
+ *
+ * @access public
+ * @return string
+ */
+ function create_links()
+ {
+ // If our item count or per-page total is zero there is no need to continue.
+ if ($this->total_rows == 0 OR $this->per_page == 0)
+ {
+ return '';
+ }
+
+ // Calculate the total number of pages
+ $num_pages = ceil($this->total_rows / $this->per_page);
+
+ // Is there only one page? Hm... nothing more to do here then.
+ if ($num_pages == 1)
+ {
+ return '';
+ }
+
+ // Determine the current page number.
+ $CI =& get_instance();
+
+ if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
+ {
+ if ($CI->input->get($this->query_string_segment) != 0)
+ {
+ $this->cur_page = $CI->input->get($this->query_string_segment);
+
+ // Prep the current page - no funny business!
+ $this->cur_page = (int) $this->cur_page;
+ }
+ }
+ else
+ {
+ if ($CI->uri->segment($this->uri_segment) != 0)
+ {
+ $this->cur_page = $CI->uri->segment($this->uri_segment);
+
+ // Prep the current page - no funny business!
+ $this->cur_page = (int) $this->cur_page;
+ }
+ }
+
+ $this->num_links = (int)$this->num_links;
+
+ if ($this->num_links < 1)
+ {
+ show_error('Your number of links must be a positive number.');
+ }
+
+ if ( ! is_numeric($this->cur_page))
+ {
+ $this->cur_page = 0;
+ }
+
+ // Is the page number beyond the result range?
+ // If so we show the last page
+ if ($this->cur_page > $this->total_rows)
+ {
+ $this->cur_page = ($num_pages - 1) * $this->per_page;
+ }
+
+ $uri_page_number = $this->cur_page;
+ $this->cur_page = floor(($this->cur_page/$this->per_page) + 1);
+
+ // Calculate the start and end numbers. These determine
+ // which number to start and end the digit links with
+ $start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1;
+ $end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages;
+
+ // Is pagination being used over GET or POST? If get, add a per_page query
+ // string. If post, add a trailing slash to the base URL if needed
+ if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
+ {
+ $this->base_url = rtrim($this->base_url).'&'.$this->query_string_segment.'=';
+ }
+ else
+ {
+ $this->base_url = rtrim($this->base_url, '/') .'/';
+ }
+
+ // And here we go...
+ $output = '';
+
+ // Render the "First" link
+ if ($this->cur_page > ($this->num_links + 1))
+ {
+ $output .= $this->first_tag_open.'<a href="'.$this->base_url.'">'.$this->first_link.'</a>'.$this->first_tag_close;
+ }
+
+ // Render the "previous" link
+ if ($this->cur_page != 1)
+ {
+ $i = $uri_page_number - $this->per_page;
+ if ($i == 0) $i = '';
+ $output .= $this->prev_tag_open.'<a href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close;
+ }
+
+ // Write the digit links
+ for ($loop = $start -1; $loop <= $end; $loop++)
+ {
+ $i = ($loop * $this->per_page) - $this->per_page;
+
+ if ($i >= 0)
+ {
+ if ($this->cur_page == $loop)
+ {
+ $output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page
+ }
+ else
+ {
+ $n = ($i == 0) ? '' : $i;
+ $output .= $this->num_tag_open.'<a href="'.$this->base_url.$n.'">'.$loop.'</a>'.$this->num_tag_close;
+ }
+ }
+ }
+
+ // Render the "next" link
+ if ($this->cur_page < $num_pages)
+ {
+ $output .= $this->next_tag_open.'<a href="'.$this->base_url.($this->cur_page * $this->per_page).'">'.$this->next_link.'</a>'.$this->next_tag_close;
+ }
+
+ // Render the "Last" link
+ if (($this->cur_page + $this->num_links) < $num_pages)
+ {
+ $i = (($num_pages * $this->per_page) - $this->per_page);
+ $output .= $this->last_tag_open.'<a href="'.$this->base_url.$i.'">'.$this->last_link.'</a>'.$this->last_tag_close;
+ }
+
+ // Kill double slashes. Note: Sometimes we can end up with a double slash
+ // in the penultimate link so we'll kill all double slashes.
+ $output = preg_replace("#([^:])//+#", "\\1/", $output);
+
+ // Add the wrapper HTML if exists
+ $output = $this->full_tag_open.$output.$this->full_tag_close;
+
+ return $output;
+ }
+}
+// END Pagination Class
+
+/* End of file Pagination.php */
/* Location: ./system/libraries/Pagination.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Parser Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Parser\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/parser.html\r
- */\r
-class CI_Parser {\r
-\r
- var $l_delim = '{';\r
- var $r_delim = '}';\r
- var $object;\r
- \r
- /**\r
- * Parse a template\r
- *\r
- * Parses pseudo-variables contained in the specified template,\r
- * replacing them with the data in the second param\r
- *\r
- * @access public\r
- * @param string\r
- * @param array\r
- * @param bool\r
- * @return string\r
- */\r
- function parse($template, $data, $return = FALSE)\r
- {\r
- $CI =& get_instance();\r
- $template = $CI->load->view($template, $data, TRUE);\r
- \r
- if ($template == '')\r
- {\r
- return FALSE;\r
- }\r
- \r
- foreach ($data as $key => $val)\r
- {\r
- if (is_array($val))\r
- {\r
- $template = $this->_parse_pair($key, $val, $template); \r
- }\r
- else\r
- {\r
- $template = $this->_parse_single($key, (string)$val, $template);\r
- }\r
- }\r
- \r
- if ($return == FALSE)\r
- {\r
- $CI->output->append_output($template);\r
- }\r
- \r
- return $template;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the left/right variable delimiters\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return void\r
- */\r
- function set_delimiters($l = '{', $r = '}')\r
- {\r
- $this->l_delim = $l;\r
- $this->r_delim = $r;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Parse a single key/value\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- function _parse_single($key, $val, $string)\r
- {\r
- return str_replace($this->l_delim.$key.$this->r_delim, $val, $string);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Parse a tag pair\r
- *\r
- * Parses tag pairs: {some_tag} string... {/some_tag}\r
- *\r
- * @access private\r
- * @param string\r
- * @param array\r
- * @param string\r
- * @return string\r
- */\r
- function _parse_pair($variable, $data, $string)\r
- { \r
- if (FALSE === ($match = $this->_match_pair($string, $variable)))\r
- {\r
- return $string;\r
- }\r
-\r
- $str = '';\r
- foreach ($data as $row)\r
- {\r
- $temp = $match['1'];\r
- foreach ($row as $key => $val)\r
- {\r
- if ( ! is_array($val))\r
- {\r
- $temp = $this->_parse_single($key, $val, $temp);\r
- }\r
- else\r
- {\r
- $temp = $this->_parse_pair($key, $val, $temp);\r
- }\r
- }\r
- \r
- $str .= $temp;\r
- }\r
- \r
- return str_replace($match['0'], $str, $string);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Matches a variable pair\r
- *\r
- * @access private\r
- * @param string\r
- * @param string\r
- * @return mixed\r
- */\r
- function _match_pair($string, $variable)\r
- {\r
- if ( ! preg_match("|".$this->l_delim . $variable . $this->r_delim."(.+?)".$this->l_delim . '/' . $variable . $this->r_delim."|s", $string, $match))\r
- {\r
- return FALSE;\r
- }\r
- \r
- return $match;\r
- }\r
-\r
-}\r
-// END Parser Class\r
-\r
-/* End of file Parser.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Parser Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Parser
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/parser.html
+ */
+class CI_Parser {
+
+ var $l_delim = '{';
+ var $r_delim = '}';
+ var $object;
+
+ /**
+ * Parse a template
+ *
+ * Parses pseudo-variables contained in the specified template,
+ * replacing them with the data in the second param
+ *
+ * @access public
+ * @param string
+ * @param array
+ * @param bool
+ * @return string
+ */
+ function parse($template, $data, $return = FALSE)
+ {
+ $CI =& get_instance();
+ $template = $CI->load->view($template, $data, TRUE);
+
+ if ($template == '')
+ {
+ return FALSE;
+ }
+
+ foreach ($data as $key => $val)
+ {
+ if (is_array($val))
+ {
+ $template = $this->_parse_pair($key, $val, $template);
+ }
+ else
+ {
+ $template = $this->_parse_single($key, (string)$val, $template);
+ }
+ }
+
+ if ($return == FALSE)
+ {
+ $CI->output->append_output($template);
+ }
+
+ return $template;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the left/right variable delimiters
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return void
+ */
+ function set_delimiters($l = '{', $r = '}')
+ {
+ $this->l_delim = $l;
+ $this->r_delim = $r;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Parse a single key/value
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @param string
+ * @return string
+ */
+ function _parse_single($key, $val, $string)
+ {
+ return str_replace($this->l_delim.$key.$this->r_delim, $val, $string);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Parse a tag pair
+ *
+ * Parses tag pairs: {some_tag} string... {/some_tag}
+ *
+ * @access private
+ * @param string
+ * @param array
+ * @param string
+ * @return string
+ */
+ function _parse_pair($variable, $data, $string)
+ {
+ if (FALSE === ($match = $this->_match_pair($string, $variable)))
+ {
+ return $string;
+ }
+
+ $str = '';
+ foreach ($data as $row)
+ {
+ $temp = $match['1'];
+ foreach ($row as $key => $val)
+ {
+ if ( ! is_array($val))
+ {
+ $temp = $this->_parse_single($key, $val, $temp);
+ }
+ else
+ {
+ $temp = $this->_parse_pair($key, $val, $temp);
+ }
+ }
+
+ $str .= $temp;
+ }
+
+ return str_replace($match['0'], $str, $string);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Matches a variable pair
+ *
+ * @access private
+ * @param string
+ * @param string
+ * @return mixed
+ */
+ function _match_pair($string, $variable)
+ {
+ if ( ! preg_match("|".$this->l_delim . $variable . $this->r_delim."(.+?)".$this->l_delim . '/' . $variable . $this->r_delim."|s", $string, $match))
+ {
+ return FALSE;
+ }
+
+ return $match;
+ }
+
+}
+// END Parser Class
+
+/* End of file Parser.php */
/* Location: ./system/libraries/Parser.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * CodeIgniter Profiler Class\r
- *\r
- * This class enables you to display benchmark, query, and other data\r
- * in order to help with debugging and optimization.\r
- *\r
- * Note: At some point it would be good to move all the HTML in this class\r
- * into a set of template files in order to allow customization.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/general/profiling.html\r
- */\r
-class CI_Profiler {\r
-\r
- var $CI;\r
- \r
- function CI_Profiler()\r
- {\r
- $this->CI =& get_instance();\r
- $this->CI->load->language('profiler');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Auto Profiler\r
- *\r
- * This function cycles through the entire array of mark points and\r
- * matches any two points that are named identically (ending in "_start"\r
- * and "_end" respectively). It then compiles the execution times for\r
- * all points and returns it as an array\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _compile_benchmarks()\r
- {\r
- $profile = array();\r
- foreach ($this->CI->benchmark->marker as $key => $val)\r
- {\r
- // We match the "end" marker so that the list ends\r
- // up in the order that it was defined\r
- if (preg_match("/(.+?)_end/i", $key, $match))\r
- { \r
- if (isset($this->CI->benchmark->marker[$match[1].'_end']) AND isset($this->CI->benchmark->marker[$match[1].'_start']))\r
- {\r
- $profile[$match[1]] = $this->CI->benchmark->elapsed_time($match[1].'_start', $key);\r
- }\r
- }\r
- }\r
-\r
- // Build a table containing the profile data.\r
- // Note: At some point we should turn this into a template that can\r
- // be modified. We also might want to make this data available to be logged\r
- \r
- $output = "\n\n";\r
- $output .= '<fieldset style="border:1px solid #990000;padding:6px 10px 10px 10px;margin:0 0 20px 0;background-color:#eee">';\r
- $output .= "\n";\r
- $output .= '<legend style="color:#990000;"> '.$this->CI->lang->line('profiler_benchmarks').' </legend>';\r
- $output .= "\n"; \r
- $output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";\r
- \r
- foreach ($profile as $key => $val)\r
- {\r
- $key = ucwords(str_replace(array('_', '-'), ' ', $key));\r
- $output .= "<tr><td width='50%' style='color:#000;font-weight:bold;background-color:#ddd;'>".$key." </td><td width='50%' style='color:#990000;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n";\r
- }\r
- \r
- $output .= "</table>\n";\r
- $output .= "</fieldset>";\r
- \r
- return $output;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Compile Queries\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _compile_queries()\r
- {\r
- $dbs = array();\r
- \r
- // Let's determine which databases are currently connected to\r
- foreach (get_object_vars($this->CI) as $CI_object)\r
- {\r
- if ( is_subclass_of(get_class($CI_object), 'CI_DB') )\r
- {\r
- $dbs[] = $CI_object;\r
- }\r
- }\r
- \r
- if (count($dbs) == 0)\r
- {\r
- $output = "\n\n";\r
- $output .= '<fieldset style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';\r
- $output .= "\n";\r
- $output .= '<legend style="color:#0000FF;"> '.$this->CI->lang->line('profiler_queries').' </legend>';\r
- $output .= "\n"; \r
- $output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";\r
- $output .="<tr><td width='100%' style='color:#0000FF;font-weight:normal;background-color:#eee;'>".$this->CI->lang->line('profiler_no_db')."</td></tr>\n";\r
- $output .= "</table>\n";\r
- $output .= "</fieldset>";\r
- \r
- return $output;\r
- }\r
- \r
- // Load the text helper so we can highlight the SQL\r
- $this->CI->load->helper('text');\r
-\r
- // Key words we want bolded\r
- $highlight = array('SELECT', 'DISTINCT', 'FROM', 'WHERE', 'AND', 'LEFT JOIN', 'ORDER BY', 'GROUP BY', 'LIMIT', 'INSERT', 'INTO', 'VALUES', 'UPDATE', 'OR', 'HAVING', 'OFFSET', 'NOT IN', 'IN', 'LIKE', 'NOT LIKE', 'COUNT', 'MAX', 'MIN', 'ON', 'AS', 'AVG', 'SUM', '(', ')');\r
-\r
- $output = "\n\n";\r
- \r
- foreach ($dbs as $db)\r
- {\r
- $output .= '<fieldset style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';\r
- $output .= "\n";\r
- $output .= '<legend style="color:#0000FF;"> '.$this->CI->lang->line('profiler_database').': '.$db->database.' '.$this->CI->lang->line('profiler_queries').': '.count($this->CI->db->queries).' </legend>';\r
- $output .= "\n"; \r
- $output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";\r
- \r
- if (count($db->queries) == 0)\r
- {\r
- $output .= "<tr><td width='100%' style='color:#0000FF;font-weight:normal;background-color:#eee;'>".$this->CI->lang->line('profiler_no_queries')."</td></tr>\n";\r
- }\r
- else\r
- { \r
- foreach ($db->queries as $key => $val)\r
- { \r
- $time = number_format($db->query_times[$key], 4);\r
-\r
- $val = highlight_code($val, ENT_QUOTES);\r
- \r
- foreach ($highlight as $bold)\r
- {\r
- $val = str_replace($bold, '<strong>'.$bold.'</strong>', $val); \r
- }\r
- \r
- $output .= "<tr><td width='1%' valign='top' style='color:#990000;font-weight:normal;background-color:#ddd;'>".$time." </td><td style='color:#000;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n";\r
- }\r
- }\r
- \r
- $output .= "</table>\n";\r
- $output .= "</fieldset>";\r
- \r
- }\r
- \r
- return $output;\r
- }\r
-\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Compile $_GET Data\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _compile_get()\r
- { \r
- $output = "\n\n";\r
- $output .= '<fieldset style="border:1px solid #cd6e00;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';\r
- $output .= "\n";\r
- $output .= '<legend style="color:#cd6e00;"> '.$this->CI->lang->line('profiler_get_data').' </legend>';\r
- $output .= "\n";\r
- \r
- if (count($_GET) == 0)\r
- {\r
- $output .= "<div style='color:#cd6e00;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_get')."</div>";\r
- }\r
- else\r
- {\r
- $output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";\r
- \r
- foreach ($_GET as $key => $val)\r
- {\r
- if ( ! is_numeric($key))\r
- {\r
- $key = "'".$key."'";\r
- }\r
- \r
- $output .= "<tr><td width='50%' style='color:#000;background-color:#ddd;'>$_GET[".$key."] </td><td width='50%' style='color:#cd6e00;font-weight:normal;background-color:#ddd;'>";\r
- if (is_array($val))\r
- {\r
- $output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, true))) . "</pre>";\r
- }\r
- else\r
- {\r
- $output .= htmlspecialchars(stripslashes($val));\r
- }\r
- $output .= "</td></tr>\n";\r
- }\r
- \r
- $output .= "</table>\n";\r
- }\r
- $output .= "</fieldset>";\r
-\r
- return $output; \r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Compile $_POST Data\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _compile_post()\r
- { \r
- $output = "\n\n";\r
- $output .= '<fieldset style="border:1px solid #009900;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';\r
- $output .= "\n";\r
- $output .= '<legend style="color:#009900;"> '.$this->CI->lang->line('profiler_post_data').' </legend>';\r
- $output .= "\n";\r
- \r
- if (count($_POST) == 0)\r
- {\r
- $output .= "<div style='color:#009900;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_post')."</div>";\r
- }\r
- else\r
- {\r
- $output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";\r
- \r
- foreach ($_POST as $key => $val)\r
- {\r
- if ( ! is_numeric($key))\r
- {\r
- $key = "'".$key."'";\r
- }\r
- \r
- $output .= "<tr><td width='50%' style='color:#000;background-color:#ddd;'>$_POST[".$key."] </td><td width='50%' style='color:#009900;font-weight:normal;background-color:#ddd;'>";\r
- if (is_array($val))\r
- {\r
- $output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, true))) . "</pre>";\r
- }\r
- else\r
- {\r
- $output .= htmlspecialchars(stripslashes($val));\r
- }\r
- $output .= "</td></tr>\n";\r
- }\r
- \r
- $output .= "</table>\n";\r
- }\r
- $output .= "</fieldset>";\r
-\r
- return $output; \r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Show query string\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _compile_uri_string()\r
- { \r
- $output = "\n\n";\r
- $output .= '<fieldset style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';\r
- $output .= "\n";\r
- $output .= '<legend style="color:#000;"> '.$this->CI->lang->line('profiler_uri_string').' </legend>';\r
- $output .= "\n";\r
- \r
- if ($this->CI->uri->uri_string == '')\r
- {\r
- $output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_uri')."</div>";\r
- }\r
- else\r
- {\r
- $output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->uri->uri_string."</div>"; \r
- }\r
- \r
- $output .= "</fieldset>";\r
-\r
- return $output; \r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Show the controller and function that were called\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _compile_controller_info()\r
- { \r
- $output = "\n\n";\r
- $output .= '<fieldset style="border:1px solid #995300;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';\r
- $output .= "\n";\r
- $output .= '<legend style="color:#995300;"> '.$this->CI->lang->line('profiler_controller_info').' </legend>';\r
- $output .= "\n";\r
- \r
- $output .= "<div style='color:#995300;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->router->fetch_class()."/".$this->CI->router->fetch_method()."</div>"; \r
-\r
- \r
- $output .= "</fieldset>";\r
-\r
- return $output; \r
- }\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Compile memory usage\r
- *\r
- * Display total used memory\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function _compile_memory_usage()\r
- {\r
- $output = "\n\n";\r
- $output .= '<fieldset style="border:1px solid #5a0099;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';\r
- $output .= "\n";\r
- $output .= '<legend style="color:#5a0099;"> '.$this->CI->lang->line('profiler_memory_usage').' </legend>';\r
- $output .= "\n";\r
- \r
- if (function_exists('memory_get_usage') && ($usage = memory_get_usage()) != '')\r
- {\r
- $output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".number_format($usage).' bytes</div>';\r
- }\r
- else\r
- {\r
- $output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_memory_usage')."</div>"; \r
- }\r
- \r
- $output .= "</fieldset>";\r
-\r
- return $output;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Run the Profiler\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function run()\r
- {\r
- $output = "<div id='codeigniter_profiler' style='clear:both;background-color:#fff;padding:10px;'>";\r
-\r
- $output .= $this->_compile_uri_string();\r
- $output .= $this->_compile_controller_info();\r
- $output .= $this->_compile_memory_usage();\r
- $output .= $this->_compile_benchmarks();\r
- $output .= $this->_compile_get();\r
- $output .= $this->_compile_post();\r
- $output .= $this->_compile_queries();\r
-\r
- $output .= '</div>';\r
-\r
- return $output;\r
- }\r
-\r
-}\r
-\r
-// END CI_Profiler class\r
-\r
-/* End of file Profiler.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Profiler Class
+ *
+ * This class enables you to display benchmark, query, and other data
+ * in order to help with debugging and optimization.
+ *
+ * Note: At some point it would be good to move all the HTML in this class
+ * into a set of template files in order to allow customization.
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Libraries
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/general/profiling.html
+ */
+class CI_Profiler {
+
+ var $CI;
+
+ function CI_Profiler()
+ {
+ $this->CI =& get_instance();
+ $this->CI->load->language('profiler');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Auto Profiler
+ *
+ * This function cycles through the entire array of mark points and
+ * matches any two points that are named identically (ending in "_start"
+ * and "_end" respectively). It then compiles the execution times for
+ * all points and returns it as an array
+ *
+ * @access private
+ * @return array
+ */
+ function _compile_benchmarks()
+ {
+ $profile = array();
+ foreach ($this->CI->benchmark->marker as $key => $val)
+ {
+ // We match the "end" marker so that the list ends
+ // up in the order that it was defined
+ if (preg_match("/(.+?)_end/i", $key, $match))
+ {
+ if (isset($this->CI->benchmark->marker[$match[1].'_end']) AND isset($this->CI->benchmark->marker[$match[1].'_start']))
+ {
+ $profile[$match[1]] = $this->CI->benchmark->elapsed_time($match[1].'_start', $key);
+ }
+ }
+ }
+
+ // Build a table containing the profile data.
+ // Note: At some point we should turn this into a template that can
+ // be modified. We also might want to make this data available to be logged
+
+ $output = "\n\n";
+ $output .= '<fieldset style="border:1px solid #990000;padding:6px 10px 10px 10px;margin:0 0 20px 0;background-color:#eee">';
+ $output .= "\n";
+ $output .= '<legend style="color:#990000;"> '.$this->CI->lang->line('profiler_benchmarks').' </legend>';
+ $output .= "\n";
+ $output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
+
+ foreach ($profile as $key => $val)
+ {
+ $key = ucwords(str_replace(array('_', '-'), ' ', $key));
+ $output .= "<tr><td width='50%' style='color:#000;font-weight:bold;background-color:#ddd;'>".$key." </td><td width='50%' style='color:#990000;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n";
+ }
+
+ $output .= "</table>\n";
+ $output .= "</fieldset>";
+
+ return $output;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Compile Queries
+ *
+ * @access private
+ * @return string
+ */
+ function _compile_queries()
+ {
+ $dbs = array();
+
+ // Let's determine which databases are currently connected to
+ foreach (get_object_vars($this->CI) as $CI_object)
+ {
+ if ( is_subclass_of(get_class($CI_object), 'CI_DB') )
+ {
+ $dbs[] = $CI_object;
+ }
+ }
+
+ if (count($dbs) == 0)
+ {
+ $output = "\n\n";
+ $output .= '<fieldset style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
+ $output .= "\n";
+ $output .= '<legend style="color:#0000FF;"> '.$this->CI->lang->line('profiler_queries').' </legend>';
+ $output .= "\n";
+ $output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
+ $output .="<tr><td width='100%' style='color:#0000FF;font-weight:normal;background-color:#eee;'>".$this->CI->lang->line('profiler_no_db')."</td></tr>\n";
+ $output .= "</table>\n";
+ $output .= "</fieldset>";
+
+ return $output;
+ }
+
+ // Load the text helper so we can highlight the SQL
+ $this->CI->load->helper('text');
+
+ // Key words we want bolded
+ $highlight = array('SELECT', 'DISTINCT', 'FROM', 'WHERE', 'AND', 'LEFT JOIN', 'ORDER BY', 'GROUP BY', 'LIMIT', 'INSERT', 'INTO', 'VALUES', 'UPDATE', 'OR', 'HAVING', 'OFFSET', 'NOT IN', 'IN', 'LIKE', 'NOT LIKE', 'COUNT', 'MAX', 'MIN', 'ON', 'AS', 'AVG', 'SUM', '(', ')');
+
+ $output = "\n\n";
+
+ foreach ($dbs as $db)
+ {
+ $output .= '<fieldset style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
+ $output .= "\n";
+ $output .= '<legend style="color:#0000FF;"> '.$this->CI->lang->line('profiler_database').': '.$db->database.' '.$this->CI->lang->line('profiler_queries').': '.count($this->CI->db->queries).' </legend>';
+ $output .= "\n";
+ $output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
+
+ if (count($db->queries) == 0)
+ {
+ $output .= "<tr><td width='100%' style='color:#0000FF;font-weight:normal;background-color:#eee;'>".$this->CI->lang->line('profiler_no_queries')."</td></tr>\n";
+ }
+ else
+ {
+ foreach ($db->queries as $key => $val)
+ {
+ $time = number_format($db->query_times[$key], 4);
+
+ $val = highlight_code($val, ENT_QUOTES);
+
+ foreach ($highlight as $bold)
+ {
+ $val = str_replace($bold, '<strong>'.$bold.'</strong>', $val);
+ }
+
+ $output .= "<tr><td width='1%' valign='top' style='color:#990000;font-weight:normal;background-color:#ddd;'>".$time." </td><td style='color:#000;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n";
+ }
+ }
+
+ $output .= "</table>\n";
+ $output .= "</fieldset>";
+
+ }
+
+ return $output;
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Compile $_GET Data
+ *
+ * @access private
+ * @return string
+ */
+ function _compile_get()
+ {
+ $output = "\n\n";
+ $output .= '<fieldset style="border:1px solid #cd6e00;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
+ $output .= "\n";
+ $output .= '<legend style="color:#cd6e00;"> '.$this->CI->lang->line('profiler_get_data').' </legend>';
+ $output .= "\n";
+
+ if (count($_GET) == 0)
+ {
+ $output .= "<div style='color:#cd6e00;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_get')."</div>";
+ }
+ else
+ {
+ $output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
+
+ foreach ($_GET as $key => $val)
+ {
+ if ( ! is_numeric($key))
+ {
+ $key = "'".$key."'";
+ }
+
+ $output .= "<tr><td width='50%' style='color:#000;background-color:#ddd;'>$_GET[".$key."] </td><td width='50%' style='color:#cd6e00;font-weight:normal;background-color:#ddd;'>";
+ if (is_array($val))
+ {
+ $output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, true))) . "</pre>";
+ }
+ else
+ {
+ $output .= htmlspecialchars(stripslashes($val));
+ }
+ $output .= "</td></tr>\n";
+ }
+
+ $output .= "</table>\n";
+ }
+ $output .= "</fieldset>";
+
+ return $output;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Compile $_POST Data
+ *
+ * @access private
+ * @return string
+ */
+ function _compile_post()
+ {
+ $output = "\n\n";
+ $output .= '<fieldset style="border:1px solid #009900;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
+ $output .= "\n";
+ $output .= '<legend style="color:#009900;"> '.$this->CI->lang->line('profiler_post_data').' </legend>';
+ $output .= "\n";
+
+ if (count($_POST) == 0)
+ {
+ $output .= "<div style='color:#009900;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_post')."</div>";
+ }
+ else
+ {
+ $output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
+
+ foreach ($_POST as $key => $val)
+ {
+ if ( ! is_numeric($key))
+ {
+ $key = "'".$key."'";
+ }
+
+ $output .= "<tr><td width='50%' style='color:#000;background-color:#ddd;'>$_POST[".$key."] </td><td width='50%' style='color:#009900;font-weight:normal;background-color:#ddd;'>";
+ if (is_array($val))
+ {
+ $output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, true))) . "</pre>";
+ }
+ else
+ {
+ $output .= htmlspecialchars(stripslashes($val));
+ }
+ $output .= "</td></tr>\n";
+ }
+
+ $output .= "</table>\n";
+ }
+ $output .= "</fieldset>";
+
+ return $output;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show query string
+ *
+ * @access private
+ * @return string
+ */
+ function _compile_uri_string()
+ {
+ $output = "\n\n";
+ $output .= '<fieldset style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
+ $output .= "\n";
+ $output .= '<legend style="color:#000;"> '.$this->CI->lang->line('profiler_uri_string').' </legend>';
+ $output .= "\n";
+
+ if ($this->CI->uri->uri_string == '')
+ {
+ $output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_uri')."</div>";
+ }
+ else
+ {
+ $output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->uri->uri_string."</div>";
+ }
+
+ $output .= "</fieldset>";
+
+ return $output;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show the controller and function that were called
+ *
+ * @access private
+ * @return string
+ */
+ function _compile_controller_info()
+ {
+ $output = "\n\n";
+ $output .= '<fieldset style="border:1px solid #995300;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
+ $output .= "\n";
+ $output .= '<legend style="color:#995300;"> '.$this->CI->lang->line('profiler_controller_info').' </legend>';
+ $output .= "\n";
+
+ $output .= "<div style='color:#995300;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->router->fetch_class()."/".$this->CI->router->fetch_method()."</div>";
+
+
+ $output .= "</fieldset>";
+
+ return $output;
+ }
+ // --------------------------------------------------------------------
+
+ /**
+ * Compile memory usage
+ *
+ * Display total used memory
+ *
+ * @access public
+ * @return string
+ */
+ function _compile_memory_usage()
+ {
+ $output = "\n\n";
+ $output .= '<fieldset style="border:1px solid #5a0099;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
+ $output .= "\n";
+ $output .= '<legend style="color:#5a0099;"> '.$this->CI->lang->line('profiler_memory_usage').' </legend>';
+ $output .= "\n";
+
+ if (function_exists('memory_get_usage') && ($usage = memory_get_usage()) != '')
+ {
+ $output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".number_format($usage).' bytes</div>';
+ }
+ else
+ {
+ $output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_memory_usage')."</div>";
+ }
+
+ $output .= "</fieldset>";
+
+ return $output;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Run the Profiler
+ *
+ * @access private
+ * @return string
+ */
+ function run()
+ {
+ $output = "<div id='codeigniter_profiler' style='clear:both;background-color:#fff;padding:10px;'>";
+
+ $output .= $this->_compile_uri_string();
+ $output .= $this->_compile_controller_info();
+ $output .= $this->_compile_memory_usage();
+ $output .= $this->_compile_benchmarks();
+ $output .= $this->_compile_get();
+ $output .= $this->_compile_post();
+ $output .= $this->_compile_queries();
+
+ $output .= '</div>';
+
+ return $output;
+ }
+
+}
+
+// END CI_Profiler class
+
+/* End of file Profiler.php */
/* Location: ./system/libraries/Profiler.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Router Class\r
- *\r
- * Parses URIs and determines routing\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @author ExpressionEngine Dev Team\r
- * @category Libraries\r
- * @link http://codeigniter.com/user_guide/general/routing.html\r
- */\r
-class CI_Router {\r
-\r
- var $config; \r
- var $routes = array();\r
- var $error_routes = array();\r
- var $class = '';\r
- var $method = 'index';\r
- var $directory = '';\r
- var $uri_protocol = 'auto';\r
- var $default_controller;\r
- var $scaffolding_request = FALSE; // Must be set to FALSE\r
- \r
- /**\r
- * Constructor\r
- *\r
- * Runs the route mapping function.\r
- */\r
- function CI_Router()\r
- {\r
- $this->config =& load_class('Config');\r
- $this->uri =& load_class('URI');\r
- $this->_set_routing();\r
- log_message('debug', "Router Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the route mapping\r
- *\r
- * This function determines what should be served based on the URI request,\r
- * as well as any "routes" that have been set in the routing config file.\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _set_routing()\r
- {\r
- // Are query strings enabled in the config file?\r
- // If so, we're done since segment based URIs are not used with query strings.\r
- if ($this->config->item('enable_query_strings') === TRUE AND isset($_GET[$this->config->item('controller_trigger')]))\r
- {\r
- $this->set_class(trim($this->uri->_filter_uri($_GET[$this->config->item('controller_trigger')])));\r
-\r
- if (isset($_GET[$this->config->item('function_trigger')]))\r
- {\r
- $this->set_method(trim($this->uri->_filter_uri($_GET[$this->config->item('function_trigger')])));\r
- }\r
- \r
- return;\r
- }\r
- \r
- // Load the routes.php file.\r
- @include(APPPATH.'config/routes'.EXT);\r
- $this->routes = ( ! isset($route) OR ! is_array($route)) ? array() : $route;\r
- unset($route);\r
-\r
- // Set the default controller so we can display it in the event\r
- // the URI doesn't correlated to a valid controller.\r
- $this->default_controller = ( ! isset($this->routes['default_controller']) OR $this->routes['default_controller'] == '') ? FALSE : strtolower($this->routes['default_controller']); \r
- \r
- // Fetch the complete URI string\r
- $this->uri->_fetch_uri_string();\r
- \r
- // Is there a URI string? If not, the default controller specified in the "routes" file will be shown.\r
- if ($this->uri->uri_string == '')\r
- {\r
- if ($this->default_controller === FALSE)\r
- {\r
- show_error("Unable to determine what should be displayed. A default route has not been specified in the routing file.");\r
- }\r
-\r
- // Turn the default route into an array. We explode it in the event that\r
- // the controller is located in a subfolder\r
- $segments = $this->_validate_request(explode('/', $this->default_controller));\r
-\r
- // Set the class and method\r
- $this->set_class($segments[0]);\r
- $this->set_method('index');\r
- \r
- // Assign the segments to the URI class\r
- $this->uri->rsegments = $segments;\r
- \r
- // re-index the routed segments array so it starts with 1 rather than 0\r
- $this->uri->_reindex_segments();\r
- \r
- log_message('debug', "No URI present. Default controller set.");\r
- return;\r
- }\r
- unset($this->routes['default_controller']);\r
- \r
- // Do we need to remove the URL suffix?\r
- $this->uri->_remove_url_suffix();\r
- \r
- // Compile the segments into an array\r
- $this->uri->_explode_segments();\r
- \r
- // Parse any custom routing that may exist\r
- $this->_parse_routes(); \r
- \r
- // Re-index the segment array so that it starts with 1 rather than 0\r
- $this->uri->_reindex_segments();\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the Route\r
- *\r
- * This function takes an array of URI segments as\r
- * input, and sets the current class/method\r
- *\r
- * @access private\r
- * @param array\r
- * @param bool\r
- * @return void\r
- */\r
- function _set_request($segments = array())\r
- { \r
- $segments = $this->_validate_request($segments);\r
- \r
- if (count($segments) == 0)\r
- {\r
- return;\r
- }\r
- \r
- $this->set_class($segments[0]);\r
- \r
- if (isset($segments[1]))\r
- {\r
- // A scaffolding request. No funny business with the URL\r
- if ($this->routes['scaffolding_trigger'] == $segments[1] AND $segments[1] != '_ci_scaffolding')\r
- {\r
- $this->scaffolding_request = TRUE;\r
- unset($this->routes['scaffolding_trigger']);\r
- }\r
- else\r
- {\r
- // A standard method request\r
- $this->set_method($segments[1]);\r
- }\r
- }\r
- else\r
- {\r
- // This lets the "routed" segment array identify that the default\r
- // index method is being used.\r
- $segments[1] = 'index';\r
- }\r
- \r
- // Update our "routed" segment array to contain the segments.\r
- // Note: If there is no custom routing, this array will be\r
- // identical to $this->uri->segments\r
- $this->uri->rsegments = $segments;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Validates the supplied segments. Attempts to determine the path to\r
- * the controller.\r
- *\r
- * @access private\r
- * @param array\r
- * @return array\r
- */ \r
- function _validate_request($segments)\r
- {\r
- // Does the requested controller exist in the root folder?\r
- if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))\r
- {\r
- return $segments;\r
- }\r
-\r
- // Is the controller in a sub-folder?\r
- if (is_dir(APPPATH.'controllers/'.$segments[0]))\r
- { \r
- // Set the directory and remove it from the segment array\r
- $this->set_directory($segments[0]);\r
- $segments = array_slice($segments, 1);\r
- \r
- if (count($segments) > 0)\r
- {\r
- // Does the requested controller exist in the sub-folder?\r
- if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))\r
- {\r
- show_404($this->fetch_directory().$segments[0]);\r
- }\r
- }\r
- else\r
- {\r
- $this->set_class($this->default_controller);\r
- $this->set_method('index');\r
- \r
- // Does the default controller exist in the sub-folder?\r
- if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))\r
- {\r
- $this->directory = '';\r
- return array();\r
- }\r
- \r
- }\r
-\r
- return $segments;\r
- }\r
-\r
- // Can't find the requested controller...\r
- show_404($segments[0]);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Parse Routes\r
- *\r
- * This function matches any routes that may exist in\r
- * the config/routes.php file against the URI to\r
- * determine if the class/method need to be remapped.\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _parse_routes()\r
- {\r
- // Do we even have any custom routing to deal with?\r
- // There is a default scaffolding trigger, so we'll look just for 1\r
- if (count($this->routes) == 1)\r
- {\r
- $this->_set_request($this->uri->segments);\r
- return;\r
- }\r
-\r
- // Turn the segment array into a URI string\r
- $uri = implode('/', $this->uri->segments);\r
-\r
- // Is there a literal match? If so we're done\r
- if (isset($this->routes[$uri]))\r
- {\r
- $this->_set_request(explode('/', $this->routes[$uri])); \r
- return;\r
- }\r
- \r
- // Loop through the route array looking for wild-cards\r
- foreach ($this->routes as $key => $val)\r
- { \r
- // Convert wild-cards to RegEx\r
- $key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));\r
- \r
- // Does the RegEx match?\r
- if (preg_match('#^'.$key.'$#', $uri))\r
- { \r
- // Do we have a back-reference?\r
- if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE)\r
- {\r
- $val = preg_replace('#^'.$key.'$#', $val, $uri);\r
- }\r
- \r
- $this->_set_request(explode('/', $val)); \r
- return;\r
- }\r
- }\r
-\r
- // If we got this far it means we didn't encounter a\r
- // matching route so we'll set the site default route\r
- $this->_set_request($this->uri->segments);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the class name\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_class($class)\r
- {\r
- $this->class = $class;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch the current class\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function fetch_class()\r
- {\r
- return $this->class;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the method name\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_method($method)\r
- {\r
- $this->method = $method;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch the current method\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function fetch_method()\r
- {\r
- if ($this->method == $this->fetch_class())\r
- {\r
- return 'index';\r
- }\r
-\r
- return $this->method;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the directory name\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_directory($dir)\r
- {\r
- $this->directory = $dir.'/';\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch the sub-directory (if any) that contains the requested controller class\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function fetch_directory()\r
- {\r
- return $this->directory;\r
- }\r
-\r
-}\r
-// END Router Class\r
-\r
-/* End of file Router.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Router Class
+ *
+ * Parses URIs and determines routing
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @author ExpressionEngine Dev Team
+ * @category Libraries
+ * @link http://codeigniter.com/user_guide/general/routing.html
+ */
+class CI_Router {
+
+ var $config;
+ var $routes = array();
+ var $error_routes = array();
+ var $class = '';
+ var $method = 'index';
+ var $directory = '';
+ var $uri_protocol = 'auto';
+ var $default_controller;
+ var $scaffolding_request = FALSE; // Must be set to FALSE
+
+ /**
+ * Constructor
+ *
+ * Runs the route mapping function.
+ */
+ function CI_Router()
+ {
+ $this->config =& load_class('Config');
+ $this->uri =& load_class('URI');
+ $this->_set_routing();
+ log_message('debug', "Router Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the route mapping
+ *
+ * This function determines what should be served based on the URI request,
+ * as well as any "routes" that have been set in the routing config file.
+ *
+ * @access private
+ * @return void
+ */
+ function _set_routing()
+ {
+ // Are query strings enabled in the config file?
+ // If so, we're done since segment based URIs are not used with query strings.
+ if ($this->config->item('enable_query_strings') === TRUE AND isset($_GET[$this->config->item('controller_trigger')]))
+ {
+ $this->set_class(trim($this->uri->_filter_uri($_GET[$this->config->item('controller_trigger')])));
+
+ if (isset($_GET[$this->config->item('function_trigger')]))
+ {
+ $this->set_method(trim($this->uri->_filter_uri($_GET[$this->config->item('function_trigger')])));
+ }
+
+ return;
+ }
+
+ // Load the routes.php file.
+ @include(APPPATH.'config/routes'.EXT);
+ $this->routes = ( ! isset($route) OR ! is_array($route)) ? array() : $route;
+ unset($route);
+
+ // Set the default controller so we can display it in the event
+ // the URI doesn't correlated to a valid controller.
+ $this->default_controller = ( ! isset($this->routes['default_controller']) OR $this->routes['default_controller'] == '') ? FALSE : strtolower($this->routes['default_controller']);
+
+ // Fetch the complete URI string
+ $this->uri->_fetch_uri_string();
+
+ // Is there a URI string? If not, the default controller specified in the "routes" file will be shown.
+ if ($this->uri->uri_string == '')
+ {
+ if ($this->default_controller === FALSE)
+ {
+ show_error("Unable to determine what should be displayed. A default route has not been specified in the routing file.");
+ }
+
+ // Turn the default route into an array. We explode it in the event that
+ // the controller is located in a subfolder
+ $segments = $this->_validate_request(explode('/', $this->default_controller));
+
+ // Set the class and method
+ $this->set_class($segments[0]);
+ $this->set_method('index');
+
+ // Assign the segments to the URI class
+ $this->uri->rsegments = $segments;
+
+ // re-index the routed segments array so it starts with 1 rather than 0
+ $this->uri->_reindex_segments();
+
+ log_message('debug', "No URI present. Default controller set.");
+ return;
+ }
+ unset($this->routes['default_controller']);
+
+ // Do we need to remove the URL suffix?
+ $this->uri->_remove_url_suffix();
+
+ // Compile the segments into an array
+ $this->uri->_explode_segments();
+
+ // Parse any custom routing that may exist
+ $this->_parse_routes();
+
+ // Re-index the segment array so that it starts with 1 rather than 0
+ $this->uri->_reindex_segments();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the Route
+ *
+ * This function takes an array of URI segments as
+ * input, and sets the current class/method
+ *
+ * @access private
+ * @param array
+ * @param bool
+ * @return void
+ */
+ function _set_request($segments = array())
+ {
+ $segments = $this->_validate_request($segments);
+
+ if (count($segments) == 0)
+ {
+ return;
+ }
+
+ $this->set_class($segments[0]);
+
+ if (isset($segments[1]))
+ {
+ // A scaffolding request. No funny business with the URL
+ if ($this->routes['scaffolding_trigger'] == $segments[1] AND $segments[1] != '_ci_scaffolding')
+ {
+ $this->scaffolding_request = TRUE;
+ unset($this->routes['scaffolding_trigger']);
+ }
+ else
+ {
+ // A standard method request
+ $this->set_method($segments[1]);
+ }
+ }
+ else
+ {
+ // This lets the "routed" segment array identify that the default
+ // index method is being used.
+ $segments[1] = 'index';
+ }
+
+ // Update our "routed" segment array to contain the segments.
+ // Note: If there is no custom routing, this array will be
+ // identical to $this->uri->segments
+ $this->uri->rsegments = $segments;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Validates the supplied segments. Attempts to determine the path to
+ * the controller.
+ *
+ * @access private
+ * @param array
+ * @return array
+ */
+ function _validate_request($segments)
+ {
+ // Does the requested controller exist in the root folder?
+ if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
+ {
+ return $segments;
+ }
+
+ // Is the controller in a sub-folder?
+ if (is_dir(APPPATH.'controllers/'.$segments[0]))
+ {
+ // Set the directory and remove it from the segment array
+ $this->set_directory($segments[0]);
+ $segments = array_slice($segments, 1);
+
+ if (count($segments) > 0)
+ {
+ // Does the requested controller exist in the sub-folder?
+ if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
+ {
+ show_404($this->fetch_directory().$segments[0]);
+ }
+ }
+ else
+ {
+ $this->set_class($this->default_controller);
+ $this->set_method('index');
+
+ // Does the default controller exist in the sub-folder?
+ if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
+ {
+ $this->directory = '';
+ return array();
+ }
+
+ }
+
+ return $segments;
+ }
+
+ // Can't find the requested controller...
+ show_404($segments[0]);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Parse Routes
+ *
+ * This function matches any routes that may exist in
+ * the config/routes.php file against the URI to
+ * determine if the class/method need to be remapped.
+ *
+ * @access private
+ * @return void
+ */
+ function _parse_routes()
+ {
+ // Do we even have any custom routing to deal with?
+ // There is a default scaffolding trigger, so we'll look just for 1
+ if (count($this->routes) == 1)
+ {
+ $this->_set_request($this->uri->segments);
+ return;
+ }
+
+ // Turn the segment array into a URI string
+ $uri = implode('/', $this->uri->segments);
+
+ // Is there a literal match? If so we're done
+ if (isset($this->routes[$uri]))
+ {
+ $this->_set_request(explode('/', $this->routes[$uri]));
+ return;
+ }
+
+ // Loop through the route array looking for wild-cards
+ foreach ($this->routes as $key => $val)
+ {
+ // Convert wild-cards to RegEx
+ $key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));
+
+ // Does the RegEx match?
+ if (preg_match('#^'.$key.'$#', $uri))
+ {
+ // Do we have a back-reference?
+ if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE)
+ {
+ $val = preg_replace('#^'.$key.'$#', $val, $uri);
+ }
+
+ $this->_set_request(explode('/', $val));
+ return;
+ }
+ }
+
+ // If we got this far it means we didn't encounter a
+ // matching route so we'll set the site default route
+ $this->_set_request($this->uri->segments);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the class name
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_class($class)
+ {
+ $this->class = $class;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch the current class
+ *
+ * @access public
+ * @return string
+ */
+ function fetch_class()
+ {
+ return $this->class;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the method name
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_method($method)
+ {
+ $this->method = $method;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch the current method
+ *
+ * @access public
+ * @return string
+ */
+ function fetch_method()
+ {
+ if ($this->method == $this->fetch_class())
+ {
+ return 'index';
+ }
+
+ return $this->method;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the directory name
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_directory($dir)
+ {
+ $this->directory = $dir.'/';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch the sub-directory (if any) that contains the requested controller class
+ *
+ * @access public
+ * @return string
+ */
+ function fetch_directory()
+ {
+ return $this->directory;
+ }
+
+}
+// END Router Class
+
+/* End of file Router.php */
/* Location: ./system/libraries/Router.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Session Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Sessions\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/sessions.html\r
- */\r
-class CI_Session {\r
-\r
- var $sess_encrypt_cookie = FALSE;\r
- var $sess_use_database = FALSE;\r
- var $sess_table_name = '';\r
- var $sess_expiration = 7200;\r
- var $sess_match_ip = FALSE;\r
- var $sess_match_useragent = TRUE;\r
- var $sess_cookie_name = 'ci_session';\r
- var $cookie_prefix = '';\r
- var $cookie_path = '';\r
- var $cookie_domain = '';\r
- var $sess_time_to_update = 300;\r
- var $encryption_key = '';\r
- var $flashdata_key = 'flash';\r
- var $time_reference = 'time';\r
- var $gc_probability = 5;\r
- var $userdata = array();\r
- var $CI;\r
- var $now;\r
-\r
- /**\r
- * Session Constructor\r
- *\r
- * The constructor runs the session routines automatically\r
- * whenever the class is instantiated.\r
- */ \r
- function CI_Session($params = array())\r
- {\r
- log_message('debug', "Session Class Initialized");\r
-\r
- // Set the super object to a local variable for use throughout the class\r
- $this->CI =& get_instance();\r
- \r
- // Set all the session preferences, which can either be set \r
- // manually via the $params array above or via the config file\r
- foreach (array('sess_encrypt_cookie', 'sess_use_database', 'sess_table_name', 'sess_expiration', 'sess_match_ip', 'sess_match_useragent', 'sess_cookie_name', 'cookie_path', 'cookie_domain', 'sess_time_to_update', 'time_reference', 'cookie_prefix', 'encryption_key') as $key)\r
- {\r
- $this->$key = (isset($params[$key])) ? $params[$key] : $this->CI->config->item($key);\r
- } \r
- \r
- // Load the string helper so we can use the strip_slashes() function\r
- $this->CI->load->helper('string');\r
-\r
- // Do we need encryption? If so, load the encryption class\r
- if ($this->sess_encrypt_cookie == TRUE)\r
- {\r
- $this->CI->load->library('encrypt');\r
- }\r
-\r
- // Are we using a database? If so, load it\r
- if ($this->sess_use_database === TRUE AND $this->sess_table_name != '')\r
- {\r
- $this->CI->load->database();\r
- }\r
-\r
- // Set the "now" time. Can either be GMT or server time, based on the\r
- // config prefs. We use this to set the "last activity" time\r
- $this->now = $this->_get_time();\r
-\r
- // Set the session length. If the session expiration is\r
- // set to zero we'll set the expiration two years from now.\r
- if ($this->sess_expiration == 0)\r
- {\r
- $this->sess_expiration = (60*60*24*365*2);\r
- }\r
- \r
- // Set the cookie name\r
- $this->sess_cookie_name = $this->cookie_prefix.$this->sess_cookie_name;\r
- \r
- // Run the Session routine. If a session doesn't exist we'll \r
- // create a new one. If it does, we'll update it.\r
- if ( ! $this->sess_read())\r
- {\r
- $this->sess_create();\r
- }\r
- else\r
- { \r
- $this->sess_update();\r
- }\r
- \r
- // Delete 'old' flashdata (from last request)\r
- $this->_flashdata_sweep();\r
- \r
- // Mark all new flashdata as old (data will be deleted before next request)\r
- $this->_flashdata_mark();\r
-\r
- // Delete expired sessions if necessary\r
- $this->_sess_gc();\r
-\r
- log_message('debug', "Session routines successfully run");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch the current session data if it exists\r
- *\r
- * @access public\r
- * @return void\r
- */\r
- function sess_read()\r
- { \r
- // Fetch the cookie\r
- $session = $this->CI->input->cookie($this->sess_cookie_name);\r
- \r
- // No cookie? Goodbye cruel world!...\r
- if ($session === FALSE)\r
- {\r
- log_message('debug', 'A session cookie was not found.');\r
- return FALSE;\r
- }\r
- \r
- // Decrypt the cookie data\r
- if ($this->sess_encrypt_cookie == TRUE)\r
- {\r
- $session = $this->CI->encrypt->decode($session);\r
- }\r
- else\r
- { \r
- // encryption was not used, so we need to check the md5 hash\r
- $hash = substr($session, strlen($session)-32); // get last 32 chars\r
- $session = substr($session, 0, strlen($session)-32);\r
-\r
- // Does the md5 hash match? This is to prevent manipulation of session data in userspace\r
- if ($hash !== md5($session.$this->encryption_key))\r
- {\r
- log_message('error', 'The session cookie data did not match what was expected. This could be a possible hacking attempt.');\r
- $this->sess_destroy();\r
- return FALSE;\r
- }\r
- }\r
- \r
- // Unserialize the session array\r
- $session = $this->_unserialize($session);\r
- \r
- // Is the session data we unserialized an array with the correct format?\r
- if ( ! is_array($session) OR ! isset($session['session_id']) OR ! isset($session['ip_address']) OR ! isset($session['user_agent']) OR ! isset($session['last_activity']))\r
- {\r
- $this->sess_destroy();\r
- return FALSE;\r
- }\r
- \r
- // Is the session current?\r
- if (($session['last_activity'] + $this->sess_expiration) < $this->now)\r
- {\r
- $this->sess_destroy();\r
- return FALSE;\r
- }\r
-\r
- // Does the IP Match?\r
- if ($this->sess_match_ip == TRUE AND $session['ip_address'] != $this->CI->input->ip_address())\r
- {\r
- $this->sess_destroy();\r
- return FALSE;\r
- }\r
- \r
- // Does the User Agent Match?\r
- if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 50)))\r
- {\r
- $this->sess_destroy();\r
- return FALSE;\r
- }\r
- \r
- // Is there a corresponding session in the DB?\r
- if ($this->sess_use_database === TRUE)\r
- {\r
- $this->CI->db->where('session_id', $session['session_id']);\r
- \r
- if ($this->sess_match_ip == TRUE)\r
- {\r
- $this->CI->db->where('ip_address', $session['ip_address']);\r
- }\r
-\r
- if ($this->sess_match_useragent == TRUE)\r
- {\r
- $this->CI->db->where('user_agent', $session['user_agent']);\r
- }\r
- \r
- $query = $this->CI->db->get($this->sess_table_name);\r
-\r
- // No result? Kill it!\r
- if ($query->num_rows() == 0)\r
- {\r
- $this->sess_destroy();\r
- return FALSE;\r
- }\r
-\r
- // Is there custom data? If so, add it to the main session array\r
- $row = $query->row();\r
- if (isset($row->user_data) AND $row->user_data != '')\r
- {\r
- $custom_data = $this->_unserialize($row->user_data);\r
-\r
- if (is_array($custom_data))\r
- {\r
- foreach ($custom_data as $key => $val)\r
- {\r
- $session[$key] = $val;\r
- }\r
- }\r
- } \r
- }\r
- \r
- // Session is valid!\r
- $this->userdata = $session;\r
- unset($session);\r
- \r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Write the session data\r
- *\r
- * @access public\r
- * @return void\r
- */\r
- function sess_write()\r
- {\r
- // Are we saving custom data to the DB? If not, all we do is update the cookie\r
- if ($this->sess_use_database === FALSE)\r
- {\r
- $this->_set_cookie();\r
- return;\r
- }\r
-\r
- // set the custom userdata, the session data we will set in a second\r
- $custom_userdata = $this->userdata;\r
- $cookie_userdata = array();\r
- \r
- // Before continuing, we need to determine if there is any custom data to deal with.\r
- // Let's determine this by removing the default indexes to see if there's anything left in the array\r
- // and set the session data while we're at it\r
- foreach (array('session_id','ip_address','user_agent','last_activity') as $val)\r
- {\r
- unset($custom_userdata[$val]);\r
- $cookie_userdata[$val] = $this->userdata[$val];\r
- }\r
- \r
- // Did we find any custom data? If not, we turn the empty array into a string\r
- // since there's no reason to serialize and store an empty array in the DB\r
- if (count($custom_userdata) === 0)\r
- {\r
- $custom_userdata = '';\r
- }\r
- else\r
- { \r
- // Serialize the custom data array so we can store it\r
- $custom_userdata = $this->_serialize($custom_userdata);\r
- }\r
- \r
- // Run the update query\r
- $this->CI->db->where('session_id', $this->userdata['session_id']);\r
- $this->CI->db->update($this->sess_table_name, array('last_activity' => $this->userdata['last_activity'], 'user_data' => $custom_userdata));\r
-\r
- // Write the cookie. Notice that we manually pass the cookie data array to the\r
- // _set_cookie() function. Normally that function will store $this->userdata, but \r
- // in this case that array contains custom data, which we do not want in the cookie.\r
- $this->_set_cookie($cookie_userdata);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Create a new session\r
- *\r
- * @access public\r
- * @return void\r
- */\r
- function sess_create()\r
- { \r
- $sessid = '';\r
- while (strlen($sessid) < 32)\r
- {\r
- $sessid .= mt_rand(0, mt_getrandmax());\r
- }\r
- \r
- // To make the session ID even more secure we'll combine it with the user's IP\r
- $sessid .= $this->CI->input->ip_address();\r
- \r
- $this->userdata = array(\r
- 'session_id' => md5(uniqid($sessid, TRUE)),\r
- 'ip_address' => $this->CI->input->ip_address(),\r
- 'user_agent' => substr($this->CI->input->user_agent(), 0, 50),\r
- 'last_activity' => $this->now\r
- );\r
- \r
- \r
- // Save the data to the DB if needed\r
- if ($this->sess_use_database === TRUE)\r
- {\r
- $this->CI->db->query($this->CI->db->insert_string($this->sess_table_name, $this->userdata));\r
- }\r
- \r
- // Write the cookie\r
- $this->_set_cookie();\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Update an existing session\r
- *\r
- * @access public\r
- * @return void\r
- */\r
- function sess_update()\r
- {\r
- // We only update the session every five minutes by default\r
- if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)\r
- {\r
- return;\r
- }\r
- \r
- // Save the old session id so we know which record to \r
- // update in the database if we need it\r
- $old_sessid = $this->userdata['session_id'];\r
- $new_sessid = '';\r
- while (strlen($new_sessid) < 32)\r
- {\r
- $new_sessid .= mt_rand(0, mt_getrandmax());\r
- }\r
- \r
- // To make the session ID even more secure we'll combine it with the user's IP\r
- $new_sessid .= $this->CI->input->ip_address();\r
- \r
- // Turn it into a hash\r
- $new_sessid = md5(uniqid($new_sessid, TRUE));\r
- \r
- // Update the session data in the session data array\r
- $this->userdata['session_id'] = $new_sessid;\r
- $this->userdata['last_activity'] = $this->now;\r
- \r
- // _set_cookie() will handle this for us if we aren't using database sessions\r
- // by pushing all userdata to the cookie.\r
- $cookie_data = NULL;\r
- \r
- // Update the session ID and last_activity field in the DB if needed\r
- if ($this->sess_use_database === TRUE)\r
- {\r
- // set cookie explicitly to only have our session data\r
- $cookie_data = array();\r
- foreach (array('session_id','ip_address','user_agent','last_activity') as $val)\r
- {\r
- $cookie_data[$val] = $this->userdata[$val];\r
- }\r
- \r
- $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));\r
- }\r
- \r
- // Write the cookie\r
- $this->_set_cookie($cookie_data);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Destroy the current session\r
- *\r
- * @access public\r
- * @return void\r
- */\r
- function sess_destroy()\r
- { \r
- // Kill the session DB row\r
- if ($this->sess_use_database === TRUE AND isset($this->userdata['session_id']))\r
- {\r
- $this->CI->db->where('session_id', $this->userdata['session_id']);\r
- $this->CI->db->delete($this->sess_table_name);\r
- }\r
- \r
- // Kill the cookie\r
- setcookie(\r
- $this->sess_cookie_name,\r
- addslashes(serialize(array())),\r
- ($this->now - 31500000),\r
- $this->cookie_path,\r
- $this->cookie_domain,\r
- 0\r
- );\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch a specific item from the session array\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function userdata($item)\r
- {\r
- return ( ! isset($this->userdata[$item])) ? FALSE : $this->userdata[$item];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch all session data\r
- *\r
- * @access public\r
- * @return mixed\r
- */ \r
- function all_userdata()\r
- {\r
- return ( ! isset($this->userdata)) ? FALSE : $this->userdata;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Add or change data in the "userdata" array\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @return void\r
- */ \r
- function set_userdata($newdata = array(), $newval = '')\r
- {\r
- if (is_string($newdata))\r
- {\r
- $newdata = array($newdata => $newval);\r
- }\r
- \r
- if (count($newdata) > 0)\r
- {\r
- foreach ($newdata as $key => $val)\r
- {\r
- $this->userdata[$key] = $val;\r
- }\r
- }\r
-\r
- $this->sess_write();\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Delete a session variable from the "userdata" array\r
- *\r
- * @access array\r
- * @return void\r
- */ \r
- function unset_userdata($newdata = array())\r
- {\r
- if (is_string($newdata))\r
- {\r
- $newdata = array($newdata => '');\r
- }\r
- \r
- if (count($newdata) > 0)\r
- {\r
- foreach ($newdata as $key => $val)\r
- {\r
- unset($this->userdata[$key]);\r
- }\r
- }\r
- \r
- $this->sess_write();\r
- }\r
- \r
- // ------------------------------------------------------------------------\r
-\r
- /**\r
- * Add or change flashdata, only available\r
- * until the next request\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @return void\r
- */\r
- function set_flashdata($newdata = array(), $newval = '')\r
- {\r
- if (is_string($newdata))\r
- {\r
- $newdata = array($newdata => $newval);\r
- }\r
- \r
- if (count($newdata) > 0)\r
- {\r
- foreach ($newdata as $key => $val)\r
- {\r
- $flashdata_key = $this->flashdata_key.':new:'.$key;\r
- $this->set_userdata($flashdata_key, $val);\r
- }\r
- }\r
- } \r
- \r
- // ------------------------------------------------------------------------\r
-\r
- /**\r
- * Keeps existing flashdata available to next request.\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */\r
- function keep_flashdata($key)\r
- {\r
- // 'old' flashdata gets removed. Here we mark all \r
- // flashdata as 'new' to preserve it from _flashdata_sweep()\r
- // Note the function will return FALSE if the $key \r
- // provided cannot be found\r
- $old_flashdata_key = $this->flashdata_key.':old:'.$key;\r
- $value = $this->userdata($old_flashdata_key);\r
-\r
- $new_flashdata_key = $this->flashdata_key.':new:'.$key;\r
- $this->set_userdata($new_flashdata_key, $value);\r
- }\r
- \r
- // ------------------------------------------------------------------------\r
-\r
- /**\r
- * Fetch a specific flashdata item from the session array\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function flashdata($key)\r
- {\r
- $flashdata_key = $this->flashdata_key.':old:'.$key;\r
- return $this->userdata($flashdata_key);\r
- }\r
-\r
- // ------------------------------------------------------------------------\r
-\r
- /**\r
- * Identifies flashdata as 'old' for removal\r
- * when _flashdata_sweep() runs.\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _flashdata_mark()\r
- {\r
- $userdata = $this->all_userdata();\r
- foreach ($userdata as $name => $value)\r
- {\r
- $parts = explode(':new:', $name);\r
- if (is_array($parts) && count($parts) === 2)\r
- {\r
- $new_name = $this->flashdata_key.':old:'.$parts[1];\r
- $this->set_userdata($new_name, $value);\r
- $this->unset_userdata($name);\r
- }\r
- }\r
- }\r
-\r
- // ------------------------------------------------------------------------\r
-\r
- /**\r
- * Removes all flashdata marked as 'old'\r
- *\r
- * @access private\r
- * @return void\r
- */\r
-\r
- function _flashdata_sweep()\r
- {\r
- $userdata = $this->all_userdata();\r
- foreach ($userdata as $key => $value)\r
- {\r
- if (strpos($key, ':old:'))\r
- {\r
- $this->unset_userdata($key);\r
- }\r
- }\r
-\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get the "now" time\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _get_time()\r
- {\r
- if (strtolower($this->time_reference) == 'gmt')\r
- {\r
- $now = time();\r
- $time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now));\r
- }\r
- else\r
- {\r
- $time = time();\r
- }\r
- \r
- return $time;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Write the session cookie\r
- *\r
- * @access public\r
- * @return void\r
- */\r
- function _set_cookie($cookie_data = NULL)\r
- {\r
- if (is_null($cookie_data))\r
- {\r
- $cookie_data = $this->userdata;\r
- }\r
- \r
- // Serialize the userdata for the cookie\r
- $cookie_data = $this->_serialize($cookie_data);\r
- \r
- if ($this->sess_encrypt_cookie == TRUE)\r
- {\r
- $cookie_data = $this->CI->encrypt->encode($cookie_data);\r
- }\r
- else\r
- {\r
- // if encryption is not used, we provide an md5 hash to prevent userside tampering\r
- $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);\r
- }\r
- \r
- // Set the cookie\r
- setcookie(\r
- $this->sess_cookie_name,\r
- $cookie_data,\r
- $this->sess_expiration + time(),\r
- $this->cookie_path,\r
- $this->cookie_domain,\r
- 0\r
- );\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Serialize an array\r
- *\r
- * This function first converts any slashes found in the array to a temporary\r
- * marker, so when it gets unserialized the slashes will be preserved\r
- *\r
- * @access private\r
- * @param array\r
- * @return string\r
- */ \r
- function _serialize($data)\r
- {\r
- if (is_array($data))\r
- {\r
- foreach ($data as $key => $val)\r
- {\r
- $data[$key] = str_replace('\\', '{{slash}}', $val);\r
- }\r
- }\r
- else\r
- {\r
- $data = str_replace('\\', '{{slash}}', $data);\r
- }\r
- \r
- return serialize($data);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Unserialize\r
- *\r
- * This function unserializes a data string, then converts any\r
- * temporary slash markers back to actual slashes\r
- *\r
- * @access private\r
- * @param array\r
- * @return string\r
- */ \r
- function _unserialize($data)\r
- {\r
- $data = @unserialize(strip_slashes($data));\r
- \r
- if (is_array($data))\r
- {\r
- foreach ($data as $key => $val)\r
- {\r
- $data[$key] = str_replace('{{slash}}', '\\', $val);\r
- }\r
- \r
- return $data;\r
- }\r
- \r
- return str_replace('{{slash}}', '\\', $data);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Garbage collection\r
- *\r
- * This deletes expired session rows from database\r
- * if the probability percentage is met\r
- *\r
- * @access public\r
- * @return void\r
- */\r
- function _sess_gc()\r
- {\r
- if ($this->sess_use_database != TRUE)\r
- {\r
- return;\r
- }\r
- \r
- srand(time());\r
- if ((rand() % 100) < $this->gc_probability)\r
- {\r
- $expire = $this->now - $this->sess_expiration;\r
- \r
- $this->CI->db->where("last_activity < {$expire}");\r
- $this->CI->db->delete($this->sess_table_name);\r
-\r
- log_message('debug', 'Session garbage collection performed.');\r
- }\r
- }\r
-\r
- \r
-}\r
-// END Session Class\r
-\r
-/* End of file Session.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Session Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Sessions
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/sessions.html
+ */
+class CI_Session {
+
+ var $sess_encrypt_cookie = FALSE;
+ var $sess_use_database = FALSE;
+ var $sess_table_name = '';
+ var $sess_expiration = 7200;
+ var $sess_match_ip = FALSE;
+ var $sess_match_useragent = TRUE;
+ var $sess_cookie_name = 'ci_session';
+ var $cookie_prefix = '';
+ var $cookie_path = '';
+ var $cookie_domain = '';
+ var $sess_time_to_update = 300;
+ var $encryption_key = '';
+ var $flashdata_key = 'flash';
+ var $time_reference = 'time';
+ var $gc_probability = 5;
+ var $userdata = array();
+ var $CI;
+ var $now;
+
+ /**
+ * Session Constructor
+ *
+ * The constructor runs the session routines automatically
+ * whenever the class is instantiated.
+ */
+ function CI_Session($params = array())
+ {
+ log_message('debug', "Session Class Initialized");
+
+ // Set the super object to a local variable for use throughout the class
+ $this->CI =& get_instance();
+
+ // Set all the session preferences, which can either be set
+ // manually via the $params array above or via the config file
+ foreach (array('sess_encrypt_cookie', 'sess_use_database', 'sess_table_name', 'sess_expiration', 'sess_match_ip', 'sess_match_useragent', 'sess_cookie_name', 'cookie_path', 'cookie_domain', 'sess_time_to_update', 'time_reference', 'cookie_prefix', 'encryption_key') as $key)
+ {
+ $this->$key = (isset($params[$key])) ? $params[$key] : $this->CI->config->item($key);
+ }
+
+ // Load the string helper so we can use the strip_slashes() function
+ $this->CI->load->helper('string');
+
+ // Do we need encryption? If so, load the encryption class
+ if ($this->sess_encrypt_cookie == TRUE)
+ {
+ $this->CI->load->library('encrypt');
+ }
+
+ // Are we using a database? If so, load it
+ if ($this->sess_use_database === TRUE AND $this->sess_table_name != '')
+ {
+ $this->CI->load->database();
+ }
+
+ // Set the "now" time. Can either be GMT or server time, based on the
+ // config prefs. We use this to set the "last activity" time
+ $this->now = $this->_get_time();
+
+ // Set the session length. If the session expiration is
+ // set to zero we'll set the expiration two years from now.
+ if ($this->sess_expiration == 0)
+ {
+ $this->sess_expiration = (60*60*24*365*2);
+ }
+
+ // Set the cookie name
+ $this->sess_cookie_name = $this->cookie_prefix.$this->sess_cookie_name;
+
+ // Run the Session routine. If a session doesn't exist we'll
+ // create a new one. If it does, we'll update it.
+ if ( ! $this->sess_read())
+ {
+ $this->sess_create();
+ }
+ else
+ {
+ $this->sess_update();
+ }
+
+ // Delete 'old' flashdata (from last request)
+ $this->_flashdata_sweep();
+
+ // Mark all new flashdata as old (data will be deleted before next request)
+ $this->_flashdata_mark();
+
+ // Delete expired sessions if necessary
+ $this->_sess_gc();
+
+ log_message('debug', "Session routines successfully run");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch the current session data if it exists
+ *
+ * @access public
+ * @return void
+ */
+ function sess_read()
+ {
+ // Fetch the cookie
+ $session = $this->CI->input->cookie($this->sess_cookie_name);
+
+ // No cookie? Goodbye cruel world!...
+ if ($session === FALSE)
+ {
+ log_message('debug', 'A session cookie was not found.');
+ return FALSE;
+ }
+
+ // Decrypt the cookie data
+ if ($this->sess_encrypt_cookie == TRUE)
+ {
+ $session = $this->CI->encrypt->decode($session);
+ }
+ else
+ {
+ // encryption was not used, so we need to check the md5 hash
+ $hash = substr($session, strlen($session)-32); // get last 32 chars
+ $session = substr($session, 0, strlen($session)-32);
+
+ // Does the md5 hash match? This is to prevent manipulation of session data in userspace
+ if ($hash !== md5($session.$this->encryption_key))
+ {
+ log_message('error', 'The session cookie data did not match what was expected. This could be a possible hacking attempt.');
+ $this->sess_destroy();
+ return FALSE;
+ }
+ }
+
+ // Unserialize the session array
+ $session = $this->_unserialize($session);
+
+ // Is the session data we unserialized an array with the correct format?
+ if ( ! is_array($session) OR ! isset($session['session_id']) OR ! isset($session['ip_address']) OR ! isset($session['user_agent']) OR ! isset($session['last_activity']))
+ {
+ $this->sess_destroy();
+ return FALSE;
+ }
+
+ // Is the session current?
+ if (($session['last_activity'] + $this->sess_expiration) < $this->now)
+ {
+ $this->sess_destroy();
+ return FALSE;
+ }
+
+ // Does the IP Match?
+ if ($this->sess_match_ip == TRUE AND $session['ip_address'] != $this->CI->input->ip_address())
+ {
+ $this->sess_destroy();
+ return FALSE;
+ }
+
+ // Does the User Agent Match?
+ if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 50)))
+ {
+ $this->sess_destroy();
+ return FALSE;
+ }
+
+ // Is there a corresponding session in the DB?
+ if ($this->sess_use_database === TRUE)
+ {
+ $this->CI->db->where('session_id', $session['session_id']);
+
+ if ($this->sess_match_ip == TRUE)
+ {
+ $this->CI->db->where('ip_address', $session['ip_address']);
+ }
+
+ if ($this->sess_match_useragent == TRUE)
+ {
+ $this->CI->db->where('user_agent', $session['user_agent']);
+ }
+
+ $query = $this->CI->db->get($this->sess_table_name);
+
+ // No result? Kill it!
+ if ($query->num_rows() == 0)
+ {
+ $this->sess_destroy();
+ return FALSE;
+ }
+
+ // Is there custom data? If so, add it to the main session array
+ $row = $query->row();
+ if (isset($row->user_data) AND $row->user_data != '')
+ {
+ $custom_data = $this->_unserialize($row->user_data);
+
+ if (is_array($custom_data))
+ {
+ foreach ($custom_data as $key => $val)
+ {
+ $session[$key] = $val;
+ }
+ }
+ }
+ }
+
+ // Session is valid!
+ $this->userdata = $session;
+ unset($session);
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Write the session data
+ *
+ * @access public
+ * @return void
+ */
+ function sess_write()
+ {
+ // Are we saving custom data to the DB? If not, all we do is update the cookie
+ if ($this->sess_use_database === FALSE)
+ {
+ $this->_set_cookie();
+ return;
+ }
+
+ // set the custom userdata, the session data we will set in a second
+ $custom_userdata = $this->userdata;
+ $cookie_userdata = array();
+
+ // Before continuing, we need to determine if there is any custom data to deal with.
+ // Let's determine this by removing the default indexes to see if there's anything left in the array
+ // and set the session data while we're at it
+ foreach (array('session_id','ip_address','user_agent','last_activity') as $val)
+ {
+ unset($custom_userdata[$val]);
+ $cookie_userdata[$val] = $this->userdata[$val];
+ }
+
+ // Did we find any custom data? If not, we turn the empty array into a string
+ // since there's no reason to serialize and store an empty array in the DB
+ if (count($custom_userdata) === 0)
+ {
+ $custom_userdata = '';
+ }
+ else
+ {
+ // Serialize the custom data array so we can store it
+ $custom_userdata = $this->_serialize($custom_userdata);
+ }
+
+ // Run the update query
+ $this->CI->db->where('session_id', $this->userdata['session_id']);
+ $this->CI->db->update($this->sess_table_name, array('last_activity' => $this->userdata['last_activity'], 'user_data' => $custom_userdata));
+
+ // Write the cookie. Notice that we manually pass the cookie data array to the
+ // _set_cookie() function. Normally that function will store $this->userdata, but
+ // in this case that array contains custom data, which we do not want in the cookie.
+ $this->_set_cookie($cookie_userdata);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Create a new session
+ *
+ * @access public
+ * @return void
+ */
+ function sess_create()
+ {
+ $sessid = '';
+ while (strlen($sessid) < 32)
+ {
+ $sessid .= mt_rand(0, mt_getrandmax());
+ }
+
+ // To make the session ID even more secure we'll combine it with the user's IP
+ $sessid .= $this->CI->input->ip_address();
+
+ $this->userdata = array(
+ 'session_id' => md5(uniqid($sessid, TRUE)),
+ 'ip_address' => $this->CI->input->ip_address(),
+ 'user_agent' => substr($this->CI->input->user_agent(), 0, 50),
+ 'last_activity' => $this->now
+ );
+
+
+ // Save the data to the DB if needed
+ if ($this->sess_use_database === TRUE)
+ {
+ $this->CI->db->query($this->CI->db->insert_string($this->sess_table_name, $this->userdata));
+ }
+
+ // Write the cookie
+ $this->_set_cookie();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Update an existing session
+ *
+ * @access public
+ * @return void
+ */
+ function sess_update()
+ {
+ // We only update the session every five minutes by default
+ if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
+ {
+ return;
+ }
+
+ // Save the old session id so we know which record to
+ // update in the database if we need it
+ $old_sessid = $this->userdata['session_id'];
+ $new_sessid = '';
+ while (strlen($new_sessid) < 32)
+ {
+ $new_sessid .= mt_rand(0, mt_getrandmax());
+ }
+
+ // To make the session ID even more secure we'll combine it with the user's IP
+ $new_sessid .= $this->CI->input->ip_address();
+
+ // Turn it into a hash
+ $new_sessid = md5(uniqid($new_sessid, TRUE));
+
+ // Update the session data in the session data array
+ $this->userdata['session_id'] = $new_sessid;
+ $this->userdata['last_activity'] = $this->now;
+
+ // _set_cookie() will handle this for us if we aren't using database sessions
+ // by pushing all userdata to the cookie.
+ $cookie_data = NULL;
+
+ // Update the session ID and last_activity field in the DB if needed
+ if ($this->sess_use_database === TRUE)
+ {
+ // set cookie explicitly to only have our session data
+ $cookie_data = array();
+ foreach (array('session_id','ip_address','user_agent','last_activity') as $val)
+ {
+ $cookie_data[$val] = $this->userdata[$val];
+ }
+
+ $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));
+ }
+
+ // Write the cookie
+ $this->_set_cookie($cookie_data);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Destroy the current session
+ *
+ * @access public
+ * @return void
+ */
+ function sess_destroy()
+ {
+ // Kill the session DB row
+ if ($this->sess_use_database === TRUE AND isset($this->userdata['session_id']))
+ {
+ $this->CI->db->where('session_id', $this->userdata['session_id']);
+ $this->CI->db->delete($this->sess_table_name);
+ }
+
+ // Kill the cookie
+ setcookie(
+ $this->sess_cookie_name,
+ addslashes(serialize(array())),
+ ($this->now - 31500000),
+ $this->cookie_path,
+ $this->cookie_domain,
+ 0
+ );
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch a specific item from the session array
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function userdata($item)
+ {
+ return ( ! isset($this->userdata[$item])) ? FALSE : $this->userdata[$item];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch all session data
+ *
+ * @access public
+ * @return mixed
+ */
+ function all_userdata()
+ {
+ return ( ! isset($this->userdata)) ? FALSE : $this->userdata;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add or change data in the "userdata" array
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @return void
+ */
+ function set_userdata($newdata = array(), $newval = '')
+ {
+ if (is_string($newdata))
+ {
+ $newdata = array($newdata => $newval);
+ }
+
+ if (count($newdata) > 0)
+ {
+ foreach ($newdata as $key => $val)
+ {
+ $this->userdata[$key] = $val;
+ }
+ }
+
+ $this->sess_write();
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete a session variable from the "userdata" array
+ *
+ * @access array
+ * @return void
+ */
+ function unset_userdata($newdata = array())
+ {
+ if (is_string($newdata))
+ {
+ $newdata = array($newdata => '');
+ }
+
+ if (count($newdata) > 0)
+ {
+ foreach ($newdata as $key => $val)
+ {
+ unset($this->userdata[$key]);
+ }
+ }
+
+ $this->sess_write();
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Add or change flashdata, only available
+ * until the next request
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @return void
+ */
+ function set_flashdata($newdata = array(), $newval = '')
+ {
+ if (is_string($newdata))
+ {
+ $newdata = array($newdata => $newval);
+ }
+
+ if (count($newdata) > 0)
+ {
+ foreach ($newdata as $key => $val)
+ {
+ $flashdata_key = $this->flashdata_key.':new:'.$key;
+ $this->set_userdata($flashdata_key, $val);
+ }
+ }
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Keeps existing flashdata available to next request.
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function keep_flashdata($key)
+ {
+ // 'old' flashdata gets removed. Here we mark all
+ // flashdata as 'new' to preserve it from _flashdata_sweep()
+ // Note the function will return FALSE if the $key
+ // provided cannot be found
+ $old_flashdata_key = $this->flashdata_key.':old:'.$key;
+ $value = $this->userdata($old_flashdata_key);
+
+ $new_flashdata_key = $this->flashdata_key.':new:'.$key;
+ $this->set_userdata($new_flashdata_key, $value);
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Fetch a specific flashdata item from the session array
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function flashdata($key)
+ {
+ $flashdata_key = $this->flashdata_key.':old:'.$key;
+ return $this->userdata($flashdata_key);
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Identifies flashdata as 'old' for removal
+ * when _flashdata_sweep() runs.
+ *
+ * @access private
+ * @return void
+ */
+ function _flashdata_mark()
+ {
+ $userdata = $this->all_userdata();
+ foreach ($userdata as $name => $value)
+ {
+ $parts = explode(':new:', $name);
+ if (is_array($parts) && count($parts) === 2)
+ {
+ $new_name = $this->flashdata_key.':old:'.$parts[1];
+ $this->set_userdata($new_name, $value);
+ $this->unset_userdata($name);
+ }
+ }
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Removes all flashdata marked as 'old'
+ *
+ * @access private
+ * @return void
+ */
+
+ function _flashdata_sweep()
+ {
+ $userdata = $this->all_userdata();
+ foreach ($userdata as $key => $value)
+ {
+ if (strpos($key, ':old:'))
+ {
+ $this->unset_userdata($key);
+ }
+ }
+
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get the "now" time
+ *
+ * @access private
+ * @return string
+ */
+ function _get_time()
+ {
+ if (strtolower($this->time_reference) == 'gmt')
+ {
+ $now = time();
+ $time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now));
+ }
+ else
+ {
+ $time = time();
+ }
+
+ return $time;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Write the session cookie
+ *
+ * @access public
+ * @return void
+ */
+ function _set_cookie($cookie_data = NULL)
+ {
+ if (is_null($cookie_data))
+ {
+ $cookie_data = $this->userdata;
+ }
+
+ // Serialize the userdata for the cookie
+ $cookie_data = $this->_serialize($cookie_data);
+
+ if ($this->sess_encrypt_cookie == TRUE)
+ {
+ $cookie_data = $this->CI->encrypt->encode($cookie_data);
+ }
+ else
+ {
+ // if encryption is not used, we provide an md5 hash to prevent userside tampering
+ $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
+ }
+
+ // Set the cookie
+ setcookie(
+ $this->sess_cookie_name,
+ $cookie_data,
+ $this->sess_expiration + time(),
+ $this->cookie_path,
+ $this->cookie_domain,
+ 0
+ );
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Serialize an array
+ *
+ * This function first converts any slashes found in the array to a temporary
+ * marker, so when it gets unserialized the slashes will be preserved
+ *
+ * @access private
+ * @param array
+ * @return string
+ */
+ function _serialize($data)
+ {
+ if (is_array($data))
+ {
+ foreach ($data as $key => $val)
+ {
+ $data[$key] = str_replace('\\', '{{slash}}', $val);
+ }
+ }
+ else
+ {
+ $data = str_replace('\\', '{{slash}}', $data);
+ }
+
+ return serialize($data);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Unserialize
+ *
+ * This function unserializes a data string, then converts any
+ * temporary slash markers back to actual slashes
+ *
+ * @access private
+ * @param array
+ * @return string
+ */
+ function _unserialize($data)
+ {
+ $data = @unserialize(strip_slashes($data));
+
+ if (is_array($data))
+ {
+ foreach ($data as $key => $val)
+ {
+ $data[$key] = str_replace('{{slash}}', '\\', $val);
+ }
+
+ return $data;
+ }
+
+ return str_replace('{{slash}}', '\\', $data);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Garbage collection
+ *
+ * This deletes expired session rows from database
+ * if the probability percentage is met
+ *
+ * @access public
+ * @return void
+ */
+ function _sess_gc()
+ {
+ if ($this->sess_use_database != TRUE)
+ {
+ return;
+ }
+
+ srand(time());
+ if ((rand() % 100) < $this->gc_probability)
+ {
+ $expire = $this->now - $this->sess_expiration;
+
+ $this->CI->db->where("last_activity < {$expire}");
+ $this->CI->db->delete($this->sess_table_name);
+
+ log_message('debug', 'Session garbage collection performed.');
+ }
+ }
+
+
+}
+// END Session Class
+
+/* End of file Session.php */
/* Location: ./system/libraries/Session.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * SHA1 Encoding Class\r
- *\r
- * Purpose: Provides 160 bit hashing using The Secure Hash Algorithm\r
- * developed at the National Institute of Standards and Technology. The 40\r
- * character SHA1 message hash is computationally infeasible to crack.\r
- *\r
- * This class is a fallback for servers that are not running PHP greater than\r
- * 4.3, or do not have the MHASH library.\r
- *\r
- * This class is based on two scripts:\r
- *\r
- * Marcus Campbell's PHP implementation (GNU license)\r
- * http://www.tecknik.net/sha-1/\r
- *\r
- * ...which is based on Paul Johnston's JavaScript version\r
- * (BSD license). http://pajhome.org.uk/\r
- *\r
- * I encapsulated the functions and wrote one additional method to fix\r
- * a hex conversion bug. - Rick Ellis\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Encryption\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/general/encryption.html\r
- */\r
-class CI_SHA {\r
-\r
- function CI_SHA()\r
- {\r
- log_message('debug', "SHA1 Class Initialized");\r
- }\r
-\r
- /**\r
- * Generate the Hash\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function generate($str)\r
- {\r
- $n = ((strlen($str) + 8) >> 6) + 1;\r
-\r
- for ($i = 0; $i < $n * 16; $i++)\r
- {\r
- $x[$i] = 0;\r
- }\r
-\r
- for ($i = 0; $i < strlen($str); $i++)\r
- {\r
- $x[$i >> 2] |= ord(substr($str, $i, 1)) << (24 - ($i % 4) * 8);\r
- }\r
-\r
- $x[$i >> 2] |= 0x80 << (24 - ($i % 4) * 8);\r
-\r
- $x[$n * 16 - 1] = strlen($str) * 8;\r
-\r
- $a = 1732584193;\r
- $b = -271733879;\r
- $c = -1732584194;\r
- $d = 271733878;\r
- $e = -1009589776;\r
-\r
- for ($i = 0; $i < sizeof($x); $i += 16)\r
- {\r
- $olda = $a;\r
- $oldb = $b;\r
- $oldc = $c;\r
- $oldd = $d;\r
- $olde = $e;\r
-\r
- for($j = 0; $j < 80; $j++)\r
- {\r
- if ($j < 16)\r
- {\r
- $w[$j] = $x[$i + $j];\r
- }\r
- else\r
- {\r
- $w[$j] = $this->_rol($w[$j - 3] ^ $w[$j - 8] ^ $w[$j - 14] ^ $w[$j - 16], 1);\r
- }\r
-\r
- $t = $this->_safe_add($this->_safe_add($this->_rol($a, 5), $this->_ft($j, $b, $c, $d)), $this->_safe_add($this->_safe_add($e, $w[$j]), $this->_kt($j)));\r
-\r
- $e = $d;\r
- $d = $c;\r
- $c = $this->_rol($b, 30);\r
- $b = $a;\r
- $a = $t;\r
- }\r
-\r
- $a = $this->_safe_add($a, $olda);\r
- $b = $this->_safe_add($b, $oldb);\r
- $c = $this->_safe_add($c, $oldc);\r
- $d = $this->_safe_add($d, $oldd);\r
- $e = $this->_safe_add($e, $olde);\r
- }\r
-\r
- return $this->_hex($a).$this->_hex($b).$this->_hex($c).$this->_hex($d).$this->_hex($e);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Convert a decimal to hex\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */ \r
- function _hex($str)\r
- {\r
- $str = dechex($str);\r
-\r
- if (strlen($str) == 7)\r
- {\r
- $str = '0'.$str;\r
- }\r
-\r
- return $str;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Return result based on iteration\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _ft($t, $b, $c, $d)\r
- {\r
- if ($t < 20)\r
- return ($b & $c) | ((~$b) & $d);\r
- if ($t < 40)\r
- return $b ^ $c ^ $d;\r
- if ($t < 60)\r
- return ($b & $c) | ($b & $d) | ($c & $d);\r
-\r
- return $b ^ $c ^ $d;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Determine the additive constant\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _kt($t)\r
- {\r
- if ($t < 20)\r
- {\r
- return 1518500249;\r
- }\r
- else if ($t < 40)\r
- {\r
- return 1859775393;\r
- }\r
- else if ($t < 60)\r
- {\r
- return -1894007588;\r
- }\r
- else\r
- {\r
- return -899497514;\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Add integers, wrapping at 2^32\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _safe_add($x, $y)\r
- {\r
- $lsw = ($x & 0xFFFF) + ($y & 0xFFFF);\r
- $msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);\r
-\r
- return ($msw << 16) | ($lsw & 0xFFFF);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Bitwise rotate a 32-bit number\r
- *\r
- * @access private\r
- * @return integer\r
- */ \r
- function _rol($num, $cnt)\r
- {\r
- return ($num << $cnt) | $this->_zero_fill($num, 32 - $cnt);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Pad string with zero\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _zero_fill($a, $b)\r
- {\r
- $bin = decbin($a);\r
-\r
- if (strlen($bin) < $b)\r
- {\r
- $bin = 0;\r
- }\r
- else\r
- {\r
- $bin = substr($bin, 0, strlen($bin) - $b);\r
- }\r
-\r
- for ($i=0; $i < $b; $i++)\r
- {\r
- $bin = "0".$bin;\r
- }\r
-\r
- return bindec($bin);\r
- }\r
-}\r
-// END CI_SHA\r
-\r
-/* End of file Sha1.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * SHA1 Encoding Class
+ *
+ * Purpose: Provides 160 bit hashing using The Secure Hash Algorithm
+ * developed at the National Institute of Standards and Technology. The 40
+ * character SHA1 message hash is computationally infeasible to crack.
+ *
+ * This class is a fallback for servers that are not running PHP greater than
+ * 4.3, or do not have the MHASH library.
+ *
+ * This class is based on two scripts:
+ *
+ * Marcus Campbell's PHP implementation (GNU license)
+ * http://www.tecknik.net/sha-1/
+ *
+ * ...which is based on Paul Johnston's JavaScript version
+ * (BSD license). http://pajhome.org.uk/
+ *
+ * I encapsulated the functions and wrote one additional method to fix
+ * a hex conversion bug. - Rick Ellis
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Encryption
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/general/encryption.html
+ */
+class CI_SHA {
+
+ function CI_SHA()
+ {
+ log_message('debug', "SHA1 Class Initialized");
+ }
+
+ /**
+ * Generate the Hash
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function generate($str)
+ {
+ $n = ((strlen($str) + 8) >> 6) + 1;
+
+ for ($i = 0; $i < $n * 16; $i++)
+ {
+ $x[$i] = 0;
+ }
+
+ for ($i = 0; $i < strlen($str); $i++)
+ {
+ $x[$i >> 2] |= ord(substr($str, $i, 1)) << (24 - ($i % 4) * 8);
+ }
+
+ $x[$i >> 2] |= 0x80 << (24 - ($i % 4) * 8);
+
+ $x[$n * 16 - 1] = strlen($str) * 8;
+
+ $a = 1732584193;
+ $b = -271733879;
+ $c = -1732584194;
+ $d = 271733878;
+ $e = -1009589776;
+
+ for ($i = 0; $i < sizeof($x); $i += 16)
+ {
+ $olda = $a;
+ $oldb = $b;
+ $oldc = $c;
+ $oldd = $d;
+ $olde = $e;
+
+ for($j = 0; $j < 80; $j++)
+ {
+ if ($j < 16)
+ {
+ $w[$j] = $x[$i + $j];
+ }
+ else
+ {
+ $w[$j] = $this->_rol($w[$j - 3] ^ $w[$j - 8] ^ $w[$j - 14] ^ $w[$j - 16], 1);
+ }
+
+ $t = $this->_safe_add($this->_safe_add($this->_rol($a, 5), $this->_ft($j, $b, $c, $d)), $this->_safe_add($this->_safe_add($e, $w[$j]), $this->_kt($j)));
+
+ $e = $d;
+ $d = $c;
+ $c = $this->_rol($b, 30);
+ $b = $a;
+ $a = $t;
+ }
+
+ $a = $this->_safe_add($a, $olda);
+ $b = $this->_safe_add($b, $oldb);
+ $c = $this->_safe_add($c, $oldc);
+ $d = $this->_safe_add($d, $oldd);
+ $e = $this->_safe_add($e, $olde);
+ }
+
+ return $this->_hex($a).$this->_hex($b).$this->_hex($c).$this->_hex($d).$this->_hex($e);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Convert a decimal to hex
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _hex($str)
+ {
+ $str = dechex($str);
+
+ if (strlen($str) == 7)
+ {
+ $str = '0'.$str;
+ }
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Return result based on iteration
+ *
+ * @access private
+ * @return string
+ */
+ function _ft($t, $b, $c, $d)
+ {
+ if ($t < 20)
+ return ($b & $c) | ((~$b) & $d);
+ if ($t < 40)
+ return $b ^ $c ^ $d;
+ if ($t < 60)
+ return ($b & $c) | ($b & $d) | ($c & $d);
+
+ return $b ^ $c ^ $d;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Determine the additive constant
+ *
+ * @access private
+ * @return string
+ */
+ function _kt($t)
+ {
+ if ($t < 20)
+ {
+ return 1518500249;
+ }
+ else if ($t < 40)
+ {
+ return 1859775393;
+ }
+ else if ($t < 60)
+ {
+ return -1894007588;
+ }
+ else
+ {
+ return -899497514;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add integers, wrapping at 2^32
+ *
+ * @access private
+ * @return string
+ */
+ function _safe_add($x, $y)
+ {
+ $lsw = ($x & 0xFFFF) + ($y & 0xFFFF);
+ $msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);
+
+ return ($msw << 16) | ($lsw & 0xFFFF);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Bitwise rotate a 32-bit number
+ *
+ * @access private
+ * @return integer
+ */
+ function _rol($num, $cnt)
+ {
+ return ($num << $cnt) | $this->_zero_fill($num, 32 - $cnt);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Pad string with zero
+ *
+ * @access private
+ * @return string
+ */
+ function _zero_fill($a, $b)
+ {
+ $bin = decbin($a);
+
+ if (strlen($bin) < $b)
+ {
+ $bin = 0;
+ }
+ else
+ {
+ $bin = substr($bin, 0, strlen($bin) - $b);
+ }
+
+ for ($i=0; $i < $b; $i++)
+ {
+ $bin = "0".$bin;
+ }
+
+ return bindec($bin);
+ }
+}
+// END CI_SHA
+
+/* End of file Sha1.php */
/* Location: ./system/libraries/Sha1.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.3.1\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * HTML Table Generating Class\r
- *\r
- * Lets you create tables manually or from database result objects, or arrays.\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category HTML Tables\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/uri.html\r
- */\r
-class CI_Table {\r
-\r
- var $rows = array();\r
- var $heading = array();\r
- var $auto_heading = TRUE; \r
- var $caption = NULL; \r
- var $template = NULL;\r
- var $newline = "\n";\r
- var $empty_cells = "";\r
- \r
- \r
- function CI_Table()\r
- {\r
- log_message('debug', "Table Class Initialized");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set the template\r
- *\r
- * @access public\r
- * @param array\r
- * @return void\r
- */\r
- function set_template($template)\r
- {\r
- if ( ! is_array($template))\r
- {\r
- return FALSE;\r
- }\r
- \r
- $this->template = $template;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set the table heading\r
- *\r
- * Can be passed as an array or discreet params\r
- *\r
- * @access public\r
- * @param mixed\r
- * @return void\r
- */\r
- function set_heading()\r
- {\r
- $args = func_get_args();\r
- $this->heading = (is_array($args[0])) ? $args[0] : $args;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set columns. Takes a one-dimensional array as input and creates\r
- * a multi-dimensional array with a depth equal to the number of\r
- * columns. This allows a single array with many elements to be\r
- * displayed in a table that has a fixed column count.\r
- *\r
- * @access public\r
- * @param array\r
- * @param int\r
- * @return void\r
- */\r
- function make_columns($array = array(), $col_limit = 0)\r
- {\r
- if ( ! is_array($array) OR count($array) == 0)\r
- {\r
- return FALSE;\r
- }\r
- \r
- // Turn off the auto-heading feature since it's doubtful we \r
- // will want headings from a one-dimensional array\r
- $this->auto_heading = FALSE;\r
- \r
- if ($col_limit == 0)\r
- {\r
- return $array;\r
- }\r
- \r
- $new = array();\r
- while(count($array) > 0)\r
- { \r
- $temp = array_splice($array, 0, $col_limit);\r
- \r
- if (count($temp) < $col_limit)\r
- {\r
- for ($i = count($temp); $i < $col_limit; $i++)\r
- {\r
- $temp[] = ' ';\r
- }\r
- }\r
- \r
- $new[] = $temp;\r
- }\r
- \r
- return $new;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set "empty" cells\r
- *\r
- * Can be passed as an array or discreet params\r
- *\r
- * @access public\r
- * @param mixed\r
- * @return void\r
- */\r
- function set_empty($value)\r
- {\r
- $this->empty_cells = $value;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Add a table row\r
- *\r
- * Can be passed as an array or discreet params\r
- *\r
- * @access public\r
- * @param mixed\r
- * @return void\r
- */\r
- function add_row()\r
- {\r
- $args = func_get_args();\r
- $this->rows[] = (is_array($args[0])) ? $args[0] : $args;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Add a table caption\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */\r
- function set_caption($caption)\r
- {\r
- $this->caption = $caption;\r
- } \r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Generate the table\r
- *\r
- * @access public\r
- * @param mixed\r
- * @return string\r
- */\r
- function generate($table_data = NULL)\r
- {\r
- // The table data can optionally be passed to this function\r
- // either as a database result object or an array\r
- if ( ! is_null($table_data))\r
- {\r
- if (is_object($table_data))\r
- {\r
- $this->_set_from_object($table_data);\r
- }\r
- elseif (is_array($table_data))\r
- {\r
- $set_heading = (count($this->heading) == 0 AND $this->auto_heading == FALSE) ? FALSE : TRUE;\r
- $this->_set_from_array($table_data, $set_heading);\r
- }\r
- }\r
- \r
- // Is there anything to display? No? Smite them!\r
- if (count($this->heading) == 0 AND count($this->rows) == 0)\r
- {\r
- return 'Undefined table data';\r
- }\r
- \r
- // Compile and validate the template date\r
- $this->_compile_template();\r
- \r
- \r
- // Build the table!\r
- \r
- $out = $this->template['table_open'];\r
- $out .= $this->newline; \r
-\r
- // Add any caption here\r
- if ($this->caption)\r
- {\r
- $out .= $this->newline;\r
- $out .= '<caption>' . $this->caption . '</caption>';\r
- $out .= $this->newline;\r
- }\r
-\r
- // Is there a table heading to display?\r
- if (count($this->heading) > 0)\r
- {\r
- $out .= $this->template['heading_row_start'];\r
- $out .= $this->newline; \r
-\r
- foreach($this->heading as $heading)\r
- {\r
- $out .= $this->template['heading_cell_start'];\r
- $out .= $heading;\r
- $out .= $this->template['heading_cell_end'];\r
- }\r
-\r
- $out .= $this->template['heading_row_end'];\r
- $out .= $this->newline; \r
- }\r
-\r
- // Build the table rows\r
- if (count($this->rows) > 0)\r
- {\r
- $i = 1;\r
- foreach($this->rows as $row)\r
- {\r
- if ( ! is_array($row))\r
- {\r
- break;\r
- }\r
- \r
- // We use modulus to alternate the row colors\r
- $name = (fmod($i++, 2)) ? '' : 'alt_';\r
- \r
- $out .= $this->template['row_'.$name.'start'];\r
- $out .= $this->newline; \r
- \r
- foreach($row as $cell)\r
- {\r
- $out .= $this->template['cell_'.$name.'start'];\r
- \r
- if ($cell === "")\r
- {\r
- $out .= $this->empty_cells;\r
- }\r
- else\r
- {\r
- $out .= $cell;\r
- }\r
- \r
- $out .= $this->template['cell_'.$name.'end'];\r
- }\r
- \r
- $out .= $this->template['row_'.$name.'end'];\r
- $out .= $this->newline; \r
- }\r
- }\r
-\r
- $out .= $this->template['table_close'];\r
- \r
- return $out;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Clears the table arrays. Useful if multiple tables are being generated\r
- *\r
- * @access public\r
- * @return void\r
- */\r
- function clear()\r
- {\r
- $this->rows = array();\r
- $this->heading = array();\r
- $this->auto_heading = TRUE; \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set table data from a database result object\r
- *\r
- * @access public\r
- * @param object\r
- * @return void\r
- */\r
- function _set_from_object($query)\r
- {\r
- if ( ! is_object($query))\r
- {\r
- return FALSE;\r
- }\r
- \r
- // First generate the headings from the table column names\r
- if (count($this->heading) == 0)\r
- {\r
- if ( ! method_exists($query, 'list_fields'))\r
- {\r
- return FALSE;\r
- }\r
- \r
- $this->heading = $query->list_fields();\r
- }\r
- \r
- // Next blast through the result array and build out the rows\r
- \r
- if ($query->num_rows() > 0)\r
- {\r
- foreach ($query->result_array() as $row)\r
- {\r
- $this->rows[] = $row;\r
- }\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Set table data from an array\r
- *\r
- * @access public\r
- * @param array\r
- * @return void\r
- */\r
- function _set_from_array($data, $set_heading = TRUE)\r
- {\r
- if ( ! is_array($data) OR count($data) == 0)\r
- {\r
- return FALSE;\r
- }\r
- \r
- $i = 0;\r
- foreach ($data as $row)\r
- {\r
- if ( ! is_array($row))\r
- {\r
- $this->rows[] = $data;\r
- break;\r
- }\r
- \r
- // If a heading hasn't already been set we'll use the first row of the array as the heading\r
- if ($i == 0 AND count($data) > 1 AND count($this->heading) == 0 AND $set_heading == TRUE)\r
- {\r
- $this->heading = $row;\r
- }\r
- else\r
- {\r
- $this->rows[] = $row;\r
- }\r
- \r
- $i++;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Compile Template\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _compile_template()\r
- { \r
- if ($this->template == NULL)\r
- {\r
- $this->template = $this->_default_template();\r
- return;\r
- }\r
- \r
- $this->temp = $this->_default_template();\r
- foreach (array('table_open','heading_row_start', 'heading_row_end', 'heading_cell_start', 'heading_cell_end', 'row_start', 'row_end', 'cell_start', 'cell_end', 'row_alt_start', 'row_alt_end', 'cell_alt_start', 'cell_alt_end', 'table_close') as $val)\r
- {\r
- if ( ! isset($this->template[$val]))\r
- {\r
- $this->template[$val] = $this->temp[$val];\r
- }\r
- } \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Default Template\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _default_template()\r
- {\r
- return array (\r
- 'table_open' => '<table border="0" cellpadding="4" cellspacing="0">',\r
-\r
- 'heading_row_start' => '<tr>',\r
- 'heading_row_end' => '</tr>',\r
- 'heading_cell_start' => '<th>',\r
- 'heading_cell_end' => '</th>',\r
-\r
- 'row_start' => '<tr>',\r
- 'row_end' => '</tr>',\r
- 'cell_start' => '<td>',\r
- 'cell_end' => '</td>',\r
-\r
- 'row_alt_start' => '<tr>',\r
- 'row_alt_end' => '</tr>',\r
- 'cell_alt_start' => '<td>',\r
- 'cell_alt_end' => '</td>',\r
-\r
- 'table_close' => '</table>'\r
- ); \r
- }\r
- \r
-\r
-}\r
-\r
-\r
-/* End of file Table.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.3.1
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * HTML Table Generating Class
+ *
+ * Lets you create tables manually or from database result objects, or arrays.
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category HTML Tables
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/uri.html
+ */
+class CI_Table {
+
+ var $rows = array();
+ var $heading = array();
+ var $auto_heading = TRUE;
+ var $caption = NULL;
+ var $template = NULL;
+ var $newline = "\n";
+ var $empty_cells = "";
+
+
+ function CI_Table()
+ {
+ log_message('debug', "Table Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the template
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function set_template($template)
+ {
+ if ( ! is_array($template))
+ {
+ return FALSE;
+ }
+
+ $this->template = $template;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the table heading
+ *
+ * Can be passed as an array or discreet params
+ *
+ * @access public
+ * @param mixed
+ * @return void
+ */
+ function set_heading()
+ {
+ $args = func_get_args();
+ $this->heading = (is_array($args[0])) ? $args[0] : $args;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set columns. Takes a one-dimensional array as input and creates
+ * a multi-dimensional array with a depth equal to the number of
+ * columns. This allows a single array with many elements to be
+ * displayed in a table that has a fixed column count.
+ *
+ * @access public
+ * @param array
+ * @param int
+ * @return void
+ */
+ function make_columns($array = array(), $col_limit = 0)
+ {
+ if ( ! is_array($array) OR count($array) == 0)
+ {
+ return FALSE;
+ }
+
+ // Turn off the auto-heading feature since it's doubtful we
+ // will want headings from a one-dimensional array
+ $this->auto_heading = FALSE;
+
+ if ($col_limit == 0)
+ {
+ return $array;
+ }
+
+ $new = array();
+ while(count($array) > 0)
+ {
+ $temp = array_splice($array, 0, $col_limit);
+
+ if (count($temp) < $col_limit)
+ {
+ for ($i = count($temp); $i < $col_limit; $i++)
+ {
+ $temp[] = ' ';
+ }
+ }
+
+ $new[] = $temp;
+ }
+
+ return $new;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set "empty" cells
+ *
+ * Can be passed as an array or discreet params
+ *
+ * @access public
+ * @param mixed
+ * @return void
+ */
+ function set_empty($value)
+ {
+ $this->empty_cells = $value;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add a table row
+ *
+ * Can be passed as an array or discreet params
+ *
+ * @access public
+ * @param mixed
+ * @return void
+ */
+ function add_row()
+ {
+ $args = func_get_args();
+ $this->rows[] = (is_array($args[0])) ? $args[0] : $args;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add a table caption
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_caption($caption)
+ {
+ $this->caption = $caption;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate the table
+ *
+ * @access public
+ * @param mixed
+ * @return string
+ */
+ function generate($table_data = NULL)
+ {
+ // The table data can optionally be passed to this function
+ // either as a database result object or an array
+ if ( ! is_null($table_data))
+ {
+ if (is_object($table_data))
+ {
+ $this->_set_from_object($table_data);
+ }
+ elseif (is_array($table_data))
+ {
+ $set_heading = (count($this->heading) == 0 AND $this->auto_heading == FALSE) ? FALSE : TRUE;
+ $this->_set_from_array($table_data, $set_heading);
+ }
+ }
+
+ // Is there anything to display? No? Smite them!
+ if (count($this->heading) == 0 AND count($this->rows) == 0)
+ {
+ return 'Undefined table data';
+ }
+
+ // Compile and validate the template date
+ $this->_compile_template();
+
+
+ // Build the table!
+
+ $out = $this->template['table_open'];
+ $out .= $this->newline;
+
+ // Add any caption here
+ if ($this->caption)
+ {
+ $out .= $this->newline;
+ $out .= '<caption>' . $this->caption . '</caption>';
+ $out .= $this->newline;
+ }
+
+ // Is there a table heading to display?
+ if (count($this->heading) > 0)
+ {
+ $out .= $this->template['heading_row_start'];
+ $out .= $this->newline;
+
+ foreach($this->heading as $heading)
+ {
+ $out .= $this->template['heading_cell_start'];
+ $out .= $heading;
+ $out .= $this->template['heading_cell_end'];
+ }
+
+ $out .= $this->template['heading_row_end'];
+ $out .= $this->newline;
+ }
+
+ // Build the table rows
+ if (count($this->rows) > 0)
+ {
+ $i = 1;
+ foreach($this->rows as $row)
+ {
+ if ( ! is_array($row))
+ {
+ break;
+ }
+
+ // We use modulus to alternate the row colors
+ $name = (fmod($i++, 2)) ? '' : 'alt_';
+
+ $out .= $this->template['row_'.$name.'start'];
+ $out .= $this->newline;
+
+ foreach($row as $cell)
+ {
+ $out .= $this->template['cell_'.$name.'start'];
+
+ if ($cell === "")
+ {
+ $out .= $this->empty_cells;
+ }
+ else
+ {
+ $out .= $cell;
+ }
+
+ $out .= $this->template['cell_'.$name.'end'];
+ }
+
+ $out .= $this->template['row_'.$name.'end'];
+ $out .= $this->newline;
+ }
+ }
+
+ $out .= $this->template['table_close'];
+
+ return $out;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Clears the table arrays. Useful if multiple tables are being generated
+ *
+ * @access public
+ * @return void
+ */
+ function clear()
+ {
+ $this->rows = array();
+ $this->heading = array();
+ $this->auto_heading = TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set table data from a database result object
+ *
+ * @access public
+ * @param object
+ * @return void
+ */
+ function _set_from_object($query)
+ {
+ if ( ! is_object($query))
+ {
+ return FALSE;
+ }
+
+ // First generate the headings from the table column names
+ if (count($this->heading) == 0)
+ {
+ if ( ! method_exists($query, 'list_fields'))
+ {
+ return FALSE;
+ }
+
+ $this->heading = $query->list_fields();
+ }
+
+ // Next blast through the result array and build out the rows
+
+ if ($query->num_rows() > 0)
+ {
+ foreach ($query->result_array() as $row)
+ {
+ $this->rows[] = $row;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set table data from an array
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function _set_from_array($data, $set_heading = TRUE)
+ {
+ if ( ! is_array($data) OR count($data) == 0)
+ {
+ return FALSE;
+ }
+
+ $i = 0;
+ foreach ($data as $row)
+ {
+ if ( ! is_array($row))
+ {
+ $this->rows[] = $data;
+ break;
+ }
+
+ // If a heading hasn't already been set we'll use the first row of the array as the heading
+ if ($i == 0 AND count($data) > 1 AND count($this->heading) == 0 AND $set_heading == TRUE)
+ {
+ $this->heading = $row;
+ }
+ else
+ {
+ $this->rows[] = $row;
+ }
+
+ $i++;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Compile Template
+ *
+ * @access private
+ * @return void
+ */
+ function _compile_template()
+ {
+ if ($this->template == NULL)
+ {
+ $this->template = $this->_default_template();
+ return;
+ }
+
+ $this->temp = $this->_default_template();
+ foreach (array('table_open','heading_row_start', 'heading_row_end', 'heading_cell_start', 'heading_cell_end', 'row_start', 'row_end', 'cell_start', 'cell_end', 'row_alt_start', 'row_alt_end', 'cell_alt_start', 'cell_alt_end', 'table_close') as $val)
+ {
+ if ( ! isset($this->template[$val]))
+ {
+ $this->template[$val] = $this->temp[$val];
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Default Template
+ *
+ * @access private
+ * @return void
+ */
+ function _default_template()
+ {
+ return array (
+ 'table_open' => '<table border="0" cellpadding="4" cellspacing="0">',
+
+ 'heading_row_start' => '<tr>',
+ 'heading_row_end' => '</tr>',
+ 'heading_cell_start' => '<th>',
+ 'heading_cell_end' => '</th>',
+
+ 'row_start' => '<tr>',
+ 'row_end' => '</tr>',
+ 'cell_start' => '<td>',
+ 'cell_end' => '</td>',
+
+ 'row_alt_start' => '<tr>',
+ 'row_alt_end' => '</tr>',
+ 'cell_alt_start' => '<td>',
+ 'cell_alt_end' => '</td>',
+
+ 'table_close' => '</table>'
+ );
+ }
+
+
+}
+
+
+/* End of file Table.php */
/* Location: ./system/libraries/Table.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Trackback Class\r
- *\r
- * Trackback Sending/Receiving Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Trackbacks\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/trackback.html\r
- */\r
-class CI_Trackback {\r
- \r
- var $time_format = 'local';\r
- var $charset = 'UTF-8';\r
- var $data = array('url' => '', 'title' => '', 'excerpt' => '', 'blog_name' => '', 'charset' => '');\r
- var $convert_ascii = TRUE;\r
- var $response = '';\r
- var $error_msg = array();\r
-\r
- /**\r
- * Constructor\r
- *\r
- * @access public\r
- */\r
- function CI_Trackback()\r
- {\r
- log_message('debug', "Trackback Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Send Trackback\r
- *\r
- * @access public\r
- * @param array\r
- * @return bool\r
- */ \r
- function send($tb_data)\r
- { \r
- if ( ! is_array($tb_data))\r
- {\r
- $this->set_error('The send() method must be passed an array');\r
- return FALSE;\r
- }\r
- \r
- // Pre-process the Trackback Data\r
- foreach (array('url', 'title', 'excerpt', 'blog_name', 'ping_url') as $item)\r
- {\r
- if ( ! isset($tb_data[$item]))\r
- {\r
- $this->set_error('Required item missing: '.$item);\r
- return FALSE;\r
- }\r
- \r
- switch ($item)\r
- {\r
- case 'ping_url' : $$item = $this->extract_urls($tb_data[$item]);\r
- break;\r
- case 'excerpt' : $$item = $this->limit_characters($this->convert_xml(strip_tags(stripslashes($tb_data[$item]))));\r
- break;\r
- case 'url' : $$item = str_replace('-', '-', $this->convert_xml(strip_tags(stripslashes($tb_data[$item]))));\r
- break;\r
- default : $$item = $this->convert_xml(strip_tags(stripslashes($tb_data[$item])));\r
- break;\r
- }\r
-\r
- // Convert High ASCII Characters\r
- if ($this->convert_ascii == TRUE)\r
- {\r
- if ($item == 'excerpt')\r
- {\r
- $$item = $this->convert_ascii($$item);\r
- }\r
- elseif ($item == 'title')\r
- {\r
- $$item = $this->convert_ascii($$item);\r
- }\r
- elseif($item == 'blog_name')\r
- {\r
- $$item = $this->convert_ascii($$item);\r
- }\r
- }\r
- }\r
-\r
- // Build the Trackback data string\r
- $charset = ( ! isset($tb_data['charset'])) ? $this->charset : $tb_data['charset'];\r
- \r
- $data = "url=".rawurlencode($url)."&title=".rawurlencode($title)."&blog_name=".rawurlencode($blog_name)."&excerpt=".rawurlencode($excerpt)."&charset=".rawurlencode($charset);\r
- \r
- // Send Trackback(s)\r
- $return = TRUE;\r
- if (count($ping_url) > 0)\r
- {\r
- foreach ($ping_url as $url)\r
- {\r
- if ($this->process($url, $data) == FALSE)\r
- {\r
- $return = FALSE;\r
- }\r
- } \r
- }\r
-\r
- return $return;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Receive Trackback Data\r
- *\r
- * This function simply validates the incoming TB data.\r
- * It returns false on failure and true on success.\r
- * If the data is valid it is set to the $this->data array\r
- * so that it can be inserted into a database.\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function receive()\r
- { \r
- foreach (array('url', 'title', 'blog_name', 'excerpt') as $val)\r
- {\r
- if ( ! isset($_POST[$val]) OR $_POST[$val] == '')\r
- {\r
- $this->set_error('The following required POST variable is missing: '.$val);\r
- return FALSE;\r
- }\r
- \r
- $this->data['charset'] = ( ! isset($_POST['charset'])) ? 'auto' : strtoupper(trim($_POST['charset']));\r
- \r
- if ($val != 'url' && function_exists('mb_convert_encoding'))\r
- {\r
- $_POST[$val] = mb_convert_encoding($_POST[$val], $this->charset, $this->data['charset']);\r
- }\r
- \r
- $_POST[$val] = ($val != 'url') ? $this->convert_xml(strip_tags($_POST[$val])) : strip_tags($_POST[$val]);\r
- \r
- if ($val == 'excerpt')\r
- {\r
- $_POST['excerpt'] = $this->limit_characters($_POST['excerpt']);\r
- }\r
- \r
- $this->data[$val] = $_POST[$val];\r
- }\r
-\r
- return TRUE;\r
- } \r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Send Trackback Error Message\r
- *\r
- * Allows custom errors to be set. By default it\r
- * sends the "incomplete information" error, as that's\r
- * the most common one.\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function send_error($message = 'Incomplete Information')\r
- {\r
- echo "<?xml version=\"1.0\" encoding=\"utf-8\"?".">\n<response>\n<error>1</error>\n<message>".$message."</message>\n</response>";\r
- exit;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Send Trackback Success Message\r
- *\r
- * This should be called when a trackback has been\r
- * successfully received and inserted.\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function send_success()\r
- {\r
- echo "<?xml version=\"1.0\" encoding=\"utf-8\"?".">\n<response>\n<error>0</error>\n</response>";\r
- exit;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch a particular item\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function data($item)\r
- {\r
- return ( ! isset($this->data[$item])) ? '' : $this->data[$item];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Process Trackback\r
- *\r
- * Opens a socket connection and passes the data to\r
- * the server. Returns true on success, false on failure\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return bool\r
- */ \r
- function process($url, $data)\r
- {\r
- $target = parse_url($url);\r
- \r
- // Open the socket\r
- if ( ! $fp = @fsockopen($target['host'], 80))\r
- {\r
- $this->set_error('Invalid Connection: '.$url);\r
- return FALSE;\r
- }\r
-\r
- // Build the path\r
- $ppath = ( ! isset($target['path'])) ? $url : $target['path'];\r
- \r
- $path = (isset($target['query']) && $target['query'] != "") ? $ppath.'?'.$target['query'] : $ppath;\r
-\r
- // Add the Trackback ID to the data string\r
- if ($id = $this->get_id($url))\r
- {\r
- $data = "tb_id=".$id."&".$data;\r
- }\r
-\r
- // Transfer the data\r
- fputs ($fp, "POST " . $path . " HTTP/1.0\r\n" );\r
- fputs ($fp, "Host: " . $target['host'] . "\r\n" );\r
- fputs ($fp, "Content-type: application/x-www-form-urlencoded\r\n" );\r
- fputs ($fp, "Content-length: " . strlen($data) . "\r\n" );\r
- fputs ($fp, "Connection: close\r\n\r\n" );\r
- fputs ($fp, $data);\r
-\r
- // Was it successful?\r
- $this->response = "";\r
- \r
- while( ! feof($fp))\r
- {\r
- $this->response .= fgets($fp, 128);\r
- }\r
- @fclose($fp);\r
- \r
- if ( ! eregi("<error>0</error>", $this->response))\r
- {\r
- $message = 'An unknown error was encountered';\r
- \r
- if (preg_match("/<message>(.*?)<\/message>/is", $this->response, $match))\r
- {\r
- $message = trim($match['1']);\r
- }\r
- \r
- $this->set_error($message);\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Extract Trackback URLs\r
- *\r
- * This function lets multiple trackbacks be sent.\r
- * It takes a string of URLs (separated by comma or\r
- * space) and puts each URL into an array\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function extract_urls($urls)\r
- { \r
- // Remove the pesky white space and replace with a comma.\r
- $urls = preg_replace("/\s*(\S+)\s*/", "\\1,", $urls);\r
- \r
- // If they use commas get rid of the doubles.\r
- $urls = str_replace(",,", ",", $urls);\r
- \r
- // Remove any comma that might be at the end\r
- if (substr($urls, -1) == ",")\r
- {\r
- $urls = substr($urls, 0, -1);\r
- }\r
- \r
- // Break into an array via commas\r
- $urls = preg_split('/[,]/', $urls);\r
- \r
- // Removes duplicates\r
- $urls = array_unique($urls);\r
- \r
- array_walk($urls, array($this, 'validate_url'));\r
- \r
- return $urls;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Validate URL\r
- *\r
- * Simply adds "http://" if missing\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function validate_url($url)\r
- {\r
- $url = trim($url);\r
-\r
- if (substr($url, 0, 4) != "http")\r
- {\r
- $url = "http://".$url;\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Find the Trackback URL's ID\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function get_id($url)\r
- { \r
- $tb_id = "";\r
- \r
- if (strstr($url, '?'))\r
- {\r
- $tb_array = explode('/', $url);\r
- $tb_end = $tb_array[count($tb_array)-1];\r
- \r
- if ( ! is_numeric($tb_end))\r
- {\r
- $tb_end = $tb_array[count($tb_array)-2];\r
- }\r
- \r
- $tb_array = explode('=', $tb_end);\r
- $tb_id = $tb_array[count($tb_array)-1];\r
- }\r
- else\r
- {\r
- if (ereg("/$", $url))\r
- {\r
- $url = substr($url, 0, -1);\r
- }\r
- \r
- $tb_array = explode('/', $url);\r
- $tb_id = $tb_array[count($tb_array)-1];\r
- \r
- if ( ! is_numeric($tb_id))\r
- {\r
- $tb_id = $tb_array[count($tb_array)-2];\r
- }\r
- } \r
- \r
- if ( ! preg_match ("/^([0-9]+)$/", $tb_id))\r
- {\r
- return false;\r
- }\r
- else\r
- {\r
- return $tb_id;\r
- } \r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Convert Reserved XML characters to Entities\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function convert_xml($str)\r
- {\r
- $temp = '__TEMP_AMPERSANDS__';\r
- \r
- $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str);\r
- $str = preg_replace("/&(\w+);/", "$temp\\1;", $str);\r
- \r
- $str = str_replace(array("&","<",">","\"", "'", "-"),\r
- array("&", "<", ">", """, "'", "-"),\r
- $str);\r
- \r
- $str = preg_replace("/$temp(\d+);/","&#\\1;",$str);\r
- $str = preg_replace("/$temp(\w+);/","&\\1;", $str);\r
- \r
- return $str;\r
- } \r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Character limiter\r
- *\r
- * Limits the string based on the character count. Will preserve complete words.\r
- *\r
- * @access public\r
- * @param string\r
- * @param integer\r
- * @param string\r
- * @return string\r
- */\r
- function limit_characters($str, $n = 500, $end_char = '…')\r
- {\r
- if (strlen($str) < $n)\r
- {\r
- return $str;\r
- }\r
-\r
- $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));\r
- \r
- if (strlen($str) <= $n)\r
- {\r
- return $str;\r
- }\r
- \r
- $out = "";\r
- foreach (explode(' ', trim($str)) as $val)\r
- {\r
- $out .= $val.' '; \r
- if (strlen($out) >= $n)\r
- {\r
- return trim($out).$end_char;\r
- } \r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * High ASCII to Entities\r
- *\r
- * Converts Hight ascii text and MS Word special chars\r
- * to character entities\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function convert_ascii($str)\r
- {\r
- $count = 1;\r
- $out = '';\r
- $temp = array();\r
- \r
- for ($i = 0, $s = strlen($str); $i < $s; $i++)\r
- {\r
- $ordinal = ord($str[$i]);\r
- \r
- if ($ordinal < 128)\r
- {\r
- $out .= $str[$i]; \r
- }\r
- else\r
- {\r
- if (count($temp) == 0)\r
- {\r
- $count = ($ordinal < 224) ? 2 : 3;\r
- }\r
- \r
- $temp[] = $ordinal;\r
- \r
- if (count($temp) == $count)\r
- {\r
- $number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64);\r
- \r
- $out .= '&#'.$number.';';\r
- $count = 1;\r
- $temp = array();\r
- }\r
- }\r
- }\r
- \r
- return $out;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set error message\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_error($msg)\r
- {\r
- log_message('error', $msg);\r
- $this->error_msg[] = $msg;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Show error messages\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */ \r
- function display_errors($open = '<p>', $close = '</p>')\r
- { \r
- $str = '';\r
- foreach ($this->error_msg as $val)\r
- {\r
- $str .= $open.$val.$close;\r
- }\r
- \r
- return $str;\r
- }\r
-\r
-}\r
-// END Trackback Class\r
-\r
-/* End of file Trackback.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Trackback Class
+ *
+ * Trackback Sending/Receiving Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Trackbacks
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/trackback.html
+ */
+class CI_Trackback {
+
+ var $time_format = 'local';
+ var $charset = 'UTF-8';
+ var $data = array('url' => '', 'title' => '', 'excerpt' => '', 'blog_name' => '', 'charset' => '');
+ var $convert_ascii = TRUE;
+ var $response = '';
+ var $error_msg = array();
+
+ /**
+ * Constructor
+ *
+ * @access public
+ */
+ function CI_Trackback()
+ {
+ log_message('debug', "Trackback Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Send Trackback
+ *
+ * @access public
+ * @param array
+ * @return bool
+ */
+ function send($tb_data)
+ {
+ if ( ! is_array($tb_data))
+ {
+ $this->set_error('The send() method must be passed an array');
+ return FALSE;
+ }
+
+ // Pre-process the Trackback Data
+ foreach (array('url', 'title', 'excerpt', 'blog_name', 'ping_url') as $item)
+ {
+ if ( ! isset($tb_data[$item]))
+ {
+ $this->set_error('Required item missing: '.$item);
+ return FALSE;
+ }
+
+ switch ($item)
+ {
+ case 'ping_url' : $$item = $this->extract_urls($tb_data[$item]);
+ break;
+ case 'excerpt' : $$item = $this->limit_characters($this->convert_xml(strip_tags(stripslashes($tb_data[$item]))));
+ break;
+ case 'url' : $$item = str_replace('-', '-', $this->convert_xml(strip_tags(stripslashes($tb_data[$item]))));
+ break;
+ default : $$item = $this->convert_xml(strip_tags(stripslashes($tb_data[$item])));
+ break;
+ }
+
+ // Convert High ASCII Characters
+ if ($this->convert_ascii == TRUE)
+ {
+ if ($item == 'excerpt')
+ {
+ $$item = $this->convert_ascii($$item);
+ }
+ elseif ($item == 'title')
+ {
+ $$item = $this->convert_ascii($$item);
+ }
+ elseif($item == 'blog_name')
+ {
+ $$item = $this->convert_ascii($$item);
+ }
+ }
+ }
+
+ // Build the Trackback data string
+ $charset = ( ! isset($tb_data['charset'])) ? $this->charset : $tb_data['charset'];
+
+ $data = "url=".rawurlencode($url)."&title=".rawurlencode($title)."&blog_name=".rawurlencode($blog_name)."&excerpt=".rawurlencode($excerpt)."&charset=".rawurlencode($charset);
+
+ // Send Trackback(s)
+ $return = TRUE;
+ if (count($ping_url) > 0)
+ {
+ foreach ($ping_url as $url)
+ {
+ if ($this->process($url, $data) == FALSE)
+ {
+ $return = FALSE;
+ }
+ }
+ }
+
+ return $return;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Receive Trackback Data
+ *
+ * This function simply validates the incoming TB data.
+ * It returns false on failure and true on success.
+ * If the data is valid it is set to the $this->data array
+ * so that it can be inserted into a database.
+ *
+ * @access public
+ * @return bool
+ */
+ function receive()
+ {
+ foreach (array('url', 'title', 'blog_name', 'excerpt') as $val)
+ {
+ if ( ! isset($_POST[$val]) OR $_POST[$val] == '')
+ {
+ $this->set_error('The following required POST variable is missing: '.$val);
+ return FALSE;
+ }
+
+ $this->data['charset'] = ( ! isset($_POST['charset'])) ? 'auto' : strtoupper(trim($_POST['charset']));
+
+ if ($val != 'url' && function_exists('mb_convert_encoding'))
+ {
+ $_POST[$val] = mb_convert_encoding($_POST[$val], $this->charset, $this->data['charset']);
+ }
+
+ $_POST[$val] = ($val != 'url') ? $this->convert_xml(strip_tags($_POST[$val])) : strip_tags($_POST[$val]);
+
+ if ($val == 'excerpt')
+ {
+ $_POST['excerpt'] = $this->limit_characters($_POST['excerpt']);
+ }
+
+ $this->data[$val] = $_POST[$val];
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Send Trackback Error Message
+ *
+ * Allows custom errors to be set. By default it
+ * sends the "incomplete information" error, as that's
+ * the most common one.
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function send_error($message = 'Incomplete Information')
+ {
+ echo "<?xml version=\"1.0\" encoding=\"utf-8\"?".">\n<response>\n<error>1</error>\n<message>".$message."</message>\n</response>";
+ exit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Send Trackback Success Message
+ *
+ * This should be called when a trackback has been
+ * successfully received and inserted.
+ *
+ * @access public
+ * @return void
+ */
+ function send_success()
+ {
+ echo "<?xml version=\"1.0\" encoding=\"utf-8\"?".">\n<response>\n<error>0</error>\n</response>";
+ exit;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch a particular item
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function data($item)
+ {
+ return ( ! isset($this->data[$item])) ? '' : $this->data[$item];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Process Trackback
+ *
+ * Opens a socket connection and passes the data to
+ * the server. Returns true on success, false on failure
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return bool
+ */
+ function process($url, $data)
+ {
+ $target = parse_url($url);
+
+ // Open the socket
+ if ( ! $fp = @fsockopen($target['host'], 80))
+ {
+ $this->set_error('Invalid Connection: '.$url);
+ return FALSE;
+ }
+
+ // Build the path
+ $ppath = ( ! isset($target['path'])) ? $url : $target['path'];
+
+ $path = (isset($target['query']) && $target['query'] != "") ? $ppath.'?'.$target['query'] : $ppath;
+
+ // Add the Trackback ID to the data string
+ if ($id = $this->get_id($url))
+ {
+ $data = "tb_id=".$id."&".$data;
+ }
+
+ // Transfer the data
+ fputs ($fp, "POST " . $path . " HTTP/1.0\r\n" );
+ fputs ($fp, "Host: " . $target['host'] . "\r\n" );
+ fputs ($fp, "Content-type: application/x-www-form-urlencoded\r\n" );
+ fputs ($fp, "Content-length: " . strlen($data) . "\r\n" );
+ fputs ($fp, "Connection: close\r\n\r\n" );
+ fputs ($fp, $data);
+
+ // Was it successful?
+ $this->response = "";
+
+ while( ! feof($fp))
+ {
+ $this->response .= fgets($fp, 128);
+ }
+ @fclose($fp);
+
+ if ( ! eregi("<error>0</error>", $this->response))
+ {
+ $message = 'An unknown error was encountered';
+
+ if (preg_match("/<message>(.*?)<\/message>/is", $this->response, $match))
+ {
+ $message = trim($match['1']);
+ }
+
+ $this->set_error($message);
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Extract Trackback URLs
+ *
+ * This function lets multiple trackbacks be sent.
+ * It takes a string of URLs (separated by comma or
+ * space) and puts each URL into an array
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function extract_urls($urls)
+ {
+ // Remove the pesky white space and replace with a comma.
+ $urls = preg_replace("/\s*(\S+)\s*/", "\\1,", $urls);
+
+ // If they use commas get rid of the doubles.
+ $urls = str_replace(",,", ",", $urls);
+
+ // Remove any comma that might be at the end
+ if (substr($urls, -1) == ",")
+ {
+ $urls = substr($urls, 0, -1);
+ }
+
+ // Break into an array via commas
+ $urls = preg_split('/[,]/', $urls);
+
+ // Removes duplicates
+ $urls = array_unique($urls);
+
+ array_walk($urls, array($this, 'validate_url'));
+
+ return $urls;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Validate URL
+ *
+ * Simply adds "http://" if missing
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function validate_url($url)
+ {
+ $url = trim($url);
+
+ if (substr($url, 0, 4) != "http")
+ {
+ $url = "http://".$url;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Find the Trackback URL's ID
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function get_id($url)
+ {
+ $tb_id = "";
+
+ if (strstr($url, '?'))
+ {
+ $tb_array = explode('/', $url);
+ $tb_end = $tb_array[count($tb_array)-1];
+
+ if ( ! is_numeric($tb_end))
+ {
+ $tb_end = $tb_array[count($tb_array)-2];
+ }
+
+ $tb_array = explode('=', $tb_end);
+ $tb_id = $tb_array[count($tb_array)-1];
+ }
+ else
+ {
+ if (ereg("/$", $url))
+ {
+ $url = substr($url, 0, -1);
+ }
+
+ $tb_array = explode('/', $url);
+ $tb_id = $tb_array[count($tb_array)-1];
+
+ if ( ! is_numeric($tb_id))
+ {
+ $tb_id = $tb_array[count($tb_array)-2];
+ }
+ }
+
+ if ( ! preg_match ("/^([0-9]+)$/", $tb_id))
+ {
+ return false;
+ }
+ else
+ {
+ return $tb_id;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Convert Reserved XML characters to Entities
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function convert_xml($str)
+ {
+ $temp = '__TEMP_AMPERSANDS__';
+
+ $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str);
+ $str = preg_replace("/&(\w+);/", "$temp\\1;", $str);
+
+ $str = str_replace(array("&","<",">","\"", "'", "-"),
+ array("&", "<", ">", """, "'", "-"),
+ $str);
+
+ $str = preg_replace("/$temp(\d+);/","&#\\1;",$str);
+ $str = preg_replace("/$temp(\w+);/","&\\1;", $str);
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Character limiter
+ *
+ * Limits the string based on the character count. Will preserve complete words.
+ *
+ * @access public
+ * @param string
+ * @param integer
+ * @param string
+ * @return string
+ */
+ function limit_characters($str, $n = 500, $end_char = '…')
+ {
+ if (strlen($str) < $n)
+ {
+ return $str;
+ }
+
+ $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
+
+ if (strlen($str) <= $n)
+ {
+ return $str;
+ }
+
+ $out = "";
+ foreach (explode(' ', trim($str)) as $val)
+ {
+ $out .= $val.' ';
+ if (strlen($out) >= $n)
+ {
+ return trim($out).$end_char;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * High ASCII to Entities
+ *
+ * Converts Hight ascii text and MS Word special chars
+ * to character entities
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function convert_ascii($str)
+ {
+ $count = 1;
+ $out = '';
+ $temp = array();
+
+ for ($i = 0, $s = strlen($str); $i < $s; $i++)
+ {
+ $ordinal = ord($str[$i]);
+
+ if ($ordinal < 128)
+ {
+ $out .= $str[$i];
+ }
+ else
+ {
+ if (count($temp) == 0)
+ {
+ $count = ($ordinal < 224) ? 2 : 3;
+ }
+
+ $temp[] = $ordinal;
+
+ if (count($temp) == $count)
+ {
+ $number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64);
+
+ $out .= '&#'.$number.';';
+ $count = 1;
+ $temp = array();
+ }
+ }
+ }
+
+ return $out;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set error message
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_error($msg)
+ {
+ log_message('error', $msg);
+ $this->error_msg[] = $msg;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Show error messages
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function display_errors($open = '<p>', $close = '</p>')
+ {
+ $str = '';
+ foreach ($this->error_msg as $val)
+ {
+ $str .= $open.$val.$close;
+ }
+
+ return $str;
+ }
+
+}
+// END Trackback Class
+
+/* End of file Trackback.php */
/* Location: ./system/libraries/Trackback.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * URI Class\r
- *\r
- * Parses URIs and determines routing\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category URI\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/uri.html\r
- */\r
-class CI_URI {\r
-\r
- var $keyval = array();\r
- var $uri_string;\r
- var $segments = array();\r
- var $rsegments = array();\r
-\r
- /**\r
- * Constructor\r
- *\r
- * Simply globalizes the $RTR object. The front\r
- * loads the Router class early on so it's not available\r
- * normally as other classes are.\r
- *\r
- * @access public\r
- */ \r
- function CI_URI()\r
- {\r
- $this->config =& load_class('Config');\r
- log_message('debug', "URI Class Initialized");\r
- }\r
- \r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get the URI String\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _fetch_uri_string()\r
- {\r
- if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')\r
- {\r
- // If the URL has a question mark then it's simplest to just\r
- // build the URI string from the zero index of the $_GET array.\r
- // This avoids having to deal with $_SERVER variables, which\r
- // can be unreliable in some environments\r
- if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '')\r
- {\r
- $this->uri_string = key($_GET);\r
- return;\r
- }\r
- \r
- // Is there a PATH_INFO variable?\r
- // Note: some servers seem to have trouble with getenv() so we'll test it two ways \r
- $path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO'); \r
- if (trim($path, '/') != '' && $path != "/".SELF)\r
- {\r
- $this->uri_string = $path;\r
- return;\r
- }\r
- \r
- // No PATH_INFO?... What about QUERY_STRING?\r
- $path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); \r
- if (trim($path, '/') != '')\r
- {\r
- $this->uri_string = $path;\r
- return;\r
- }\r
- \r
- // No QUERY_STRING?... Maybe the ORIG_PATH_INFO variable exists?\r
- $path = (isset($_SERVER['ORIG_PATH_INFO'])) ? $_SERVER['ORIG_PATH_INFO'] : @getenv('ORIG_PATH_INFO'); \r
- if (trim($path, '/') != '' && $path != "/".SELF)\r
- {\r
- // remove path and script information so we have good URI data\r
- $this->uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $path);\r
- return;\r
- }\r
-\r
- // We've exhausted all our options...\r
- $this->uri_string = '';\r
- }\r
- else\r
- {\r
- $uri = strtoupper($this->config->item('uri_protocol'));\r
- \r
- if ($uri == 'REQUEST_URI')\r
- {\r
- $this->uri_string = $this->_parse_request_uri();\r
- return;\r
- }\r
- \r
- $this->uri_string = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri);\r
- }\r
- \r
- // If the URI contains only a slash we'll kill it\r
- if ($this->uri_string == '/')\r
- {\r
- $this->uri_string = '';\r
- } \r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Parse the REQUEST_URI\r
- *\r
- * Due to the way REQUEST_URI works it usually contains path info\r
- * that makes it unusable as URI data. We'll trim off the unnecessary\r
- * data, hopefully arriving at a valid URI that we can use.\r
- *\r
- * @access private\r
- * @return string\r
- */ \r
- function _parse_request_uri()\r
- {\r
- if ( ! isset($_SERVER['REQUEST_URI']) OR $_SERVER['REQUEST_URI'] == '')\r
- {\r
- return '';\r
- }\r
- \r
- $request_uri = preg_replace("|/(.*)|", "\\1", str_replace("\\", "/", $_SERVER['REQUEST_URI']));\r
-\r
- if ($request_uri == '' OR $request_uri == SELF)\r
- {\r
- return '';\r
- }\r
- \r
- $fc_path = FCPATH; \r
- if (strpos($request_uri, '?') !== FALSE)\r
- {\r
- $fc_path .= '?';\r
- }\r
- \r
- $parsed_uri = explode("/", $request_uri);\r
- \r
- $i = 0;\r
- foreach(explode("/", $fc_path) as $segment)\r
- {\r
- if (isset($parsed_uri[$i]) && $segment == $parsed_uri[$i])\r
- {\r
- $i++;\r
- }\r
- }\r
- \r
- $parsed_uri = implode("/", array_slice($parsed_uri, $i));\r
- \r
- if ($parsed_uri != '')\r
- {\r
- $parsed_uri = '/'.$parsed_uri;\r
- }\r
-\r
- return $parsed_uri;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Filter segments for malicious characters\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */ \r
- function _filter_uri($str)\r
- {\r
- if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)\r
- {\r
- if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))\r
- {\r
- exit('The URI you submitted has disallowed characters.');\r
- }\r
- } \r
- \r
- // Convert programatic characters to entities\r
- $bad = array('$', '(', ')', '%28', '%29');\r
- $good = array('$', '(', ')', '(', ')');\r
- \r
- return str_replace($bad, $good, $str);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Remove the suffix from the URL if needed\r
- *\r
- * @access private\r
- * @return void\r
- */ \r
- function _remove_url_suffix()\r
- {\r
- if ($this->config->item('url_suffix') != "")\r
- {\r
- $this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string);\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Explode the URI Segments. The individual segments will\r
- * be stored in the $this->segments array. \r
- *\r
- * @access private\r
- * @return void\r
- */ \r
- function _explode_segments()\r
- {\r
- foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)\r
- {\r
- // Filter segments for security\r
- $val = trim($this->_filter_uri($val));\r
- \r
- if ($val != '')\r
- {\r
- $this->segments[] = $val;\r
- }\r
- }\r
- }\r
- \r
- // -------------------------------------------------------------------- \r
- /**\r
- * Re-index Segments\r
- *\r
- * This function re-indexes the $this->segment array so that it\r
- * starts at 1 rather than 0. Doing so makes it simpler to\r
- * use functions like $this->uri->segment(n) since there is\r
- * a 1:1 relationship between the segment array and the actual segments.\r
- *\r
- * @access private\r
- * @return void\r
- */ \r
- function _reindex_segments()\r
- {\r
- array_unshift($this->segments, NULL);\r
- array_unshift($this->rsegments, NULL);\r
- unset($this->segments[0]);\r
- unset($this->rsegments[0]);\r
- } \r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch a URI Segment\r
- *\r
- * This function returns the URI segment based on the number provided.\r
- *\r
- * @access public\r
- * @param integer\r
- * @param bool\r
- * @return string\r
- */\r
- function segment($n, $no_result = FALSE)\r
- {\r
- return ( ! isset($this->segments[$n])) ? $no_result : $this->segments[$n];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch a URI "routed" Segment\r
- *\r
- * This function returns the re-routed URI segment (assuming routing rules are used)\r
- * based on the number provided. If there is no routing this function returns the\r
- * same result as $this->segment()\r
- *\r
- * @access public\r
- * @param integer\r
- * @param bool\r
- * @return string\r
- */\r
- function rsegment($n, $no_result = FALSE)\r
- {\r
- return ( ! isset($this->rsegments[$n])) ? $no_result : $this->rsegments[$n];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Generate a key value pair from the URI string\r
- *\r
- * This function generates and associative array of URI data starting\r
- * at the supplied segment. For example, if this is your URI:\r
- *\r
- * example.com/user/search/name/joe/location/UK/gender/male\r
- *\r
- * You can use this function to generate an array with this prototype:\r
- *\r
- * array (\r
- * name => joe\r
- * location => UK\r
- * gender => male\r
- * )\r
- *\r
- * @access public\r
- * @param integer the starting segment number\r
- * @param array an array of default values\r
- * @return array\r
- */\r
- function uri_to_assoc($n = 3, $default = array())\r
- {\r
- return $this->_uri_to_assoc($n, $default, 'segment');\r
- }\r
- /**\r
- * Identical to above only it uses the re-routed segment array\r
- *\r
- */\r
- function ruri_to_assoc($n = 3, $default = array())\r
- {\r
- return $this->_uri_to_assoc($n, $default, 'rsegment');\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Generate a key value pair from the URI string or Re-routed URI string\r
- *\r
- * @access private\r
- * @param integer the starting segment number\r
- * @param array an array of default values\r
- * @param string which array we should use\r
- * @return array\r
- */\r
- function _uri_to_assoc($n = 3, $default = array(), $which = 'segment')\r
- {\r
- if ($which == 'segment')\r
- {\r
- $total_segments = 'total_segments';\r
- $segment_array = 'segment_array';\r
- }\r
- else\r
- {\r
- $total_segments = 'total_rsegments';\r
- $segment_array = 'rsegment_array';\r
- }\r
- \r
- if ( ! is_numeric($n))\r
- {\r
- return $default;\r
- }\r
- \r
- if (isset($this->keyval[$n]))\r
- {\r
- return $this->keyval[$n];\r
- }\r
- \r
- if ($this->$total_segments() < $n)\r
- {\r
- if (count($default) == 0)\r
- {\r
- return array();\r
- }\r
- \r
- $retval = array();\r
- foreach ($default as $val)\r
- {\r
- $retval[$val] = FALSE;\r
- } \r
- return $retval;\r
- }\r
-\r
- $segments = array_slice($this->$segment_array(), ($n - 1));\r
-\r
- $i = 0;\r
- $lastval = '';\r
- $retval = array();\r
- foreach ($segments as $seg)\r
- {\r
- if ($i % 2)\r
- {\r
- $retval[$lastval] = $seg;\r
- }\r
- else\r
- {\r
- $retval[$seg] = FALSE;\r
- $lastval = $seg;\r
- }\r
- \r
- $i++;\r
- }\r
-\r
- if (count($default) > 0)\r
- {\r
- foreach ($default as $val)\r
- {\r
- if ( ! array_key_exists($val, $retval))\r
- {\r
- $retval[$val] = FALSE;\r
- }\r
- }\r
- }\r
-\r
- // Cache the array for reuse\r
- $this->keyval[$n] = $retval;\r
- return $retval;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Generate a URI string from an associative array\r
- *\r
- *\r
- * @access public\r
- * @param array an associative array of key/values\r
- * @return array\r
- */ \r
- function assoc_to_uri($array)\r
- { \r
- $temp = array();\r
- foreach ((array)$array as $key => $val)\r
- {\r
- $temp[] = $key;\r
- $temp[] = $val;\r
- }\r
- \r
- return implode('/', $temp);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch a URI Segment and add a trailing slash\r
- *\r
- * @access public\r
- * @param integer\r
- * @param string\r
- * @return string\r
- */\r
- function slash_segment($n, $where = 'trailing')\r
- {\r
- return $this->_slash_segment($n, $where, 'segment');\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch a URI Segment and add a trailing slash\r
- *\r
- * @access public\r
- * @param integer\r
- * @param string\r
- * @return string\r
- */\r
- function slash_rsegment($n, $where = 'trailing')\r
- {\r
- return $this->_slash_segment($n, $where, 'rsegment');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch a URI Segment and add a trailing slash - helper function\r
- *\r
- * @access private\r
- * @param integer\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- function _slash_segment($n, $where = 'trailing', $which = 'segment')\r
- { \r
- if ($where == 'trailing')\r
- {\r
- $trailing = '/';\r
- $leading = '';\r
- }\r
- elseif ($where == 'leading')\r
- {\r
- $leading = '/';\r
- $trailing = '';\r
- }\r
- else\r
- {\r
- $leading = '/';\r
- $trailing = '/';\r
- }\r
- return $leading.$this->$which($n).$trailing;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Segment Array\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function segment_array()\r
- {\r
- return $this->segments;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Routed Segment Array\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function rsegment_array()\r
- {\r
- return $this->rsegments;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Total number of segments\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function total_segments()\r
- {\r
- return count($this->segments);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Total number of routed segments\r
- *\r
- * @access public\r
- * @return integer\r
- */\r
- function total_rsegments()\r
- {\r
- return count($this->rsegments);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch the entire URI string\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function uri_string()\r
- {\r
- return $this->uri_string;\r
- }\r
-\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Fetch the entire Re-routed URI string\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function ruri_string()\r
- {\r
- return '/'.implode('/', $this->rsegment_array()).'/';\r
- }\r
-\r
-}\r
-// END URI Class\r
-\r
-/* End of file URI.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * URI Class
+ *
+ * Parses URIs and determines routing
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category URI
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/uri.html
+ */
+class CI_URI {
+
+ var $keyval = array();
+ var $uri_string;
+ var $segments = array();
+ var $rsegments = array();
+
+ /**
+ * Constructor
+ *
+ * Simply globalizes the $RTR object. The front
+ * loads the Router class early on so it's not available
+ * normally as other classes are.
+ *
+ * @access public
+ */
+ function CI_URI()
+ {
+ $this->config =& load_class('Config');
+ log_message('debug', "URI Class Initialized");
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get the URI String
+ *
+ * @access private
+ * @return string
+ */
+ function _fetch_uri_string()
+ {
+ if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')
+ {
+ // If the URL has a question mark then it's simplest to just
+ // build the URI string from the zero index of the $_GET array.
+ // This avoids having to deal with $_SERVER variables, which
+ // can be unreliable in some environments
+ if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '')
+ {
+ $this->uri_string = key($_GET);
+ return;
+ }
+
+ // Is there a PATH_INFO variable?
+ // Note: some servers seem to have trouble with getenv() so we'll test it two ways
+ $path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');
+ if (trim($path, '/') != '' && $path != "/".SELF)
+ {
+ $this->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->uri_string = $path;
+ return;
+ }
+
+ // No QUERY_STRING?... Maybe the ORIG_PATH_INFO variable exists?
+ $path = (isset($_SERVER['ORIG_PATH_INFO'])) ? $_SERVER['ORIG_PATH_INFO'] : @getenv('ORIG_PATH_INFO');
+ if (trim($path, '/') != '' && $path != "/".SELF)
+ {
+ // remove path and script information so we have good URI data
+ $this->uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $path);
+ return;
+ }
+
+ // We've exhausted all our options...
+ $this->uri_string = '';
+ }
+ else
+ {
+ $uri = strtoupper($this->config->item('uri_protocol'));
+
+ if ($uri == 'REQUEST_URI')
+ {
+ $this->uri_string = $this->_parse_request_uri();
+ return;
+ }
+
+ $this->uri_string = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri);
+ }
+
+ // If the URI contains only a slash we'll kill it
+ if ($this->uri_string == '/')
+ {
+ $this->uri_string = '';
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Parse the REQUEST_URI
+ *
+ * Due to the way REQUEST_URI works it usually contains path info
+ * that makes it unusable as URI data. We'll trim off the unnecessary
+ * data, hopefully arriving at a valid URI that we can use.
+ *
+ * @access private
+ * @return string
+ */
+ function _parse_request_uri()
+ {
+ if ( ! isset($_SERVER['REQUEST_URI']) OR $_SERVER['REQUEST_URI'] == '')
+ {
+ return '';
+ }
+
+ $request_uri = preg_replace("|/(.*)|", "\\1", str_replace("\\", "/", $_SERVER['REQUEST_URI']));
+
+ if ($request_uri == '' OR $request_uri == SELF)
+ {
+ return '';
+ }
+
+ $fc_path = FCPATH;
+ if (strpos($request_uri, '?') !== FALSE)
+ {
+ $fc_path .= '?';
+ }
+
+ $parsed_uri = explode("/", $request_uri);
+
+ $i = 0;
+ foreach(explode("/", $fc_path) as $segment)
+ {
+ if (isset($parsed_uri[$i]) && $segment == $parsed_uri[$i])
+ {
+ $i++;
+ }
+ }
+
+ $parsed_uri = implode("/", array_slice($parsed_uri, $i));
+
+ if ($parsed_uri != '')
+ {
+ $parsed_uri = '/'.$parsed_uri;
+ }
+
+ return $parsed_uri;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Filter segments for malicious characters
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _filter_uri($str)
+ {
+ if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
+ {
+ if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
+ {
+ exit('The URI you submitted has disallowed characters.');
+ }
+ }
+
+ // Convert programatic characters to entities
+ $bad = array('$', '(', ')', '%28', '%29');
+ $good = array('$', '(', ')', '(', ')');
+
+ return str_replace($bad, $good, $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Remove the suffix from the URL if needed
+ *
+ * @access private
+ * @return void
+ */
+ function _remove_url_suffix()
+ {
+ if ($this->config->item('url_suffix') != "")
+ {
+ $this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Explode the URI Segments. The individual segments will
+ * be stored in the $this->segments array.
+ *
+ * @access private
+ * @return void
+ */
+ function _explode_segments()
+ {
+ foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
+ {
+ // Filter segments for security
+ $val = trim($this->_filter_uri($val));
+
+ if ($val != '')
+ {
+ $this->segments[] = $val;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+ /**
+ * Re-index Segments
+ *
+ * This function re-indexes the $this->segment array so that it
+ * starts at 1 rather than 0. Doing so makes it simpler to
+ * use functions like $this->uri->segment(n) since there is
+ * a 1:1 relationship between the segment array and the actual segments.
+ *
+ * @access private
+ * @return void
+ */
+ function _reindex_segments()
+ {
+ array_unshift($this->segments, NULL);
+ array_unshift($this->rsegments, NULL);
+ unset($this->segments[0]);
+ unset($this->rsegments[0]);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch a URI Segment
+ *
+ * This function returns the URI segment based on the number provided.
+ *
+ * @access public
+ * @param integer
+ * @param bool
+ * @return string
+ */
+ function segment($n, $no_result = FALSE)
+ {
+ return ( ! isset($this->segments[$n])) ? $no_result : $this->segments[$n];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch a URI "routed" Segment
+ *
+ * This function returns the re-routed URI segment (assuming routing rules are used)
+ * based on the number provided. If there is no routing this function returns the
+ * same result as $this->segment()
+ *
+ * @access public
+ * @param integer
+ * @param bool
+ * @return string
+ */
+ function rsegment($n, $no_result = FALSE)
+ {
+ return ( ! isset($this->rsegments[$n])) ? $no_result : $this->rsegments[$n];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate a key value pair from the URI string
+ *
+ * This function generates and associative array of URI data starting
+ * at the supplied segment. For example, if this is your URI:
+ *
+ * example.com/user/search/name/joe/location/UK/gender/male
+ *
+ * You can use this function to generate an array with this prototype:
+ *
+ * array (
+ * name => joe
+ * location => UK
+ * gender => male
+ * )
+ *
+ * @access public
+ * @param integer the starting segment number
+ * @param array an array of default values
+ * @return array
+ */
+ function uri_to_assoc($n = 3, $default = array())
+ {
+ return $this->_uri_to_assoc($n, $default, 'segment');
+ }
+ /**
+ * Identical to above only it uses the re-routed segment array
+ *
+ */
+ function ruri_to_assoc($n = 3, $default = array())
+ {
+ return $this->_uri_to_assoc($n, $default, 'rsegment');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate a key value pair from the URI string or Re-routed URI string
+ *
+ * @access private
+ * @param integer the starting segment number
+ * @param array an array of default values
+ * @param string which array we should use
+ * @return array
+ */
+ function _uri_to_assoc($n = 3, $default = array(), $which = 'segment')
+ {
+ if ($which == 'segment')
+ {
+ $total_segments = 'total_segments';
+ $segment_array = 'segment_array';
+ }
+ else
+ {
+ $total_segments = 'total_rsegments';
+ $segment_array = 'rsegment_array';
+ }
+
+ if ( ! is_numeric($n))
+ {
+ return $default;
+ }
+
+ if (isset($this->keyval[$n]))
+ {
+ return $this->keyval[$n];
+ }
+
+ if ($this->$total_segments() < $n)
+ {
+ if (count($default) == 0)
+ {
+ return array();
+ }
+
+ $retval = array();
+ foreach ($default as $val)
+ {
+ $retval[$val] = FALSE;
+ }
+ return $retval;
+ }
+
+ $segments = array_slice($this->$segment_array(), ($n - 1));
+
+ $i = 0;
+ $lastval = '';
+ $retval = array();
+ foreach ($segments as $seg)
+ {
+ if ($i % 2)
+ {
+ $retval[$lastval] = $seg;
+ }
+ else
+ {
+ $retval[$seg] = FALSE;
+ $lastval = $seg;
+ }
+
+ $i++;
+ }
+
+ if (count($default) > 0)
+ {
+ foreach ($default as $val)
+ {
+ if ( ! array_key_exists($val, $retval))
+ {
+ $retval[$val] = FALSE;
+ }
+ }
+ }
+
+ // Cache the array for reuse
+ $this->keyval[$n] = $retval;
+ return $retval;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate a URI string from an associative array
+ *
+ *
+ * @access public
+ * @param array an associative array of key/values
+ * @return array
+ */
+ function assoc_to_uri($array)
+ {
+ $temp = array();
+ foreach ((array)$array as $key => $val)
+ {
+ $temp[] = $key;
+ $temp[] = $val;
+ }
+
+ return implode('/', $temp);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch a URI Segment and add a trailing slash
+ *
+ * @access public
+ * @param integer
+ * @param string
+ * @return string
+ */
+ function slash_segment($n, $where = 'trailing')
+ {
+ return $this->_slash_segment($n, $where, 'segment');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch a URI Segment and add a trailing slash
+ *
+ * @access public
+ * @param integer
+ * @param string
+ * @return string
+ */
+ function slash_rsegment($n, $where = 'trailing')
+ {
+ return $this->_slash_segment($n, $where, 'rsegment');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch a URI Segment and add a trailing slash - helper function
+ *
+ * @access private
+ * @param integer
+ * @param string
+ * @param string
+ * @return string
+ */
+ function _slash_segment($n, $where = 'trailing', $which = 'segment')
+ {
+ if ($where == 'trailing')
+ {
+ $trailing = '/';
+ $leading = '';
+ }
+ elseif ($where == 'leading')
+ {
+ $leading = '/';
+ $trailing = '';
+ }
+ else
+ {
+ $leading = '/';
+ $trailing = '/';
+ }
+ return $leading.$this->$which($n).$trailing;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Segment Array
+ *
+ * @access public
+ * @return array
+ */
+ function segment_array()
+ {
+ return $this->segments;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Routed Segment Array
+ *
+ * @access public
+ * @return array
+ */
+ function rsegment_array()
+ {
+ return $this->rsegments;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Total number of segments
+ *
+ * @access public
+ * @return integer
+ */
+ function total_segments()
+ {
+ return count($this->segments);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Total number of routed segments
+ *
+ * @access public
+ * @return integer
+ */
+ function total_rsegments()
+ {
+ return count($this->rsegments);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch the entire URI string
+ *
+ * @access public
+ * @return string
+ */
+ function uri_string()
+ {
+ return $this->uri_string;
+ }
+
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Fetch the entire Re-routed URI string
+ *
+ * @access public
+ * @return string
+ */
+ function ruri_string()
+ {
+ return '/'.implode('/', $this->rsegment_array()).'/';
+ }
+
+}
+// END URI Class
+
+/* End of file URI.php */
/* Location: ./system/libraries/URI.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.3.1\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Unit Testing Class\r
- *\r
- * Simple testing class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category UnitTesting\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/uri.html\r
- */\r
-class CI_Unit_test {\r
-\r
- var $active = TRUE;\r
- var $results = array();\r
- var $strict = FALSE;\r
- var $_template = NULL;\r
- var $_template_rows = NULL;\r
-\r
- function CI_Unit_test()\r
- {\r
- log_message('debug', "Unit Testing Class Initialized");\r
- } \r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Run the tests\r
- *\r
- * Runs the supplied tests\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param mixed\r
- * @param string\r
- * @return string\r
- */ \r
- function run($test, $expected = TRUE, $test_name = 'undefined')\r
- {\r
- if ($this->active == FALSE)\r
- {\r
- return FALSE;\r
- }\r
- \r
- if (in_array($expected, array('is_string', 'is_bool', 'is_true', 'is_false', 'is_int', 'is_numeric', 'is_float', 'is_double', 'is_array', 'is_null'), TRUE))\r
- {\r
- $expected = str_replace('is_float', 'is_double', $expected);\r
- $result = ($expected($test)) ? TRUE : FALSE; \r
- $extype = str_replace(array('true', 'false'), 'bool', str_replace('is_', '', $expected));\r
- }\r
- else\r
- {\r
- if ($this->strict == TRUE)\r
- $result = ($test === $expected) ? TRUE : FALSE; \r
- else\r
- $result = ($test == $expected) ? TRUE : FALSE; \r
- \r
- $extype = gettype($expected);\r
- }\r
- \r
- $back = $this->_backtrace();\r
- \r
- $report[] = array (\r
- 'test_name' => $test_name,\r
- 'test_datatype' => gettype($test),\r
- 'res_datatype' => $extype,\r
- 'result' => ($result === TRUE) ? 'passed' : 'failed',\r
- 'file' => $back['file'],\r
- 'line' => $back['line']\r
- );\r
-\r
- $this->results[] = $report; \r
- \r
- return($this->report($this->result($report)));\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Generate a report\r
- *\r
- * Displays a table with the test data\r
- *\r
- * @access public\r
- * @return string\r
- */\r
- function report($result = array())\r
- {\r
- if (count($result) == 0)\r
- {\r
- $result = $this->result();\r
- }\r
-\r
- $CI =& get_instance();\r
- $CI->load->language('unit_test');\r
-\r
- $this->_parse_template();\r
-\r
- $r = '';\r
- foreach ($result as $res)\r
- {\r
- $table = '';\r
-\r
- foreach ($res as $key => $val)\r
- {\r
-\r
- if ($key == $CI->lang->line('ut_result'))\r
- {\r
- if ($val == $CI->lang->line('ut_passed'))\r
- {\r
- $val = '<span style="color: #0C0;">'.$val.'</span>';\r
- }\r
- elseif ($val == $CI->lang->line('ut_failed'))\r
- {\r
- $val = '<span style="color: #C00;">'.$val.'</span>';\r
- }\r
- }\r
-\r
- $temp = $this->_template_rows;\r
- $temp = str_replace('{item}', $key, $temp);\r
- $temp = str_replace('{result}', $val, $temp);\r
- $table .= $temp;\r
- }\r
-\r
- $r .= str_replace('{rows}', $table, $this->_template);\r
- }\r
-\r
- return $r;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Use strict comparison\r
- *\r
- * Causes the evaluation to use === rather than ==\r
- *\r
- * @access public\r
- * @param bool\r
- * @return null\r
- */\r
- function use_strict($state = TRUE)\r
- {\r
- $this->strict = ($state == FALSE) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Make Unit testing active\r
- *\r
- * Enables/disables unit testing\r
- *\r
- * @access public\r
- * @param bool\r
- * @return null\r
- */\r
- function active($state = TRUE)\r
- {\r
- $this->active = ($state == FALSE) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Result Array\r
- *\r
- * Returns the raw result data\r
- *\r
- * @access public\r
- * @return array\r
- */\r
- function result($results = array())\r
- { \r
- $CI =& get_instance();\r
- $CI->load->language('unit_test');\r
- \r
- if (count($results) == 0)\r
- {\r
- $results = $this->results;\r
- }\r
- \r
- $retval = array();\r
- foreach ($results as $result)\r
- {\r
- $temp = array();\r
- foreach ($result as $key => $val)\r
- {\r
- if (is_array($val))\r
- {\r
- foreach ($val as $k => $v)\r
- {\r
- if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$v))))\r
- {\r
- $v = $line;\r
- } \r
- $temp[$CI->lang->line('ut_'.$k)] = $v; \r
- }\r
- }\r
- else\r
- {\r
- if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$val))))\r
- {\r
- $val = $line;\r
- } \r
- $temp[$CI->lang->line('ut_'.$key)] = $val;\r
- }\r
- }\r
- \r
- $retval[] = $temp;\r
- }\r
- \r
- return $retval;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the template\r
- *\r
- * This lets us set the template to be used to display results\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_template($template)\r
- {\r
- $this->_template = $template;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Generate a backtrace\r
- *\r
- * This lets us show file names and line numbers\r
- *\r
- * @access private\r
- * @return array\r
- */\r
- function _backtrace()\r
- {\r
- if (function_exists('debug_backtrace'))\r
- {\r
- $back = debug_backtrace();\r
- \r
- $file = ( ! isset($back['1']['file'])) ? '' : $back['1']['file'];\r
- $line = ( ! isset($back['1']['line'])) ? '' : $back['1']['line'];\r
- \r
- return array('file' => $file, 'line' => $line);\r
- }\r
- return array('file' => 'Unknown', 'line' => 'Unknown');\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get Default Template\r
- *\r
- * @access private\r
- * @return string\r
- */\r
- function _default_template()\r
- { \r
- $this->_template = "\n".'<table style="width:100%; font-size:small; margin:10px 0; border-collapse:collapse; border:1px solid #CCC;">';\r
- $this->_template .= '{rows}';\r
- $this->_template .= "\n".'</table>';\r
- \r
- $this->_template_rows = "\n\t".'<tr>';\r
- $this->_template_rows .= "\n\t\t".'<th style="text-align: left; border-bottom:1px solid #CCC;">{item}</th>';\r
- $this->_template_rows .= "\n\t\t".'<td style="border-bottom:1px solid #CCC;">{result}</td>';\r
- $this->_template_rows .= "\n\t".'</tr>'; \r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Parse Template\r
- *\r
- * Harvests the data within the template {pseudo-variables}\r
- *\r
- * @access private\r
- * @return void\r
- */\r
- function _parse_template()\r
- {\r
- if ( ! is_null($this->_template_rows))\r
- {\r
- return;\r
- }\r
- \r
- if (is_null($this->_template))\r
- {\r
- $this->_default_template();\r
- return;\r
- }\r
- \r
- if ( ! preg_match("/\{rows\}(.*?)\{\/rows\}/si", $this->_template, $match))\r
- {\r
- $this->_default_template();\r
- return;\r
- }\r
-\r
- $this->_template_rows = $match['1'];\r
- $this->_template = str_replace($match['0'], '{rows}', $this->_template); \r
- }\r
- \r
-}\r
-// END Unit_test Class\r
-\r
-/**\r
- * Helper functions to test boolean true/false\r
- *\r
- *\r
- * @access private\r
- * @return bool\r
- */\r
-function is_true($test)\r
-{\r
- return (is_bool($test) AND $test === TRUE) ? TRUE : FALSE;\r
-}\r
-function is_false($test)\r
-{\r
- return (is_bool($test) AND $test === FALSE) ? TRUE : FALSE;\r
-}\r
-\r
-\r
-/* End of file Unit_test.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.3.1
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Unit Testing Class
+ *
+ * Simple testing class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category UnitTesting
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/uri.html
+ */
+class CI_Unit_test {
+
+ var $active = TRUE;
+ var $results = array();
+ var $strict = FALSE;
+ var $_template = NULL;
+ var $_template_rows = NULL;
+
+ function CI_Unit_test()
+ {
+ log_message('debug', "Unit Testing Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Run the tests
+ *
+ * Runs the supplied tests
+ *
+ * @access public
+ * @param mixed
+ * @param mixed
+ * @param string
+ * @return string
+ */
+ function run($test, $expected = TRUE, $test_name = 'undefined')
+ {
+ if ($this->active == FALSE)
+ {
+ return FALSE;
+ }
+
+ if (in_array($expected, array('is_string', 'is_bool', 'is_true', 'is_false', 'is_int', 'is_numeric', 'is_float', 'is_double', 'is_array', 'is_null'), TRUE))
+ {
+ $expected = str_replace('is_float', 'is_double', $expected);
+ $result = ($expected($test)) ? TRUE : FALSE;
+ $extype = str_replace(array('true', 'false'), 'bool', str_replace('is_', '', $expected));
+ }
+ else
+ {
+ if ($this->strict == TRUE)
+ $result = ($test === $expected) ? TRUE : FALSE;
+ else
+ $result = ($test == $expected) ? TRUE : FALSE;
+
+ $extype = gettype($expected);
+ }
+
+ $back = $this->_backtrace();
+
+ $report[] = array (
+ 'test_name' => $test_name,
+ 'test_datatype' => gettype($test),
+ 'res_datatype' => $extype,
+ 'result' => ($result === TRUE) ? 'passed' : 'failed',
+ 'file' => $back['file'],
+ 'line' => $back['line']
+ );
+
+ $this->results[] = $report;
+
+ return($this->report($this->result($report)));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate a report
+ *
+ * Displays a table with the test data
+ *
+ * @access public
+ * @return string
+ */
+ function report($result = array())
+ {
+ if (count($result) == 0)
+ {
+ $result = $this->result();
+ }
+
+ $CI =& get_instance();
+ $CI->load->language('unit_test');
+
+ $this->_parse_template();
+
+ $r = '';
+ foreach ($result as $res)
+ {
+ $table = '';
+
+ foreach ($res as $key => $val)
+ {
+
+ if ($key == $CI->lang->line('ut_result'))
+ {
+ if ($val == $CI->lang->line('ut_passed'))
+ {
+ $val = '<span style="color: #0C0;">'.$val.'</span>';
+ }
+ elseif ($val == $CI->lang->line('ut_failed'))
+ {
+ $val = '<span style="color: #C00;">'.$val.'</span>';
+ }
+ }
+
+ $temp = $this->_template_rows;
+ $temp = str_replace('{item}', $key, $temp);
+ $temp = str_replace('{result}', $val, $temp);
+ $table .= $temp;
+ }
+
+ $r .= str_replace('{rows}', $table, $this->_template);
+ }
+
+ return $r;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Use strict comparison
+ *
+ * Causes the evaluation to use === rather than ==
+ *
+ * @access public
+ * @param bool
+ * @return null
+ */
+ function use_strict($state = TRUE)
+ {
+ $this->strict = ($state == FALSE) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Make Unit testing active
+ *
+ * Enables/disables unit testing
+ *
+ * @access public
+ * @param bool
+ * @return null
+ */
+ function active($state = TRUE)
+ {
+ $this->active = ($state == FALSE) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Result Array
+ *
+ * Returns the raw result data
+ *
+ * @access public
+ * @return array
+ */
+ function result($results = array())
+ {
+ $CI =& get_instance();
+ $CI->load->language('unit_test');
+
+ if (count($results) == 0)
+ {
+ $results = $this->results;
+ }
+
+ $retval = array();
+ foreach ($results as $result)
+ {
+ $temp = array();
+ foreach ($result as $key => $val)
+ {
+ if (is_array($val))
+ {
+ foreach ($val as $k => $v)
+ {
+ if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$v))))
+ {
+ $v = $line;
+ }
+ $temp[$CI->lang->line('ut_'.$k)] = $v;
+ }
+ }
+ else
+ {
+ if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$val))))
+ {
+ $val = $line;
+ }
+ $temp[$CI->lang->line('ut_'.$key)] = $val;
+ }
+ }
+
+ $retval[] = $temp;
+ }
+
+ return $retval;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the template
+ *
+ * This lets us set the template to be used to display results
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_template($template)
+ {
+ $this->_template = $template;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Generate a backtrace
+ *
+ * This lets us show file names and line numbers
+ *
+ * @access private
+ * @return array
+ */
+ function _backtrace()
+ {
+ if (function_exists('debug_backtrace'))
+ {
+ $back = debug_backtrace();
+
+ $file = ( ! isset($back['1']['file'])) ? '' : $back['1']['file'];
+ $line = ( ! isset($back['1']['line'])) ? '' : $back['1']['line'];
+
+ return array('file' => $file, 'line' => $line);
+ }
+ return array('file' => 'Unknown', 'line' => 'Unknown');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Default Template
+ *
+ * @access private
+ * @return string
+ */
+ function _default_template()
+ {
+ $this->_template = "\n".'<table style="width:100%; font-size:small; margin:10px 0; border-collapse:collapse; border:1px solid #CCC;">';
+ $this->_template .= '{rows}';
+ $this->_template .= "\n".'</table>';
+
+ $this->_template_rows = "\n\t".'<tr>';
+ $this->_template_rows .= "\n\t\t".'<th style="text-align: left; border-bottom:1px solid #CCC;">{item}</th>';
+ $this->_template_rows .= "\n\t\t".'<td style="border-bottom:1px solid #CCC;">{result}</td>';
+ $this->_template_rows .= "\n\t".'</tr>';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Parse Template
+ *
+ * Harvests the data within the template {pseudo-variables}
+ *
+ * @access private
+ * @return void
+ */
+ function _parse_template()
+ {
+ if ( ! is_null($this->_template_rows))
+ {
+ return;
+ }
+
+ if (is_null($this->_template))
+ {
+ $this->_default_template();
+ return;
+ }
+
+ if ( ! preg_match("/\{rows\}(.*?)\{\/rows\}/si", $this->_template, $match))
+ {
+ $this->_default_template();
+ return;
+ }
+
+ $this->_template_rows = $match['1'];
+ $this->_template = str_replace($match['0'], '{rows}', $this->_template);
+ }
+
+}
+// END Unit_test Class
+
+/**
+ * Helper functions to test boolean true/false
+ *
+ *
+ * @access private
+ * @return bool
+ */
+function is_true($test)
+{
+ return (is_bool($test) AND $test === TRUE) ? TRUE : FALSE;
+}
+function is_false($test)
+{
+ return (is_bool($test) AND $test === FALSE) ? TRUE : FALSE;
+}
+
+
+/* End of file Unit_test.php */
/* Location: ./system/libraries/Unit_test.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * File Uploading Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Uploads\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/file_uploading.html\r
- */\r
-class CI_Upload {\r
- \r
- var $max_size = 0;\r
- var $max_width = 0;\r
- var $max_height = 0;\r
- var $max_filename = 0;\r
- var $allowed_types = "";\r
- var $file_temp = "";\r
- var $file_name = "";\r
- var $orig_name = "";\r
- var $file_type = "";\r
- var $file_size = "";\r
- var $file_ext = "";\r
- var $upload_path = "";\r
- var $overwrite = FALSE;\r
- var $encrypt_name = FALSE;\r
- var $is_image = FALSE;\r
- var $image_width = '';\r
- var $image_height = '';\r
- var $image_type = '';\r
- var $image_size_str = '';\r
- var $error_msg = array();\r
- var $mimes = array();\r
- var $remove_spaces = TRUE;\r
- var $xss_clean = FALSE;\r
- var $temp_prefix = "temp_file_";\r
- \r
- /**\r
- * Constructor\r
- *\r
- * @access public\r
- */\r
- function CI_Upload($props = array())\r
- {\r
- if (count($props) > 0)\r
- {\r
- $this->initialize($props);\r
- }\r
- \r
- log_message('debug', "Upload Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Initialize preferences\r
- *\r
- * @access public\r
- * @param array\r
- * @return void\r
- */ \r
- function initialize($config = array())\r
- {\r
- $defaults = array(\r
- 'max_size' => 0,\r
- 'max_width' => 0,\r
- 'max_height' => 0,\r
- 'max_filename' => 0,\r
- 'allowed_types' => "",\r
- 'file_temp' => "",\r
- 'file_name' => "",\r
- 'orig_name' => "",\r
- 'file_type' => "",\r
- 'file_size' => "",\r
- 'file_ext' => "",\r
- 'upload_path' => "",\r
- 'overwrite' => FALSE,\r
- 'encrypt_name' => FALSE,\r
- 'is_image' => FALSE,\r
- 'image_width' => '',\r
- 'image_height' => '',\r
- 'image_type' => '',\r
- 'image_size_str' => '',\r
- 'error_msg' => array(),\r
- 'mimes' => array(),\r
- 'remove_spaces' => TRUE,\r
- 'xss_clean' => FALSE,\r
- 'temp_prefix' => "temp_file_"\r
- ); \r
- \r
- \r
- foreach ($defaults as $key => $val)\r
- {\r
- if (isset($config[$key]))\r
- {\r
- $method = 'set_'.$key;\r
- if (method_exists($this, $method))\r
- {\r
- $this->$method($config[$key]);\r
- }\r
- else\r
- {\r
- $this->$key = $config[$key];\r
- } \r
- }\r
- else\r
- {\r
- $this->$key = $val;\r
- }\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Perform the file upload\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function do_upload($field = 'userfile')\r
- {\r
- // Is $_FILES[$field] set? If not, no reason to continue.\r
- if ( ! isset($_FILES[$field]))\r
- {\r
- $this->set_error('upload_no_file_selected');\r
- return FALSE;\r
- }\r
- \r
- // Is the upload path valid?\r
- if ( ! $this->validate_upload_path())\r
- {\r
- // errors will already be set by validate_upload_path() so just return FALSE\r
- return FALSE;\r
- }\r
-\r
- // Was the file able to be uploaded? If not, determine the reason why.\r
- if ( ! is_uploaded_file($_FILES[$field]['tmp_name']))\r
- {\r
- $error = ( ! isset($_FILES[$field]['error'])) ? 4 : $_FILES[$field]['error'];\r
-\r
- switch($error)\r
- {\r
- case 1: // UPLOAD_ERR_INI_SIZE\r
- $this->set_error('upload_file_exceeds_limit');\r
- break;\r
- case 2: // UPLOAD_ERR_FORM_SIZE\r
- $this->set_error('upload_file_exceeds_form_limit');\r
- break;\r
- case 3: // UPLOAD_ERR_PARTIAL\r
- $this->set_error('upload_file_partial');\r
- break;\r
- case 4: // UPLOAD_ERR_NO_FILE\r
- $this->set_error('upload_no_file_selected');\r
- break;\r
- case 6: // UPLOAD_ERR_NO_TMP_DIR\r
- $this->set_error('upload_no_temp_directory');\r
- break;\r
- case 7: // UPLOAD_ERR_CANT_WRITE\r
- $this->set_error('upload_unable_to_write_file');\r
- break;\r
- case 8: // UPLOAD_ERR_EXTENSION\r
- $this->set_error('upload_stopped_by_extension');\r
- break;\r
- default : $this->set_error('upload_no_file_selected');\r
- break;\r
- }\r
-\r
- return FALSE;\r
- }\r
-\r
- // Set the uploaded data as class variables\r
- $this->file_temp = $_FILES[$field]['tmp_name']; \r
- $this->file_name = $this->_prep_filename($_FILES[$field]['name']);\r
- $this->file_size = $_FILES[$field]['size']; \r
- $this->file_type = preg_replace("/^(.+?);.*$/", "\\1", $_FILES[$field]['type']);\r
- $this->file_type = strtolower($this->file_type);\r
- $this->file_ext = $this->get_extension($_FILES[$field]['name']);\r
- \r
- // Convert the file size to kilobytes\r
- if ($this->file_size > 0)\r
- {\r
- $this->file_size = round($this->file_size/1024, 2);\r
- }\r
-\r
- // Is the file type allowed to be uploaded?\r
- if ( ! $this->is_allowed_filetype())\r
- {\r
- $this->set_error('upload_invalid_filetype');\r
- return FALSE;\r
- }\r
-\r
- // Is the file size within the allowed maximum?\r
- if ( ! $this->is_allowed_filesize())\r
- {\r
- $this->set_error('upload_invalid_filesize');\r
- return FALSE;\r
- }\r
-\r
- // Are the image dimensions within the allowed size?\r
- // Note: This can fail if the server has an open_basdir restriction.\r
- if ( ! $this->is_allowed_dimensions())\r
- {\r
- $this->set_error('upload_invalid_dimensions');\r
- return FALSE;\r
- }\r
-\r
- // Sanitize the file name for security\r
- $this->file_name = $this->clean_file_name($this->file_name);\r
- \r
- // Truncate the file name if it's too long\r
- if ($this->max_filename > 0)\r
- {\r
- $this->file_name = $this->limit_filename_length($this->file_name, $this->max_filename);\r
- }\r
-\r
- // Remove white spaces in the name\r
- if ($this->remove_spaces == TRUE)\r
- {\r
- $this->file_name = preg_replace("/\s+/", "_", $this->file_name);\r
- }\r
-\r
- /*\r
- * Validate the file name\r
- * This function appends an number onto the end of\r
- * the file if one with the same name already exists.\r
- * If it returns false there was a problem.\r
- */\r
- $this->orig_name = $this->file_name;\r
-\r
- if ($this->overwrite == FALSE)\r
- {\r
- $this->file_name = $this->set_filename($this->upload_path, $this->file_name);\r
- \r
- if ($this->file_name === FALSE)\r
- {\r
- return FALSE;\r
- }\r
- }\r
-\r
- /*\r
- * Move the file to the final destination\r
- * To deal with different server configurations\r
- * we'll attempt to use copy() first. If that fails\r
- * we'll use move_uploaded_file(). One of the two should\r
- * reliably work in most environments\r
- */\r
- if ( ! @copy($this->file_temp, $this->upload_path.$this->file_name))\r
- {\r
- if ( ! @move_uploaded_file($this->file_temp, $this->upload_path.$this->file_name))\r
- {\r
- $this->set_error('upload_destination_error');\r
- return FALSE;\r
- }\r
- }\r
- \r
- /*\r
- * Run the file through the XSS hacking filter\r
- * This helps prevent malicious code from being\r
- * embedded within a file. Scripts can easily\r
- * be disguised as images or other file types.\r
- */\r
- if ($this->xss_clean == TRUE)\r
- {\r
- $this->do_xss_clean();\r
- }\r
-\r
- /*\r
- * Set the finalized image dimensions\r
- * This sets the image width/height (assuming the\r
- * file was an image). We use this information\r
- * in the "data" function.\r
- */\r
- $this->set_image_properties($this->upload_path.$this->file_name);\r
-\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Finalized Data Array\r
- * \r
- * Returns an associative array containing all of the information\r
- * related to the upload, allowing the developer easy access in one array.\r
- *\r
- * @access public\r
- * @return array\r
- */ \r
- function data()\r
- {\r
- return array (\r
- 'file_name' => $this->file_name,\r
- 'file_type' => $this->file_type,\r
- 'file_path' => $this->upload_path,\r
- 'full_path' => $this->upload_path.$this->file_name,\r
- 'raw_name' => str_replace($this->file_ext, '', $this->file_name),\r
- 'orig_name' => $this->orig_name,\r
- 'file_ext' => $this->file_ext,\r
- 'file_size' => $this->file_size,\r
- 'is_image' => $this->is_image(),\r
- 'image_width' => $this->image_width,\r
- 'image_height' => $this->image_height,\r
- 'image_type' => $this->image_type,\r
- 'image_size_str' => $this->image_size_str,\r
- );\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Upload Path\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_upload_path($path)\r
- {\r
- // Make sure it has a trailing slash\r
- $this->upload_path = rtrim($path, '/').'/';\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the file name\r
- *\r
- * This function takes a filename/path as input and looks for the\r
- * existence of a file with the same name. If found, it will append a\r
- * number to the end of the filename to avoid overwriting a pre-existing file.\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */ \r
- function set_filename($path, $filename)\r
- {\r
- if ($this->encrypt_name == TRUE)\r
- { \r
- mt_srand();\r
- $filename = md5(uniqid(mt_rand())).$this->file_ext; \r
- }\r
- \r
- if ( ! file_exists($path.$filename))\r
- {\r
- return $filename;\r
- }\r
- \r
- $filename = str_replace($this->file_ext, '', $filename);\r
- \r
- $new_filename = '';\r
- for ($i = 1; $i < 100; $i++)\r
- { \r
- if ( ! file_exists($path.$filename.$i.$this->file_ext))\r
- {\r
- $new_filename = $filename.$i.$this->file_ext;\r
- break;\r
- }\r
- }\r
-\r
- if ($new_filename == '')\r
- {\r
- $this->set_error('upload_bad_filename');\r
- return FALSE;\r
- }\r
- else\r
- {\r
- return $new_filename;\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Maximum File Size\r
- *\r
- * @access public\r
- * @param integer\r
- * @return void\r
- */ \r
- function set_max_filesize($n)\r
- {\r
- $this->max_size = ((int) $n < 0) ? 0: (int) $n;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Maximum File Name Length\r
- *\r
- * @access public\r
- * @param integer\r
- * @return void\r
- */ \r
- function set_max_filename($n)\r
- {\r
- $this->max_filename = ((int) $n < 0) ? 0: (int) $n;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Maximum Image Width\r
- *\r
- * @access public\r
- * @param integer\r
- * @return void\r
- */ \r
- function set_max_width($n)\r
- {\r
- $this->max_width = ((int) $n < 0) ? 0: (int) $n;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Maximum Image Height\r
- *\r
- * @access public\r
- * @param integer\r
- * @return void\r
- */ \r
- function set_max_height($n)\r
- {\r
- $this->max_height = ((int) $n < 0) ? 0: (int) $n;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Allowed File Types\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_allowed_types($types)\r
- {\r
- $this->allowed_types = explode('|', $types);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Image Properties\r
- *\r
- * Uses GD to determine the width/height/type of image\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_image_properties($path = '')\r
- {\r
- if ( ! $this->is_image())\r
- {\r
- return;\r
- }\r
-\r
- if (function_exists('getimagesize'))\r
- {\r
- if (FALSE !== ($D = @getimagesize($path)))\r
- { \r
- $types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png');\r
-\r
- $this->image_width = $D['0'];\r
- $this->image_height = $D['1'];\r
- $this->image_type = ( ! isset($types[$D['2']])) ? 'unknown' : $types[$D['2']];\r
- $this->image_size_str = $D['3']; // string containing height and width\r
- }\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set XSS Clean\r
- *\r
- * Enables the XSS flag so that the file that was uploaded\r
- * will be run through the XSS filter.\r
- *\r
- * @access public\r
- * @param bool\r
- * @return void\r
- */\r
- function set_xss_clean($flag = FALSE)\r
- {\r
- $this->xss_clean = ($flag == TRUE) ? TRUE : FALSE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Validate the image\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function is_image()\r
- {\r
- // IE will sometimes return odd mime-types during upload, so here we just standardize all\r
- // jpegs or pngs to the same file type.\r
-\r
- $png_mimes = array('image/x-png');\r
- $jpeg_mimes = array('image/jpg', 'image/jpe', 'image/jpeg', 'image/pjpeg');\r
- \r
- if (in_array($this->file_type, $png_mimes))\r
- {\r
- $this->file_type = 'image/png';\r
- }\r
- \r
- if (in_array($this->file_type, $jpeg_mimes))\r
- {\r
- $this->file_type = 'image/jpeg';\r
- }\r
-\r
- $img_mimes = array(\r
- 'image/gif',\r
- 'image/jpeg',\r
- 'image/png',\r
- );\r
-\r
- return (in_array($this->file_type, $img_mimes, TRUE)) ? TRUE : FALSE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Verify that the filetype is allowed\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function is_allowed_filetype()\r
- {\r
- if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types))\r
- {\r
- $this->set_error('upload_no_file_types');\r
- return FALSE;\r
- }\r
- \r
- foreach ($this->allowed_types as $val)\r
- {\r
- $mime = $this->mimes_types(strtolower($val));\r
- \r
- if (is_array($mime))\r
- {\r
- if (in_array($this->file_type, $mime, TRUE))\r
- {\r
- return TRUE;\r
- }\r
- }\r
- else\r
- {\r
- if ($mime == $this->file_type)\r
- {\r
- return TRUE;\r
- } \r
- } \r
- }\r
- \r
- return FALSE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Verify that the file is within the allowed size\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function is_allowed_filesize()\r
- {\r
- if ($this->max_size != 0 AND $this->file_size > $this->max_size)\r
- {\r
- return FALSE;\r
- }\r
- else\r
- {\r
- return TRUE;\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Verify that the image is within the allowed width/height\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function is_allowed_dimensions()\r
- {\r
- if ( ! $this->is_image())\r
- {\r
- return TRUE;\r
- }\r
-\r
- if (function_exists('getimagesize'))\r
- {\r
- $D = @getimagesize($this->file_temp);\r
-\r
- if ($this->max_width > 0 AND $D['0'] > $this->max_width)\r
- {\r
- return FALSE;\r
- }\r
-\r
- if ($this->max_height > 0 AND $D['1'] > $this->max_height)\r
- {\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
- }\r
-\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Validate Upload Path\r
- *\r
- * Verifies that it is a valid upload path with proper permissions.\r
- *\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function validate_upload_path()\r
- {\r
- if ($this->upload_path == '')\r
- {\r
- $this->set_error('upload_no_filepath');\r
- return FALSE;\r
- }\r
- \r
- if (function_exists('realpath') AND @realpath($this->upload_path) !== FALSE)\r
- {\r
- $this->upload_path = str_replace("\\", "/", realpath($this->upload_path));\r
- }\r
-\r
- if ( ! @is_dir($this->upload_path))\r
- {\r
- $this->set_error('upload_no_filepath');\r
- return FALSE;\r
- }\r
-\r
- if ( ! is_really_writable($this->upload_path))\r
- {\r
- $this->set_error('upload_not_writable');\r
- return FALSE;\r
- }\r
-\r
- $this->upload_path = preg_replace("/(.+?)\/*$/", "\\1/", $this->upload_path);\r
- return TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Extract the file extension\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function get_extension($filename)\r
- {\r
- $x = explode('.', $filename);\r
- return '.'.end($x);\r
- } \r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Clean the file name for security\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function clean_file_name($filename)\r
- {\r
- $bad = array(\r
- "<!--",\r
- "-->",\r
- "'",\r
- "<",\r
- ">",\r
- '"',\r
- '&',\r
- '$',\r
- '=',\r
- ';',\r
- '?',\r
- '/',\r
- "%20",\r
- "%22",\r
- "%3c", // <\r
- "%253c", // <\r
- "%3e", // >\r
- "%0e", // >\r
- "%28", // (\r
- "%29", // )\r
- "%2528", // (\r
- "%26", // &\r
- "%24", // $\r
- "%3f", // ?\r
- "%3b", // ;\r
- "%3d" // =\r
- );\r
- \r
- $filename = str_replace($bad, '', $filename);\r
-\r
- return stripslashes($filename);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Limit the File Name Length\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function limit_filename_length($filename, $length)\r
- {\r
- if (strlen($filename) < $length)\r
- {\r
- return $filename;\r
- }\r
- \r
- $ext = '';\r
- if (strpos($filename, '.') !== FALSE)\r
- {\r
- $parts = explode('.', $filename);\r
- $ext = '.'.array_pop($parts);\r
- $filename = implode('.', $parts);\r
- }\r
- \r
- return substr($filename, 0, ($length - strlen($ext))).$ext;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Runs the file through the XSS clean function\r
- *\r
- * This prevents people from embedding malicious code in their files.\r
- * I'm not sure that it won't negatively affect certain files in unexpected ways,\r
- * but so far I haven't found that it causes trouble.\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function do_xss_clean()\r
- { \r
- $file = $this->upload_path.$this->file_name;\r
- \r
- if (filesize($file) == 0)\r
- {\r
- return FALSE;\r
- }\r
-\r
- if (($data = @file_get_contents($file)) === FALSE)\r
- {\r
- return FALSE;\r
- }\r
- \r
- if ( ! $fp = @fopen($file, FOPEN_READ_WRITE))\r
- {\r
- return FALSE;\r
- }\r
-\r
- $CI =& get_instance(); \r
- $data = $CI->input->xss_clean($data);\r
- \r
- flock($fp, LOCK_EX);\r
- fwrite($fp, $data);\r
- flock($fp, LOCK_UN);\r
- fclose($fp);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set an error message\r
- *\r
- * @access public\r
- * @param string\r
- * @return void\r
- */ \r
- function set_error($msg)\r
- {\r
- $CI =& get_instance(); \r
- $CI->lang->load('upload');\r
- \r
- if (is_array($msg))\r
- {\r
- foreach ($msg as $val)\r
- {\r
- $msg = ($CI->lang->line($val) == FALSE) ? $val : $CI->lang->line($val); \r
- $this->error_msg[] = $msg;\r
- log_message('error', $msg);\r
- } \r
- }\r
- else\r
- {\r
- $msg = ($CI->lang->line($msg) == FALSE) ? $msg : $CI->lang->line($msg);\r
- $this->error_msg[] = $msg;\r
- log_message('error', $msg);\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Display the error message\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */ \r
- function display_errors($open = '<p>', $close = '</p>')\r
- {\r
- $str = '';\r
- foreach ($this->error_msg as $val)\r
- {\r
- $str .= $open.$val.$close;\r
- }\r
- \r
- return $str;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * List of Mime Types\r
- *\r
- * This is a list of mime types. We use it to validate\r
- * the "allowed types" set by the developer\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function mimes_types($mime)\r
- {\r
- global $mimes;\r
- \r
- if (count($this->mimes) == 0)\r
- {\r
- if (@require_once(APPPATH.'config/mimes'.EXT))\r
- {\r
- $this->mimes = $mimes;\r
- unset($mimes);\r
- }\r
- }\r
- \r
- return ( ! isset($this->mimes[$mime])) ? FALSE : $this->mimes[$mime];\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Prep Filename\r
- *\r
- * Prevents possible script execution from Apache's handling of files multiple extensions\r
- * http://httpd.apache.org/docs/1.3/mod/mod_mime.html#multipleext\r
- *\r
- * @access private\r
- * @param string\r
- * @return string\r
- */\r
- function _prep_filename($filename)\r
- {\r
- if (strpos($filename, '.') === FALSE)\r
- {\r
- return $filename;\r
- }\r
- \r
- $parts = explode('.', $filename);\r
- $ext = array_pop($parts);\r
- $filename = array_shift($parts);\r
- \r
- foreach ($parts as $part)\r
- {\r
- if ($this->mimes_types(strtolower($part)) === FALSE)\r
- {\r
- $filename .= '.'.$part.'_';\r
- }\r
- else\r
- {\r
- $filename .= '.'.$part;\r
- }\r
- }\r
- \r
- $filename .= '.'.$ext;\r
- \r
- return $filename;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
-}\r
-// END Upload Class\r
-\r
-/* End of file Upload.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * File Uploading Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Uploads
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/file_uploading.html
+ */
+class CI_Upload {
+
+ var $max_size = 0;
+ var $max_width = 0;
+ var $max_height = 0;
+ var $max_filename = 0;
+ var $allowed_types = "";
+ var $file_temp = "";
+ var $file_name = "";
+ var $orig_name = "";
+ var $file_type = "";
+ var $file_size = "";
+ var $file_ext = "";
+ var $upload_path = "";
+ var $overwrite = FALSE;
+ var $encrypt_name = FALSE;
+ var $is_image = FALSE;
+ var $image_width = '';
+ var $image_height = '';
+ var $image_type = '';
+ var $image_size_str = '';
+ var $error_msg = array();
+ var $mimes = array();
+ var $remove_spaces = TRUE;
+ var $xss_clean = FALSE;
+ var $temp_prefix = "temp_file_";
+
+ /**
+ * Constructor
+ *
+ * @access public
+ */
+ function CI_Upload($props = array())
+ {
+ if (count($props) > 0)
+ {
+ $this->initialize($props);
+ }
+
+ log_message('debug', "Upload Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize preferences
+ *
+ * @access public
+ * @param array
+ * @return void
+ */
+ function initialize($config = array())
+ {
+ $defaults = array(
+ 'max_size' => 0,
+ 'max_width' => 0,
+ 'max_height' => 0,
+ 'max_filename' => 0,
+ 'allowed_types' => "",
+ 'file_temp' => "",
+ 'file_name' => "",
+ 'orig_name' => "",
+ 'file_type' => "",
+ 'file_size' => "",
+ 'file_ext' => "",
+ 'upload_path' => "",
+ 'overwrite' => FALSE,
+ 'encrypt_name' => FALSE,
+ 'is_image' => FALSE,
+ 'image_width' => '',
+ 'image_height' => '',
+ 'image_type' => '',
+ 'image_size_str' => '',
+ 'error_msg' => array(),
+ 'mimes' => array(),
+ 'remove_spaces' => TRUE,
+ 'xss_clean' => FALSE,
+ 'temp_prefix' => "temp_file_"
+ );
+
+
+ foreach ($defaults as $key => $val)
+ {
+ if (isset($config[$key]))
+ {
+ $method = 'set_'.$key;
+ if (method_exists($this, $method))
+ {
+ $this->$method($config[$key]);
+ }
+ else
+ {
+ $this->$key = $config[$key];
+ }
+ }
+ else
+ {
+ $this->$key = $val;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Perform the file upload
+ *
+ * @access public
+ * @return bool
+ */
+ function do_upload($field = 'userfile')
+ {
+ // Is $_FILES[$field] set? If not, no reason to continue.
+ if ( ! isset($_FILES[$field]))
+ {
+ $this->set_error('upload_no_file_selected');
+ return FALSE;
+ }
+
+ // Is the upload path valid?
+ if ( ! $this->validate_upload_path())
+ {
+ // errors will already be set by validate_upload_path() so just return FALSE
+ return FALSE;
+ }
+
+ // Was the file able to be uploaded? If not, determine the reason why.
+ if ( ! is_uploaded_file($_FILES[$field]['tmp_name']))
+ {
+ $error = ( ! isset($_FILES[$field]['error'])) ? 4 : $_FILES[$field]['error'];
+
+ switch($error)
+ {
+ case 1: // UPLOAD_ERR_INI_SIZE
+ $this->set_error('upload_file_exceeds_limit');
+ break;
+ case 2: // UPLOAD_ERR_FORM_SIZE
+ $this->set_error('upload_file_exceeds_form_limit');
+ break;
+ case 3: // UPLOAD_ERR_PARTIAL
+ $this->set_error('upload_file_partial');
+ break;
+ case 4: // UPLOAD_ERR_NO_FILE
+ $this->set_error('upload_no_file_selected');
+ break;
+ case 6: // UPLOAD_ERR_NO_TMP_DIR
+ $this->set_error('upload_no_temp_directory');
+ break;
+ case 7: // UPLOAD_ERR_CANT_WRITE
+ $this->set_error('upload_unable_to_write_file');
+ break;
+ case 8: // UPLOAD_ERR_EXTENSION
+ $this->set_error('upload_stopped_by_extension');
+ break;
+ default : $this->set_error('upload_no_file_selected');
+ break;
+ }
+
+ return FALSE;
+ }
+
+ // Set the uploaded data as class variables
+ $this->file_temp = $_FILES[$field]['tmp_name'];
+ $this->file_name = $this->_prep_filename($_FILES[$field]['name']);
+ $this->file_size = $_FILES[$field]['size'];
+ $this->file_type = preg_replace("/^(.+?);.*$/", "\\1", $_FILES[$field]['type']);
+ $this->file_type = strtolower($this->file_type);
+ $this->file_ext = $this->get_extension($_FILES[$field]['name']);
+
+ // Convert the file size to kilobytes
+ if ($this->file_size > 0)
+ {
+ $this->file_size = round($this->file_size/1024, 2);
+ }
+
+ // Is the file type allowed to be uploaded?
+ if ( ! $this->is_allowed_filetype())
+ {
+ $this->set_error('upload_invalid_filetype');
+ return FALSE;
+ }
+
+ // Is the file size within the allowed maximum?
+ if ( ! $this->is_allowed_filesize())
+ {
+ $this->set_error('upload_invalid_filesize');
+ return FALSE;
+ }
+
+ // Are the image dimensions within the allowed size?
+ // Note: This can fail if the server has an open_basdir restriction.
+ if ( ! $this->is_allowed_dimensions())
+ {
+ $this->set_error('upload_invalid_dimensions');
+ return FALSE;
+ }
+
+ // Sanitize the file name for security
+ $this->file_name = $this->clean_file_name($this->file_name);
+
+ // Truncate the file name if it's too long
+ if ($this->max_filename > 0)
+ {
+ $this->file_name = $this->limit_filename_length($this->file_name, $this->max_filename);
+ }
+
+ // Remove white spaces in the name
+ if ($this->remove_spaces == TRUE)
+ {
+ $this->file_name = preg_replace("/\s+/", "_", $this->file_name);
+ }
+
+ /*
+ * Validate the file name
+ * This function appends an number onto the end of
+ * the file if one with the same name already exists.
+ * If it returns false there was a problem.
+ */
+ $this->orig_name = $this->file_name;
+
+ if ($this->overwrite == FALSE)
+ {
+ $this->file_name = $this->set_filename($this->upload_path, $this->file_name);
+
+ if ($this->file_name === FALSE)
+ {
+ return FALSE;
+ }
+ }
+
+ /*
+ * Move the file to the final destination
+ * To deal with different server configurations
+ * we'll attempt to use copy() first. If that fails
+ * we'll use move_uploaded_file(). One of the two should
+ * reliably work in most environments
+ */
+ if ( ! @copy($this->file_temp, $this->upload_path.$this->file_name))
+ {
+ if ( ! @move_uploaded_file($this->file_temp, $this->upload_path.$this->file_name))
+ {
+ $this->set_error('upload_destination_error');
+ return FALSE;
+ }
+ }
+
+ /*
+ * Run the file through the XSS hacking filter
+ * This helps prevent malicious code from being
+ * embedded within a file. Scripts can easily
+ * be disguised as images or other file types.
+ */
+ if ($this->xss_clean == TRUE)
+ {
+ $this->do_xss_clean();
+ }
+
+ /*
+ * Set the finalized image dimensions
+ * This sets the image width/height (assuming the
+ * file was an image). We use this information
+ * in the "data" function.
+ */
+ $this->set_image_properties($this->upload_path.$this->file_name);
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Finalized Data Array
+ *
+ * Returns an associative array containing all of the information
+ * related to the upload, allowing the developer easy access in one array.
+ *
+ * @access public
+ * @return array
+ */
+ function data()
+ {
+ return array (
+ 'file_name' => $this->file_name,
+ 'file_type' => $this->file_type,
+ 'file_path' => $this->upload_path,
+ 'full_path' => $this->upload_path.$this->file_name,
+ 'raw_name' => str_replace($this->file_ext, '', $this->file_name),
+ 'orig_name' => $this->orig_name,
+ 'file_ext' => $this->file_ext,
+ 'file_size' => $this->file_size,
+ 'is_image' => $this->is_image(),
+ 'image_width' => $this->image_width,
+ 'image_height' => $this->image_height,
+ 'image_type' => $this->image_type,
+ 'image_size_str' => $this->image_size_str,
+ );
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Upload Path
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_upload_path($path)
+ {
+ // Make sure it has a trailing slash
+ $this->upload_path = rtrim($path, '/').'/';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the file name
+ *
+ * This function takes a filename/path as input and looks for the
+ * existence of a file with the same name. If found, it will append a
+ * number to the end of the filename to avoid overwriting a pre-existing file.
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function set_filename($path, $filename)
+ {
+ if ($this->encrypt_name == TRUE)
+ {
+ mt_srand();
+ $filename = md5(uniqid(mt_rand())).$this->file_ext;
+ }
+
+ if ( ! file_exists($path.$filename))
+ {
+ return $filename;
+ }
+
+ $filename = str_replace($this->file_ext, '', $filename);
+
+ $new_filename = '';
+ for ($i = 1; $i < 100; $i++)
+ {
+ if ( ! file_exists($path.$filename.$i.$this->file_ext))
+ {
+ $new_filename = $filename.$i.$this->file_ext;
+ break;
+ }
+ }
+
+ if ($new_filename == '')
+ {
+ $this->set_error('upload_bad_filename');
+ return FALSE;
+ }
+ else
+ {
+ return $new_filename;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Maximum File Size
+ *
+ * @access public
+ * @param integer
+ * @return void
+ */
+ function set_max_filesize($n)
+ {
+ $this->max_size = ((int) $n < 0) ? 0: (int) $n;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Maximum File Name Length
+ *
+ * @access public
+ * @param integer
+ * @return void
+ */
+ function set_max_filename($n)
+ {
+ $this->max_filename = ((int) $n < 0) ? 0: (int) $n;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Maximum Image Width
+ *
+ * @access public
+ * @param integer
+ * @return void
+ */
+ function set_max_width($n)
+ {
+ $this->max_width = ((int) $n < 0) ? 0: (int) $n;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Maximum Image Height
+ *
+ * @access public
+ * @param integer
+ * @return void
+ */
+ function set_max_height($n)
+ {
+ $this->max_height = ((int) $n < 0) ? 0: (int) $n;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Allowed File Types
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_allowed_types($types)
+ {
+ $this->allowed_types = explode('|', $types);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Image Properties
+ *
+ * Uses GD to determine the width/height/type of image
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_image_properties($path = '')
+ {
+ if ( ! $this->is_image())
+ {
+ return;
+ }
+
+ if (function_exists('getimagesize'))
+ {
+ if (FALSE !== ($D = @getimagesize($path)))
+ {
+ $types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png');
+
+ $this->image_width = $D['0'];
+ $this->image_height = $D['1'];
+ $this->image_type = ( ! isset($types[$D['2']])) ? 'unknown' : $types[$D['2']];
+ $this->image_size_str = $D['3']; // string containing height and width
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set XSS Clean
+ *
+ * Enables the XSS flag so that the file that was uploaded
+ * will be run through the XSS filter.
+ *
+ * @access public
+ * @param bool
+ * @return void
+ */
+ function set_xss_clean($flag = FALSE)
+ {
+ $this->xss_clean = ($flag == TRUE) ? TRUE : FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Validate the image
+ *
+ * @access public
+ * @return bool
+ */
+ function is_image()
+ {
+ // IE will sometimes return odd mime-types during upload, so here we just standardize all
+ // jpegs or pngs to the same file type.
+
+ $png_mimes = array('image/x-png');
+ $jpeg_mimes = array('image/jpg', 'image/jpe', 'image/jpeg', 'image/pjpeg');
+
+ if (in_array($this->file_type, $png_mimes))
+ {
+ $this->file_type = 'image/png';
+ }
+
+ if (in_array($this->file_type, $jpeg_mimes))
+ {
+ $this->file_type = 'image/jpeg';
+ }
+
+ $img_mimes = array(
+ 'image/gif',
+ 'image/jpeg',
+ 'image/png',
+ );
+
+ return (in_array($this->file_type, $img_mimes, TRUE)) ? TRUE : FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Verify that the filetype is allowed
+ *
+ * @access public
+ * @return bool
+ */
+ function is_allowed_filetype()
+ {
+ if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types))
+ {
+ $this->set_error('upload_no_file_types');
+ return FALSE;
+ }
+
+ foreach ($this->allowed_types as $val)
+ {
+ $mime = $this->mimes_types(strtolower($val));
+
+ if (is_array($mime))
+ {
+ if (in_array($this->file_type, $mime, TRUE))
+ {
+ return TRUE;
+ }
+ }
+ else
+ {
+ if ($mime == $this->file_type)
+ {
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Verify that the file is within the allowed size
+ *
+ * @access public
+ * @return bool
+ */
+ function is_allowed_filesize()
+ {
+ if ($this->max_size != 0 AND $this->file_size > $this->max_size)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Verify that the image is within the allowed width/height
+ *
+ * @access public
+ * @return bool
+ */
+ function is_allowed_dimensions()
+ {
+ if ( ! $this->is_image())
+ {
+ return TRUE;
+ }
+
+ if (function_exists('getimagesize'))
+ {
+ $D = @getimagesize($this->file_temp);
+
+ if ($this->max_width > 0 AND $D['0'] > $this->max_width)
+ {
+ return FALSE;
+ }
+
+ if ($this->max_height > 0 AND $D['1'] > $this->max_height)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Validate Upload Path
+ *
+ * Verifies that it is a valid upload path with proper permissions.
+ *
+ *
+ * @access public
+ * @return bool
+ */
+ function validate_upload_path()
+ {
+ if ($this->upload_path == '')
+ {
+ $this->set_error('upload_no_filepath');
+ return FALSE;
+ }
+
+ if (function_exists('realpath') AND @realpath($this->upload_path) !== FALSE)
+ {
+ $this->upload_path = str_replace("\\", "/", realpath($this->upload_path));
+ }
+
+ if ( ! @is_dir($this->upload_path))
+ {
+ $this->set_error('upload_no_filepath');
+ return FALSE;
+ }
+
+ if ( ! is_really_writable($this->upload_path))
+ {
+ $this->set_error('upload_not_writable');
+ return FALSE;
+ }
+
+ $this->upload_path = preg_replace("/(.+?)\/*$/", "\\1/", $this->upload_path);
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Extract the file extension
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function get_extension($filename)
+ {
+ $x = explode('.', $filename);
+ return '.'.end($x);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Clean the file name for security
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function clean_file_name($filename)
+ {
+ $bad = array(
+ "<!--",
+ "-->",
+ "'",
+ "<",
+ ">",
+ '"',
+ '&',
+ '$',
+ '=',
+ ';',
+ '?',
+ '/',
+ "%20",
+ "%22",
+ "%3c", // <
+ "%253c", // <
+ "%3e", // >
+ "%0e", // >
+ "%28", // (
+ "%29", // )
+ "%2528", // (
+ "%26", // &
+ "%24", // $
+ "%3f", // ?
+ "%3b", // ;
+ "%3d" // =
+ );
+
+ $filename = str_replace($bad, '', $filename);
+
+ return stripslashes($filename);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Limit the File Name Length
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function limit_filename_length($filename, $length)
+ {
+ if (strlen($filename) < $length)
+ {
+ return $filename;
+ }
+
+ $ext = '';
+ if (strpos($filename, '.') !== FALSE)
+ {
+ $parts = explode('.', $filename);
+ $ext = '.'.array_pop($parts);
+ $filename = implode('.', $parts);
+ }
+
+ return substr($filename, 0, ($length - strlen($ext))).$ext;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Runs the file through the XSS clean function
+ *
+ * This prevents people from embedding malicious code in their files.
+ * I'm not sure that it won't negatively affect certain files in unexpected ways,
+ * but so far I haven't found that it causes trouble.
+ *
+ * @access public
+ * @return void
+ */
+ function do_xss_clean()
+ {
+ $file = $this->upload_path.$this->file_name;
+
+ if (filesize($file) == 0)
+ {
+ return FALSE;
+ }
+
+ if (($data = @file_get_contents($file)) === FALSE)
+ {
+ return FALSE;
+ }
+
+ if ( ! $fp = @fopen($file, FOPEN_READ_WRITE))
+ {
+ return FALSE;
+ }
+
+ $CI =& get_instance();
+ $data = $CI->input->xss_clean($data);
+
+ flock($fp, LOCK_EX);
+ fwrite($fp, $data);
+ flock($fp, LOCK_UN);
+ fclose($fp);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set an error message
+ *
+ * @access public
+ * @param string
+ * @return void
+ */
+ function set_error($msg)
+ {
+ $CI =& get_instance();
+ $CI->lang->load('upload');
+
+ if (is_array($msg))
+ {
+ foreach ($msg as $val)
+ {
+ $msg = ($CI->lang->line($val) == FALSE) ? $val : $CI->lang->line($val);
+ $this->error_msg[] = $msg;
+ log_message('error', $msg);
+ }
+ }
+ else
+ {
+ $msg = ($CI->lang->line($msg) == FALSE) ? $msg : $CI->lang->line($msg);
+ $this->error_msg[] = $msg;
+ log_message('error', $msg);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Display the error message
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function display_errors($open = '<p>', $close = '</p>')
+ {
+ $str = '';
+ foreach ($this->error_msg as $val)
+ {
+ $str .= $open.$val.$close;
+ }
+
+ return $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * List of Mime Types
+ *
+ * This is a list of mime types. We use it to validate
+ * the "allowed types" set by the developer
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function mimes_types($mime)
+ {
+ global $mimes;
+
+ if (count($this->mimes) == 0)
+ {
+ if (@require_once(APPPATH.'config/mimes'.EXT))
+ {
+ $this->mimes = $mimes;
+ unset($mimes);
+ }
+ }
+
+ return ( ! isset($this->mimes[$mime])) ? FALSE : $this->mimes[$mime];
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep Filename
+ *
+ * Prevents possible script execution from Apache's handling of files multiple extensions
+ * http://httpd.apache.org/docs/1.3/mod/mod_mime.html#multipleext
+ *
+ * @access private
+ * @param string
+ * @return string
+ */
+ function _prep_filename($filename)
+ {
+ if (strpos($filename, '.') === FALSE)
+ {
+ return $filename;
+ }
+
+ $parts = explode('.', $filename);
+ $ext = array_pop($parts);
+ $filename = array_shift($parts);
+
+ foreach ($parts as $part)
+ {
+ if ($this->mimes_types(strtolower($part)) === FALSE)
+ {
+ $filename .= '.'.$part.'_';
+ }
+ else
+ {
+ $filename .= '.'.$part;
+ }
+ }
+
+ $filename .= '.'.$ext;
+
+ return $filename;
+ }
+
+ // --------------------------------------------------------------------
+
+}
+// END Upload Class
+
+/* End of file Upload.php */
/* Location: ./system/libraries/Upload.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * User Agent Class\r
- *\r
- * Identifies the platform, browser, robot, or mobile devise of the browsing agent\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category User Agent\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/user_agent.html\r
- */\r
-class CI_User_agent {\r
-\r
- var $agent = NULL;\r
- \r
- var $is_browser = FALSE;\r
- var $is_robot = FALSE;\r
- var $is_mobile = FALSE;\r
-\r
- var $languages = array();\r
- var $charsets = array();\r
- \r
- var $platforms = array();\r
- var $browsers = array();\r
- var $mobiles = array();\r
- var $robots = array();\r
- \r
- var $platform = '';\r
- var $browser = '';\r
- var $version = '';\r
- var $mobile = '';\r
- var $robot = '';\r
- \r
- /**\r
- * Constructor\r
- *\r
- * Sets the User Agent and runs the compilation routine\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function CI_User_agent()\r
- {\r
- if (isset($_SERVER['HTTP_USER_AGENT']))\r
- {\r
- $this->agent = trim($_SERVER['HTTP_USER_AGENT']);\r
- }\r
- \r
- if ( ! is_null($this->agent))\r
- {\r
- if ($this->_load_agent_file())\r
- {\r
- $this->_compile_data();\r
- }\r
- }\r
- \r
- log_message('debug', "User Agent Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Compile the User Agent Data\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _load_agent_file()\r
- {\r
- if ( ! @include(APPPATH.'config/user_agents'.EXT))\r
- {\r
- return FALSE;\r
- }\r
- \r
- $return = FALSE;\r
- \r
- if (isset($platforms))\r
- {\r
- $this->platforms = $platforms;\r
- unset($platforms);\r
- $return = TRUE;\r
- }\r
-\r
- if (isset($browsers))\r
- {\r
- $this->browsers = $browsers;\r
- unset($browsers);\r
- $return = TRUE;\r
- }\r
-\r
- if (isset($mobiles))\r
- {\r
- $this->mobiles = $mobiles;\r
- unset($mobiles);\r
- $return = TRUE;\r
- }\r
- \r
- if (isset($robots))\r
- {\r
- $this->robots = $robots;\r
- unset($robots);\r
- $return = TRUE;\r
- }\r
-\r
- return $return;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Compile the User Agent Data\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _compile_data()\r
- {\r
- $this->_set_platform();\r
- \r
- foreach (array('_set_browser', '_set_robot', '_set_mobile') as $function)\r
- {\r
- if ($this->$function() === TRUE)\r
- {\r
- break;\r
- }\r
- } \r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the Platform\r
- *\r
- * @access private\r
- * @return mixed\r
- */ \r
- function _set_platform()\r
- {\r
- if (is_array($this->platforms) AND count($this->platforms) > 0)\r
- {\r
- foreach ($this->platforms as $key => $val)\r
- {\r
- if (preg_match("|".preg_quote($key)."|i", $this->agent))\r
- {\r
- $this->platform = $val;\r
- return TRUE;\r
- }\r
- }\r
- }\r
- $this->platform = 'Unknown Platform';\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the Browser\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _set_browser()\r
- {\r
- if (is_array($this->browsers) AND count($this->browsers) > 0)\r
- {\r
- foreach ($this->browsers as $key => $val)\r
- { \r
- if (preg_match("|".preg_quote($key).".*?([0-9\.]+)|i", $this->agent, $match))\r
- {\r
- $this->is_browser = TRUE;\r
- $this->version = $match[1];\r
- $this->browser = $val;\r
- $this->_set_mobile();\r
- return TRUE;\r
- }\r
- }\r
- }\r
- return FALSE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the Robot\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _set_robot()\r
- {\r
- if (is_array($this->robots) AND count($this->robots) > 0)\r
- { \r
- foreach ($this->robots as $key => $val)\r
- {\r
- if (preg_match("|".preg_quote($key)."|i", $this->agent))\r
- {\r
- $this->is_robot = TRUE;\r
- $this->robot = $val;\r
- return TRUE;\r
- }\r
- }\r
- }\r
- return FALSE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the Mobile Device\r
- *\r
- * @access private\r
- * @return bool\r
- */ \r
- function _set_mobile()\r
- {\r
- if (is_array($this->mobiles) AND count($this->mobiles) > 0)\r
- { \r
- foreach ($this->mobiles as $key => $val)\r
- {\r
- if (FALSE !== (strpos(strtolower($this->agent), $key)))\r
- {\r
- $this->is_mobile = TRUE;\r
- $this->mobile = $val;\r
- return TRUE;\r
- }\r
- }\r
- } \r
- return FALSE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the accepted languages\r
- *\r
- * @access private\r
- * @return void\r
- */ \r
- function _set_languages()\r
- {\r
- if ((count($this->languages) == 0) AND isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) AND $_SERVER['HTTP_ACCEPT_LANGUAGE'] != '')\r
- {\r
- $languages = preg_replace('/(;q=[0-9\.]+)/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_LANGUAGE'])));\r
- \r
- $this->languages = explode(',', $languages);\r
- }\r
- \r
- if (count($this->languages) == 0)\r
- {\r
- $this->languages = array('Undefined');\r
- } \r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set the accepted character sets\r
- *\r
- * @access private\r
- * @return void\r
- */ \r
- function _set_charsets()\r
- { \r
- if ((count($this->charsets) == 0) AND isset($_SERVER['HTTP_ACCEPT_CHARSET']) AND $_SERVER['HTTP_ACCEPT_CHARSET'] != '')\r
- {\r
- $charsets = preg_replace('/(;q=.+)/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_CHARSET'])));\r
- \r
- $this->charsets = explode(',', $charsets);\r
- }\r
- \r
- if (count($this->charsets) == 0)\r
- {\r
- $this->charsets = array('Undefined');\r
- } \r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Is Browser\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function is_browser()\r
- {\r
- return $this->is_browser;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Is Robot\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function is_robot()\r
- {\r
- return $this->is_robot;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Is Mobile\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function is_mobile()\r
- {\r
- return $this->is_mobile;\r
- } \r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Is this a referral from another site?\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function is_referral()\r
- {\r
- return ( ! isset($_SERVER['HTTP_REFERER']) OR $_SERVER['HTTP_REFERER'] == '') ? FALSE : TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Agent String\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function agent_string()\r
- {\r
- return $this->agent;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get Platform\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function platform()\r
- {\r
- return $this->platform;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get Browser Name\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function browser()\r
- {\r
- return $this->browser;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get the Browser Version\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function version()\r
- {\r
- return $this->version;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get The Robot Name\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function robot()\r
- {\r
- return $this->robot;\r
- }\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get the Mobile Device\r
- *\r
- * @access public\r
- * @return string\r
- */ \r
- function mobile()\r
- {\r
- return $this->mobile;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get the referrer\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function referrer()\r
- {\r
- return ( ! isset($_SERVER['HTTP_REFERER']) OR $_SERVER['HTTP_REFERER'] == '') ? '' : trim($_SERVER['HTTP_REFERER']);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get the accepted languages\r
- *\r
- * @access public\r
- * @return array\r
- */ \r
- function languages()\r
- {\r
- if (count($this->languages) == 0)\r
- {\r
- $this->_set_languages();\r
- }\r
- \r
- return $this->languages;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Get the accepted Character Sets\r
- *\r
- * @access public\r
- * @return array\r
- */ \r
- function charsets()\r
- {\r
- if (count($this->charsets) == 0)\r
- {\r
- $this->_set_charsets();\r
- }\r
- \r
- return $this->charsets;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Test for a particular language\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function accept_lang($lang = 'en')\r
- {\r
- return (in_array(strtolower($lang), $this->languages(), TRUE)) ? TRUE : FALSE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Test for a particular character set\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function accept_charset($charset = 'utf-8')\r
- {\r
- return (in_array(strtolower($charset), $this->charsets(), TRUE)) ? TRUE : FALSE;\r
- }\r
- \r
- \r
-}\r
-\r
-\r
-/* End of file User_agent.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * User Agent Class
+ *
+ * Identifies the platform, browser, robot, or mobile devise of the browsing agent
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category User Agent
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/user_agent.html
+ */
+class CI_User_agent {
+
+ var $agent = NULL;
+
+ var $is_browser = FALSE;
+ var $is_robot = FALSE;
+ var $is_mobile = FALSE;
+
+ var $languages = array();
+ var $charsets = array();
+
+ var $platforms = array();
+ var $browsers = array();
+ var $mobiles = array();
+ var $robots = array();
+
+ var $platform = '';
+ var $browser = '';
+ var $version = '';
+ var $mobile = '';
+ var $robot = '';
+
+ /**
+ * Constructor
+ *
+ * Sets the User Agent and runs the compilation routine
+ *
+ * @access public
+ * @return void
+ */
+ function CI_User_agent()
+ {
+ if (isset($_SERVER['HTTP_USER_AGENT']))
+ {
+ $this->agent = trim($_SERVER['HTTP_USER_AGENT']);
+ }
+
+ if ( ! is_null($this->agent))
+ {
+ if ($this->_load_agent_file())
+ {
+ $this->_compile_data();
+ }
+ }
+
+ log_message('debug', "User Agent Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Compile the User Agent Data
+ *
+ * @access private
+ * @return bool
+ */
+ function _load_agent_file()
+ {
+ if ( ! @include(APPPATH.'config/user_agents'.EXT))
+ {
+ return FALSE;
+ }
+
+ $return = FALSE;
+
+ if (isset($platforms))
+ {
+ $this->platforms = $platforms;
+ unset($platforms);
+ $return = TRUE;
+ }
+
+ if (isset($browsers))
+ {
+ $this->browsers = $browsers;
+ unset($browsers);
+ $return = TRUE;
+ }
+
+ if (isset($mobiles))
+ {
+ $this->mobiles = $mobiles;
+ unset($mobiles);
+ $return = TRUE;
+ }
+
+ if (isset($robots))
+ {
+ $this->robots = $robots;
+ unset($robots);
+ $return = TRUE;
+ }
+
+ return $return;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Compile the User Agent Data
+ *
+ * @access private
+ * @return bool
+ */
+ function _compile_data()
+ {
+ $this->_set_platform();
+
+ foreach (array('_set_browser', '_set_robot', '_set_mobile') as $function)
+ {
+ if ($this->$function() === TRUE)
+ {
+ break;
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the Platform
+ *
+ * @access private
+ * @return mixed
+ */
+ function _set_platform()
+ {
+ if (is_array($this->platforms) AND count($this->platforms) > 0)
+ {
+ foreach ($this->platforms as $key => $val)
+ {
+ if (preg_match("|".preg_quote($key)."|i", $this->agent))
+ {
+ $this->platform = $val;
+ return TRUE;
+ }
+ }
+ }
+ $this->platform = 'Unknown Platform';
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the Browser
+ *
+ * @access private
+ * @return bool
+ */
+ function _set_browser()
+ {
+ if (is_array($this->browsers) AND count($this->browsers) > 0)
+ {
+ foreach ($this->browsers as $key => $val)
+ {
+ if (preg_match("|".preg_quote($key).".*?([0-9\.]+)|i", $this->agent, $match))
+ {
+ $this->is_browser = TRUE;
+ $this->version = $match[1];
+ $this->browser = $val;
+ $this->_set_mobile();
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the Robot
+ *
+ * @access private
+ * @return bool
+ */
+ function _set_robot()
+ {
+ if (is_array($this->robots) AND count($this->robots) > 0)
+ {
+ foreach ($this->robots as $key => $val)
+ {
+ if (preg_match("|".preg_quote($key)."|i", $this->agent))
+ {
+ $this->is_robot = TRUE;
+ $this->robot = $val;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the Mobile Device
+ *
+ * @access private
+ * @return bool
+ */
+ function _set_mobile()
+ {
+ if (is_array($this->mobiles) AND count($this->mobiles) > 0)
+ {
+ foreach ($this->mobiles as $key => $val)
+ {
+ if (FALSE !== (strpos(strtolower($this->agent), $key)))
+ {
+ $this->is_mobile = TRUE;
+ $this->mobile = $val;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the accepted languages
+ *
+ * @access private
+ * @return void
+ */
+ function _set_languages()
+ {
+ if ((count($this->languages) == 0) AND isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) AND $_SERVER['HTTP_ACCEPT_LANGUAGE'] != '')
+ {
+ $languages = preg_replace('/(;q=[0-9\.]+)/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_LANGUAGE'])));
+
+ $this->languages = explode(',', $languages);
+ }
+
+ if (count($this->languages) == 0)
+ {
+ $this->languages = array('Undefined');
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set the accepted character sets
+ *
+ * @access private
+ * @return void
+ */
+ function _set_charsets()
+ {
+ if ((count($this->charsets) == 0) AND isset($_SERVER['HTTP_ACCEPT_CHARSET']) AND $_SERVER['HTTP_ACCEPT_CHARSET'] != '')
+ {
+ $charsets = preg_replace('/(;q=.+)/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_CHARSET'])));
+
+ $this->charsets = explode(',', $charsets);
+ }
+
+ if (count($this->charsets) == 0)
+ {
+ $this->charsets = array('Undefined');
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Is Browser
+ *
+ * @access public
+ * @return bool
+ */
+ function is_browser()
+ {
+ return $this->is_browser;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Is Robot
+ *
+ * @access public
+ * @return bool
+ */
+ function is_robot()
+ {
+ return $this->is_robot;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Is Mobile
+ *
+ * @access public
+ * @return bool
+ */
+ function is_mobile()
+ {
+ return $this->is_mobile;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Is this a referral from another site?
+ *
+ * @access public
+ * @return bool
+ */
+ function is_referral()
+ {
+ return ( ! isset($_SERVER['HTTP_REFERER']) OR $_SERVER['HTTP_REFERER'] == '') ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Agent String
+ *
+ * @access public
+ * @return string
+ */
+ function agent_string()
+ {
+ return $this->agent;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Platform
+ *
+ * @access public
+ * @return string
+ */
+ function platform()
+ {
+ return $this->platform;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get Browser Name
+ *
+ * @access public
+ * @return string
+ */
+ function browser()
+ {
+ return $this->browser;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get the Browser Version
+ *
+ * @access public
+ * @return string
+ */
+ function version()
+ {
+ return $this->version;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get The Robot Name
+ *
+ * @access public
+ * @return string
+ */
+ function robot()
+ {
+ return $this->robot;
+ }
+ // --------------------------------------------------------------------
+
+ /**
+ * Get the Mobile Device
+ *
+ * @access public
+ * @return string
+ */
+ function mobile()
+ {
+ return $this->mobile;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get the referrer
+ *
+ * @access public
+ * @return bool
+ */
+ function referrer()
+ {
+ return ( ! isset($_SERVER['HTTP_REFERER']) OR $_SERVER['HTTP_REFERER'] == '') ? '' : trim($_SERVER['HTTP_REFERER']);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get the accepted languages
+ *
+ * @access public
+ * @return array
+ */
+ function languages()
+ {
+ if (count($this->languages) == 0)
+ {
+ $this->_set_languages();
+ }
+
+ return $this->languages;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get the accepted Character Sets
+ *
+ * @access public
+ * @return array
+ */
+ function charsets()
+ {
+ if (count($this->charsets) == 0)
+ {
+ $this->_set_charsets();
+ }
+
+ return $this->charsets;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Test for a particular language
+ *
+ * @access public
+ * @return bool
+ */
+ function accept_lang($lang = 'en')
+ {
+ return (in_array(strtolower($lang), $this->languages(), TRUE)) ? TRUE : FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Test for a particular character set
+ *
+ * @access public
+ * @return bool
+ */
+ function accept_charset($charset = 'utf-8')
+ {
+ return (in_array(strtolower($charset), $this->charsets(), TRUE)) ? TRUE : FALSE;
+ }
+
+
+}
+
+
+/* End of file User_agent.php */
/* Location: ./system/libraries/User_agent.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Validation Class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Validation\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/validation.html\r
- */\r
-class CI_Validation {\r
- \r
- var $CI;\r
- var $error_string = '';\r
- var $_error_array = array();\r
- var $_rules = array();\r
- var $_fields = array();\r
- var $_error_messages = array();\r
- var $_current_field = '';\r
- var $_safe_form_data = FALSE;\r
- var $_error_prefix = '<p>';\r
- var $_error_suffix = '</p>';\r
-\r
- \r
-\r
- /**\r
- * Constructor\r
- *\r
- */ \r
- function CI_Validation()\r
- { \r
- $this->CI =& get_instance();\r
- \r
- if (function_exists('mb_internal_encoding'))\r
- {\r
- mb_internal_encoding($this->CI->config->item('charset'));\r
- }\r
- \r
- log_message('debug', "Validation Class Initialized");\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Fields\r
- *\r
- * This function takes an array of field names as input\r
- * and generates class variables with the same name, which will\r
- * either be blank or contain the $_POST value corresponding to it\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return void\r
- */\r
- function set_fields($data = '', $field = '')\r
- { \r
- if ($data == '')\r
- {\r
- if (count($this->_fields) == 0)\r
- {\r
- return FALSE;\r
- }\r
- }\r
- else\r
- {\r
- if ( ! is_array($data))\r
- {\r
- $data = array($data => $field);\r
- }\r
- \r
- if (count($data) > 0)\r
- {\r
- $this->_fields = $data;\r
- }\r
- } \r
- \r
- foreach($this->_fields as $key => $val)\r
- {\r
- $this->$key = ( ! isset($_POST[$key])) ? '' : $this->prep_for_form($_POST[$key]);\r
- \r
- $error = $key.'_error';\r
- if ( ! isset($this->$error))\r
- {\r
- $this->$error = '';\r
- }\r
- } \r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Rules\r
- *\r
- * This function takes an array of field names and validation\r
- * rules as input ad simply stores is for use later.\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @return void\r
- */\r
- function set_rules($data, $rules = '')\r
- {\r
- if ( ! is_array($data))\r
- {\r
- if ($rules == '')\r
- return;\r
- \r
- $data = array($data => $rules);\r
- }\r
- \r
- foreach ($data as $key => $val)\r
- {\r
- $this->_rules[$key] = $val;\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Error Message\r
- *\r
- * Lets users set their own error messages on the fly. Note: The key\r
- * name has to match the function name that it corresponds to.\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */\r
- function set_message($lang, $val = '')\r
- {\r
- if ( ! is_array($lang))\r
- {\r
- $lang = array($lang => $val);\r
- }\r
- \r
- $this->_error_messages = array_merge($this->_error_messages, $lang);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set The Error Delimiter\r
- *\r
- * Permits a prefix/suffix to be added to each error message\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return void\r
- */ \r
- function set_error_delimiters($prefix = '<p>', $suffix = '</p>')\r
- {\r
- $this->_error_prefix = $prefix;\r
- $this->_error_suffix = $suffix;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Run the Validator\r
- *\r
- * This function does all the work.\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function run()\r
- {\r
- // Do we even have any data to process? Mm?\r
- if (count($_POST) == 0 OR count($this->_rules) == 0)\r
- {\r
- return FALSE;\r
- }\r
- \r
- // Load the language file containing error messages\r
- $this->CI->lang->load('validation');\r
- \r
- // Cycle through the rules and test for errors\r
- foreach ($this->_rules as $field => $rules)\r
- {\r
- //Explode out the rules!\r
- $ex = explode('|', $rules);\r
-\r
- // Is the field required? If not, if the field is blank we'll move on to the next test\r
- if ( ! in_array('required', $ex, TRUE))\r
- {\r
- if ( ! isset($_POST[$field]) OR $_POST[$field] == '')\r
- {\r
- continue;\r
- }\r
- }\r
- \r
- /*\r
- * Are we dealing with an "isset" rule?\r
- *\r
- * Before going further, we'll see if one of the rules\r
- * is to check whether the item is set (typically this\r
- * applies only to checkboxes). If so, we'll\r
- * test for it here since there's not reason to go\r
- * further\r
- */\r
- if ( ! isset($_POST[$field]))\r
- { \r
- if (in_array('isset', $ex, TRUE) OR in_array('required', $ex))\r
- {\r
- if ( ! isset($this->_error_messages['isset']))\r
- {\r
- if (FALSE === ($line = $this->CI->lang->line('isset')))\r
- {\r
- $line = 'The field was not set';\r
- } \r
- }\r
- else\r
- {\r
- $line = $this->_error_messages['isset'];\r
- }\r
- \r
- // Build the error message\r
- $mfield = ( ! isset($this->_fields[$field])) ? $field : $this->_fields[$field];\r
- $message = sprintf($line, $mfield);\r
-\r
- // Set the error variable. Example: $this->username_error\r
- $error = $field.'_error';\r
- $this->$error = $this->_error_prefix.$message.$this->_error_suffix;\r
- $this->_error_array[] = $message;\r
- }\r
- \r
- continue;\r
- }\r
- \r
- /*\r
- * Set the current field\r
- *\r
- * The various prepping functions need to know the\r
- * current field name so they can do this:\r
- *\r
- * $_POST[$this->_current_field] == 'bla bla';\r
- */\r
- $this->_current_field = $field;\r
-\r
- // Cycle through the rules!\r
- foreach ($ex As $rule)\r
- {\r
- // Is the rule a callback? \r
- $callback = FALSE;\r
- if (substr($rule, 0, 9) == 'callback_')\r
- {\r
- $rule = substr($rule, 9);\r
- $callback = TRUE;\r
- }\r
- \r
- // Strip the parameter (if exists) from the rule\r
- // Rules can contain a parameter: max_length[5]\r
- $param = FALSE;\r
- if (preg_match("/(.*?)\[(.*?)\]/", $rule, $match))\r
- {\r
- $rule = $match[1];\r
- $param = $match[2];\r
- }\r
- \r
- // Call the function that corresponds to the rule\r
- if ($callback === TRUE)\r
- {\r
- if ( ! method_exists($this->CI, $rule))\r
- { \r
- continue;\r
- }\r
- \r
- $result = $this->CI->$rule($_POST[$field], $param); \r
- \r
- // If the field isn't required and we just processed a callback we'll move on...\r
- if ( ! in_array('required', $ex, TRUE) AND $result !== FALSE)\r
- {\r
- continue 2;\r
- }\r
- \r
- }\r
- else\r
- { \r
- if ( ! method_exists($this, $rule))\r
- {\r
- /*\r
- * Run the native PHP function if called for\r
- *\r
- * If our own wrapper function doesn't exist we see\r
- * if a native PHP function does. Users can use\r
- * any native PHP function call that has one param.\r
- */\r
- if (function_exists($rule))\r
- {\r
- $_POST[$field] = $rule($_POST[$field]);\r
- $this->$field = $_POST[$field];\r
- }\r
- \r
- continue;\r
- }\r
- \r
- $result = $this->$rule($_POST[$field], $param);\r
- }\r
- \r
- // Did the rule test negatively? If so, grab the error.\r
- if ($result === FALSE)\r
- {\r
- if ( ! isset($this->_error_messages[$rule]))\r
- {\r
- if (FALSE === ($line = $this->CI->lang->line($rule)))\r
- {\r
- $line = 'Unable to access an error message corresponding to your field name.';\r
- } \r
- }\r
- else\r
- {\r
- $line = $this->_error_messages[$rule];\r
- } \r
-\r
- // Build the error message\r
- $mfield = ( ! isset($this->_fields[$field])) ? $field : $this->_fields[$field];\r
- $mparam = ( ! isset($this->_fields[$param])) ? $param : $this->_fields[$param];\r
- $message = sprintf($line, $mfield, $mparam);\r
- \r
- // Set the error variable. Example: $this->username_error\r
- $error = $field.'_error';\r
- $this->$error = $this->_error_prefix.$message.$this->_error_suffix;\r
-\r
- // Add the error to the error array\r
- $this->_error_array[] = $message; \r
- continue 2;\r
- } \r
- }\r
- \r
- }\r
- \r
- $total_errors = count($this->_error_array);\r
-\r
- /*\r
- * Recompile the class variables\r
- *\r
- * If any prepping functions were called the $_POST data\r
- * might now be different then the corresponding class\r
- * variables so we'll set them anew.\r
- */ \r
- if ($total_errors > 0)\r
- {\r
- $this->_safe_form_data = TRUE;\r
- }\r
- \r
- $this->set_fields();\r
-\r
- // Did we end up with any errors?\r
- if ($total_errors == 0)\r
- {\r
- return TRUE;\r
- }\r
- \r
- // Generate the error string\r
- foreach ($this->_error_array as $val)\r
- {\r
- $this->error_string .= $this->_error_prefix.$val.$this->_error_suffix."\n";\r
- }\r
-\r
- return FALSE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Required\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
- function required($str)\r
- {\r
- if ( ! is_array($str))\r
- {\r
- return (trim($str) == '') ? FALSE : TRUE;\r
- }\r
- else\r
- {\r
- return ( ! empty($str));\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Match one field to another\r
- *\r
- * @access public\r
- * @param string\r
- * @param field\r
- * @return bool\r
- */\r
- function matches($str, $field)\r
- {\r
- if ( ! isset($_POST[$field]))\r
- {\r
- return FALSE;\r
- }\r
- \r
- return ($str !== $_POST[$field]) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Minimum Length\r
- *\r
- * @access public\r
- * @param string\r
- * @param value\r
- * @return bool\r
- */ \r
- function min_length($str, $val)\r
- {\r
- if (preg_match("/[^0-9]/", $val))\r
- {\r
- return FALSE;\r
- }\r
-\r
- if (function_exists('mb_strlen'))\r
- {\r
- return (mb_strlen($str) < $val) ? FALSE : TRUE; \r
- }\r
-\r
- return (strlen($str) < $val) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Max Length\r
- *\r
- * @access public\r
- * @param string\r
- * @param value\r
- * @return bool\r
- */ \r
- function max_length($str, $val)\r
- {\r
- if (preg_match("/[^0-9]/", $val))\r
- {\r
- return FALSE;\r
- }\r
- \r
- if (function_exists('mb_strlen'))\r
- {\r
- return (mb_strlen($str) > $val) ? FALSE : TRUE; \r
- }\r
-\r
- return (strlen($str) > $val) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Exact Length\r
- *\r
- * @access public\r
- * @param string\r
- * @param value\r
- * @return bool\r
- */ \r
- function exact_length($str, $val)\r
- {\r
- if (preg_match("/[^0-9]/", $val))\r
- {\r
- return FALSE;\r
- }\r
- \r
- if (function_exists('mb_strlen'))\r
- {\r
- return (mb_strlen($str) != $val) ? FALSE : TRUE; \r
- }\r
-\r
- return (strlen($str) != $val) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Valid Email\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function valid_email($str)\r
- {\r
- return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Valid Emails\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function valid_emails($str)\r
- {\r
- if (strpos($str, ',') === FALSE)\r
- {\r
- return $this->valid_email(trim($str));\r
- }\r
- \r
- foreach(explode(',', $str) as $email)\r
- {\r
- if (trim($email) != '' && $this->valid_email(trim($email)) === FALSE)\r
- {\r
- return FALSE;\r
- }\r
- }\r
- \r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Validate IP Address\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function valid_ip($ip)\r
- {\r
- return $this->CI->input->valid_ip($ip);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Alpha\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function alpha($str)\r
- {\r
- return ( ! preg_match("/^([a-z])+$/i", $str)) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Alpha-numeric\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function alpha_numeric($str)\r
- {\r
- return ( ! preg_match("/^([a-z0-9])+$/i", $str)) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Alpha-numeric with underscores and dashes\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function alpha_dash($str)\r
- {\r
- return ( ! preg_match("/^([-a-z0-9_-])+$/i", $str)) ? FALSE : TRUE;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Numeric\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function numeric($str)\r
- {\r
- return (bool)preg_match( '/^[\-+]?[0-9]*\.?[0-9]+$/', $str);\r
-\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Is Numeric\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
- function is_numeric($str)\r
- {\r
- return ( ! is_numeric($str)) ? FALSE : TRUE;\r
- } \r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Integer\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */ \r
- function integer($str)\r
- {\r
- return (bool)preg_match( '/^[\-+]?[0-9]+$/', $str);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Is a Natural number (0,1,2,3, etc.)\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
- function is_natural($str)\r
- { \r
- return (bool)preg_match( '/^[0-9]+$/', $str);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Is a Natural number, but not a zero (1,2,3, etc.)\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
- function is_natural_no_zero($str)\r
- { \r
- if ( ! preg_match( '/^[0-9]+$/', $str))\r
- {\r
- return FALSE;\r
- }\r
- \r
- if ($str == 0)\r
- {\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Valid Base64\r
- *\r
- * Tests a string for characters outside of the Base64 alphabet\r
- * as defined by RFC 2045 http://www.faqs.org/rfcs/rfc2045\r
- *\r
- * @access public\r
- * @param string\r
- * @return bool\r
- */\r
- function valid_base64($str)\r
- {\r
- return (bool) ! preg_match('/[^a-zA-Z0-9\/\+=]/', $str);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Select\r
- *\r
- * Enables pull-down lists to be set to the value the user\r
- * selected in the event of an error\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */ \r
- function set_select($field = '', $value = '')\r
- {\r
- if ($field == '' OR $value == '' OR ! isset($_POST[$field]))\r
- {\r
- return '';\r
- }\r
- \r
- if ($_POST[$field] == $value)\r
- {\r
- return ' selected="selected"';\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Radio\r
- *\r
- * Enables radio buttons to be set to the value the user\r
- * selected in the event of an error\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */ \r
- function set_radio($field = '', $value = '')\r
- {\r
- if ($field == '' OR $value == '' OR ! isset($_POST[$field]))\r
- {\r
- return '';\r
- }\r
- \r
- if ($_POST[$field] == $value)\r
- {\r
- return ' checked="checked"';\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Set Checkbox\r
- *\r
- * Enables checkboxes to be set to the value the user\r
- * selected in the event of an error\r
- *\r
- * @access public\r
- * @param string\r
- * @param string\r
- * @return string\r
- */ \r
- function set_checkbox($field = '', $value = '')\r
- {\r
- if ($field == '' OR $value == '' OR ! isset($_POST[$field]))\r
- {\r
- return '';\r
- }\r
- \r
- if ($_POST[$field] == $value)\r
- {\r
- return ' checked="checked"';\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Prep data for form\r
- *\r
- * This function allows HTML to be safely shown in a form.\r
- * Special characters are converted.\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */\r
- function prep_for_form($data = '')\r
- {\r
- if (is_array($data))\r
- {\r
- foreach ($data as $key => $val)\r
- {\r
- $data[$key] = $this->prep_for_form($val);\r
- }\r
- \r
- return $data;\r
- }\r
- \r
- if ($this->_safe_form_data == FALSE OR $data == '')\r
- {\r
- return $data;\r
- }\r
-\r
- return str_replace(array("'", '"', '<', '>'), array("'", """, '<', '>'), stripslashes($data));\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Prep URL\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function prep_url($str = '')\r
- {\r
- if ($str == 'http://' OR $str == '')\r
- {\r
- $_POST[$this->_current_field] = '';\r
- return;\r
- }\r
- \r
- if (substr($str, 0, 7) != 'http://' && substr($str, 0, 8) != 'https://')\r
- {\r
- $str = 'http://'.$str;\r
- }\r
- \r
- $_POST[$this->_current_field] = $str;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Strip Image Tags\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function strip_image_tags($str)\r
- {\r
- $_POST[$this->_current_field] = $this->CI->input->strip_image_tags($str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * XSS Clean\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function xss_clean($str)\r
- {\r
- $_POST[$this->_current_field] = $this->CI->input->xss_clean($str);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Convert PHP tags to entities\r
- *\r
- * @access public\r
- * @param string\r
- * @return string\r
- */ \r
- function encode_php_tags($str)\r
- {\r
- $_POST[$this->_current_field] = str_replace(array('<?php', '<?PHP', '<?', '?>'), array('<?php', '<?PHP', '<?', '?>'), $str);\r
- }\r
-\r
-}\r
-// END Validation Class\r
-\r
-/* End of file Validation.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Validation Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Validation
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/validation.html
+ */
+class CI_Validation {
+
+ var $CI;
+ var $error_string = '';
+ var $_error_array = array();
+ var $_rules = array();
+ var $_fields = array();
+ var $_error_messages = array();
+ var $_current_field = '';
+ var $_safe_form_data = FALSE;
+ var $_error_prefix = '<p>';
+ var $_error_suffix = '</p>';
+
+
+
+ /**
+ * Constructor
+ *
+ */
+ function CI_Validation()
+ {
+ $this->CI =& get_instance();
+
+ if (function_exists('mb_internal_encoding'))
+ {
+ mb_internal_encoding($this->CI->config->item('charset'));
+ }
+
+ log_message('debug', "Validation Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Fields
+ *
+ * This function takes an array of field names as input
+ * and generates class variables with the same name, which will
+ * either be blank or contain the $_POST value corresponding to it
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return void
+ */
+ function set_fields($data = '', $field = '')
+ {
+ if ($data == '')
+ {
+ if (count($this->_fields) == 0)
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if ( ! is_array($data))
+ {
+ $data = array($data => $field);
+ }
+
+ if (count($data) > 0)
+ {
+ $this->_fields = $data;
+ }
+ }
+
+ foreach($this->_fields as $key => $val)
+ {
+ $this->$key = ( ! isset($_POST[$key])) ? '' : $this->prep_for_form($_POST[$key]);
+
+ $error = $key.'_error';
+ if ( ! isset($this->$error))
+ {
+ $this->$error = '';
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Rules
+ *
+ * This function takes an array of field names and validation
+ * rules as input ad simply stores is for use later.
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @return void
+ */
+ function set_rules($data, $rules = '')
+ {
+ if ( ! is_array($data))
+ {
+ if ($rules == '')
+ return;
+
+ $data = array($data => $rules);
+ }
+
+ foreach ($data as $key => $val)
+ {
+ $this->_rules[$key] = $val;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Error Message
+ *
+ * Lets users set their own error messages on the fly. Note: The key
+ * name has to match the function name that it corresponds to.
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function set_message($lang, $val = '')
+ {
+ if ( ! is_array($lang))
+ {
+ $lang = array($lang => $val);
+ }
+
+ $this->_error_messages = array_merge($this->_error_messages, $lang);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set The Error Delimiter
+ *
+ * Permits a prefix/suffix to be added to each error message
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return void
+ */
+ function set_error_delimiters($prefix = '<p>', $suffix = '</p>')
+ {
+ $this->_error_prefix = $prefix;
+ $this->_error_suffix = $suffix;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Run the Validator
+ *
+ * This function does all the work.
+ *
+ * @access public
+ * @return bool
+ */
+ function run()
+ {
+ // Do we even have any data to process? Mm?
+ if (count($_POST) == 0 OR count($this->_rules) == 0)
+ {
+ return FALSE;
+ }
+
+ // Load the language file containing error messages
+ $this->CI->lang->load('validation');
+
+ // Cycle through the rules and test for errors
+ foreach ($this->_rules as $field => $rules)
+ {
+ //Explode out the rules!
+ $ex = explode('|', $rules);
+
+ // Is the field required? If not, if the field is blank we'll move on to the next test
+ if ( ! in_array('required', $ex, TRUE))
+ {
+ if ( ! isset($_POST[$field]) OR $_POST[$field] == '')
+ {
+ continue;
+ }
+ }
+
+ /*
+ * Are we dealing with an "isset" rule?
+ *
+ * Before going further, we'll see if one of the rules
+ * is to check whether the item is set (typically this
+ * applies only to checkboxes). If so, we'll
+ * test for it here since there's not reason to go
+ * further
+ */
+ if ( ! isset($_POST[$field]))
+ {
+ if (in_array('isset', $ex, TRUE) OR in_array('required', $ex))
+ {
+ if ( ! isset($this->_error_messages['isset']))
+ {
+ if (FALSE === ($line = $this->CI->lang->line('isset')))
+ {
+ $line = 'The field was not set';
+ }
+ }
+ else
+ {
+ $line = $this->_error_messages['isset'];
+ }
+
+ // Build the error message
+ $mfield = ( ! isset($this->_fields[$field])) ? $field : $this->_fields[$field];
+ $message = sprintf($line, $mfield);
+
+ // Set the error variable. Example: $this->username_error
+ $error = $field.'_error';
+ $this->$error = $this->_error_prefix.$message.$this->_error_suffix;
+ $this->_error_array[] = $message;
+ }
+
+ continue;
+ }
+
+ /*
+ * Set the current field
+ *
+ * The various prepping functions need to know the
+ * current field name so they can do this:
+ *
+ * $_POST[$this->_current_field] == 'bla bla';
+ */
+ $this->_current_field = $field;
+
+ // Cycle through the rules!
+ foreach ($ex As $rule)
+ {
+ // Is the rule a callback?
+ $callback = FALSE;
+ if (substr($rule, 0, 9) == 'callback_')
+ {
+ $rule = substr($rule, 9);
+ $callback = TRUE;
+ }
+
+ // Strip the parameter (if exists) from the rule
+ // Rules can contain a parameter: max_length[5]
+ $param = FALSE;
+ if (preg_match("/(.*?)\[(.*?)\]/", $rule, $match))
+ {
+ $rule = $match[1];
+ $param = $match[2];
+ }
+
+ // Call the function that corresponds to the rule
+ if ($callback === TRUE)
+ {
+ if ( ! method_exists($this->CI, $rule))
+ {
+ continue;
+ }
+
+ $result = $this->CI->$rule($_POST[$field], $param);
+
+ // If the field isn't required and we just processed a callback we'll move on...
+ if ( ! in_array('required', $ex, TRUE) AND $result !== FALSE)
+ {
+ continue 2;
+ }
+
+ }
+ else
+ {
+ if ( ! method_exists($this, $rule))
+ {
+ /*
+ * Run the native PHP function if called for
+ *
+ * If our own wrapper function doesn't exist we see
+ * if a native PHP function does. Users can use
+ * any native PHP function call that has one param.
+ */
+ if (function_exists($rule))
+ {
+ $_POST[$field] = $rule($_POST[$field]);
+ $this->$field = $_POST[$field];
+ }
+
+ continue;
+ }
+
+ $result = $this->$rule($_POST[$field], $param);
+ }
+
+ // Did the rule test negatively? If so, grab the error.
+ if ($result === FALSE)
+ {
+ if ( ! isset($this->_error_messages[$rule]))
+ {
+ if (FALSE === ($line = $this->CI->lang->line($rule)))
+ {
+ $line = 'Unable to access an error message corresponding to your field name.';
+ }
+ }
+ else
+ {
+ $line = $this->_error_messages[$rule];
+ }
+
+ // Build the error message
+ $mfield = ( ! isset($this->_fields[$field])) ? $field : $this->_fields[$field];
+ $mparam = ( ! isset($this->_fields[$param])) ? $param : $this->_fields[$param];
+ $message = sprintf($line, $mfield, $mparam);
+
+ // Set the error variable. Example: $this->username_error
+ $error = $field.'_error';
+ $this->$error = $this->_error_prefix.$message.$this->_error_suffix;
+
+ // Add the error to the error array
+ $this->_error_array[] = $message;
+ continue 2;
+ }
+ }
+
+ }
+
+ $total_errors = count($this->_error_array);
+
+ /*
+ * Recompile the class variables
+ *
+ * If any prepping functions were called the $_POST data
+ * might now be different then the corresponding class
+ * variables so we'll set them anew.
+ */
+ if ($total_errors > 0)
+ {
+ $this->_safe_form_data = TRUE;
+ }
+
+ $this->set_fields();
+
+ // Did we end up with any errors?
+ if ($total_errors == 0)
+ {
+ return TRUE;
+ }
+
+ // Generate the error string
+ foreach ($this->_error_array as $val)
+ {
+ $this->error_string .= $this->_error_prefix.$val.$this->_error_suffix."\n";
+ }
+
+ return FALSE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Required
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function required($str)
+ {
+ if ( ! is_array($str))
+ {
+ return (trim($str) == '') ? FALSE : TRUE;
+ }
+ else
+ {
+ return ( ! empty($str));
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Match one field to another
+ *
+ * @access public
+ * @param string
+ * @param field
+ * @return bool
+ */
+ function matches($str, $field)
+ {
+ if ( ! isset($_POST[$field]))
+ {
+ return FALSE;
+ }
+
+ return ($str !== $_POST[$field]) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Minimum Length
+ *
+ * @access public
+ * @param string
+ * @param value
+ * @return bool
+ */
+ function min_length($str, $val)
+ {
+ if (preg_match("/[^0-9]/", $val))
+ {
+ return FALSE;
+ }
+
+ if (function_exists('mb_strlen'))
+ {
+ return (mb_strlen($str) < $val) ? FALSE : TRUE;
+ }
+
+ return (strlen($str) < $val) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Max Length
+ *
+ * @access public
+ * @param string
+ * @param value
+ * @return bool
+ */
+ function max_length($str, $val)
+ {
+ if (preg_match("/[^0-9]/", $val))
+ {
+ return FALSE;
+ }
+
+ if (function_exists('mb_strlen'))
+ {
+ return (mb_strlen($str) > $val) ? FALSE : TRUE;
+ }
+
+ return (strlen($str) > $val) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Exact Length
+ *
+ * @access public
+ * @param string
+ * @param value
+ * @return bool
+ */
+ function exact_length($str, $val)
+ {
+ if (preg_match("/[^0-9]/", $val))
+ {
+ return FALSE;
+ }
+
+ if (function_exists('mb_strlen'))
+ {
+ return (mb_strlen($str) != $val) ? FALSE : TRUE;
+ }
+
+ return (strlen($str) != $val) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Valid Email
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function valid_email($str)
+ {
+ return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Valid Emails
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function valid_emails($str)
+ {
+ if (strpos($str, ',') === FALSE)
+ {
+ return $this->valid_email(trim($str));
+ }
+
+ foreach(explode(',', $str) as $email)
+ {
+ if (trim($email) != '' && $this->valid_email(trim($email)) === FALSE)
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Validate IP Address
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function valid_ip($ip)
+ {
+ return $this->CI->input->valid_ip($ip);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alpha
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function alpha($str)
+ {
+ return ( ! preg_match("/^([a-z])+$/i", $str)) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alpha-numeric
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function alpha_numeric($str)
+ {
+ return ( ! preg_match("/^([a-z0-9])+$/i", $str)) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Alpha-numeric with underscores and dashes
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function alpha_dash($str)
+ {
+ return ( ! preg_match("/^([-a-z0-9_-])+$/i", $str)) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Numeric
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function numeric($str)
+ {
+ return (bool)preg_match( '/^[\-+]?[0-9]*\.?[0-9]+$/', $str);
+
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Is Numeric
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function is_numeric($str)
+ {
+ return ( ! is_numeric($str)) ? FALSE : TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Integer
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function integer($str)
+ {
+ return (bool)preg_match( '/^[\-+]?[0-9]+$/', $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Is a Natural number (0,1,2,3, etc.)
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function is_natural($str)
+ {
+ return (bool)preg_match( '/^[0-9]+$/', $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Is a Natural number, but not a zero (1,2,3, etc.)
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function is_natural_no_zero($str)
+ {
+ if ( ! preg_match( '/^[0-9]+$/', $str))
+ {
+ return FALSE;
+ }
+
+ if ($str == 0)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Valid Base64
+ *
+ * Tests a string for characters outside of the Base64 alphabet
+ * as defined by RFC 2045 http://www.faqs.org/rfcs/rfc2045
+ *
+ * @access public
+ * @param string
+ * @return bool
+ */
+ function valid_base64($str)
+ {
+ return (bool) ! preg_match('/[^a-zA-Z0-9\/\+=]/', $str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Select
+ *
+ * Enables pull-down lists to be set to the value the user
+ * selected in the event of an error
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function set_select($field = '', $value = '')
+ {
+ if ($field == '' OR $value == '' OR ! isset($_POST[$field]))
+ {
+ return '';
+ }
+
+ if ($_POST[$field] == $value)
+ {
+ return ' selected="selected"';
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Radio
+ *
+ * Enables radio buttons to be set to the value the user
+ * selected in the event of an error
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function set_radio($field = '', $value = '')
+ {
+ if ($field == '' OR $value == '' OR ! isset($_POST[$field]))
+ {
+ return '';
+ }
+
+ if ($_POST[$field] == $value)
+ {
+ return ' checked="checked"';
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Set Checkbox
+ *
+ * Enables checkboxes to be set to the value the user
+ * selected in the event of an error
+ *
+ * @access public
+ * @param string
+ * @param string
+ * @return string
+ */
+ function set_checkbox($field = '', $value = '')
+ {
+ if ($field == '' OR $value == '' OR ! isset($_POST[$field]))
+ {
+ return '';
+ }
+
+ if ($_POST[$field] == $value)
+ {
+ return ' checked="checked"';
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep data for form
+ *
+ * This function allows HTML to be safely shown in a form.
+ * Special characters are converted.
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function prep_for_form($data = '')
+ {
+ if (is_array($data))
+ {
+ foreach ($data as $key => $val)
+ {
+ $data[$key] = $this->prep_for_form($val);
+ }
+
+ return $data;
+ }
+
+ if ($this->_safe_form_data == FALSE OR $data == '')
+ {
+ return $data;
+ }
+
+ return str_replace(array("'", '"', '<', '>'), array("'", """, '<', '>'), stripslashes($data));
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Prep URL
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function prep_url($str = '')
+ {
+ if ($str == 'http://' OR $str == '')
+ {
+ $_POST[$this->_current_field] = '';
+ return;
+ }
+
+ if (substr($str, 0, 7) != 'http://' && substr($str, 0, 8) != 'https://')
+ {
+ $str = 'http://'.$str;
+ }
+
+ $_POST[$this->_current_field] = $str;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Strip Image Tags
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function strip_image_tags($str)
+ {
+ $_POST[$this->_current_field] = $this->CI->input->strip_image_tags($str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * XSS Clean
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function xss_clean($str)
+ {
+ $_POST[$this->_current_field] = $this->CI->input->xss_clean($str);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Convert PHP tags to entities
+ *
+ * @access public
+ * @param string
+ * @return string
+ */
+ function encode_php_tags($str)
+ {
+ $_POST[$this->_current_field] = str_replace(array('<?php', '<?PHP', '<?', '?>'), array('<?php', '<?PHP', '<?', '?>'), $str);
+ }
+
+}
+// END Validation Class
+
+/* End of file Validation.php */
/* Location: ./system/libraries/Validation.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-if ( ! function_exists('xml_parser_create'))\r
-{ \r
- show_error('Your PHP installation does not support XML');\r
-}\r
-\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * XML-RPC request handler class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category XML-RPC\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html\r
- */\r
-class CI_Xmlrpc {\r
-\r
- var $debug = FALSE; // Debugging on or off \r
- var $xmlrpcI4 = 'i4';\r
- var $xmlrpcInt = 'int';\r
- var $xmlrpcBoolean = 'boolean';\r
- var $xmlrpcDouble = 'double'; \r
- var $xmlrpcString = 'string';\r
- var $xmlrpcDateTime = 'datetime.iso8601';\r
- var $xmlrpcBase64 = 'base64';\r
- var $xmlrpcArray = 'array';\r
- var $xmlrpcStruct = 'struct';\r
- \r
- var $xmlrpcTypes = array();\r
- var $valid_parents = array();\r
- var $xmlrpcerr = array(); // Response numbers\r
- var $xmlrpcstr = array(); // Response strings\r
- \r
- var $xmlrpc_defencoding = 'UTF-8';\r
- var $xmlrpcName = 'XML-RPC for CodeIgniter';\r
- var $xmlrpcVersion = '1.1';\r
- var $xmlrpcerruser = 800; // Start of user errors\r
- var $xmlrpcerrxml = 100; // Start of XML Parse errors\r
- var $xmlrpc_backslash = ''; // formulate backslashes for escaping regexp\r
- \r
- var $client;\r
- var $method;\r
- var $data;\r
- var $message = '';\r
- var $error = ''; // Error string for request\r
- var $result;\r
- var $response = array(); // Response from remote server\r
-\r
-\r
- //-------------------------------------\r
- // VALUES THAT MULTIPLE CLASSES NEED\r
- //-------------------------------------\r
-\r
- function CI_Xmlrpc ($config = array())\r
- {\r
- $this->xmlrpcName = $this->xmlrpcName;\r
- $this->xmlrpc_backslash = chr(92).chr(92);\r
- \r
- // Types for info sent back and forth\r
- $this->xmlrpcTypes = array(\r
- $this->xmlrpcI4 => '1',\r
- $this->xmlrpcInt => '1',\r
- $this->xmlrpcBoolean => '1',\r
- $this->xmlrpcString => '1',\r
- $this->xmlrpcDouble => '1',\r
- $this->xmlrpcDateTime => '1',\r
- $this->xmlrpcBase64 => '1',\r
- $this->xmlrpcArray => '2',\r
- $this->xmlrpcStruct => '3'\r
- );\r
- \r
- // Array of Valid Parents for Various XML-RPC elements\r
- $this->valid_parents = array('BOOLEAN' => array('VALUE'),\r
- 'I4' => array('VALUE'),\r
- 'INT' => array('VALUE'),\r
- 'STRING' => array('VALUE'),\r
- 'DOUBLE' => array('VALUE'),\r
- 'DATETIME.ISO8601' => array('VALUE'),\r
- 'BASE64' => array('VALUE'),\r
- 'ARRAY' => array('VALUE'),\r
- 'STRUCT' => array('VALUE'),\r
- 'PARAM' => array('PARAMS'),\r
- 'METHODNAME' => array('METHODCALL'),\r
- 'PARAMS' => array('METHODCALL', 'METHODRESPONSE'),\r
- 'MEMBER' => array('STRUCT'),\r
- 'NAME' => array('MEMBER'),\r
- 'DATA' => array('ARRAY'),\r
- 'FAULT' => array('METHODRESPONSE'),\r
- 'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT')\r
- );\r
- \r
- \r
- // XML-RPC Responses\r
- $this->xmlrpcerr['unknown_method'] = '1';\r
- $this->xmlrpcstr['unknown_method'] = 'This is not a known method for this XML-RPC Server';\r
- $this->xmlrpcerr['invalid_return'] = '2';\r
- $this->xmlrpcstr['invalid_return'] = 'The XML data receieved was either invalid or not in the correct form for XML-RPC. Turn on debugging to examine the XML data further.';\r
- $this->xmlrpcerr['incorrect_params'] = '3';\r
- $this->xmlrpcstr['incorrect_params'] = 'Incorrect parameters were passed to method';\r
- $this->xmlrpcerr['introspect_unknown'] = '4';\r
- $this->xmlrpcstr['introspect_unknown'] = "Cannot inspect signature for request: method unknown";\r
- $this->xmlrpcerr['http_error'] = '5';\r
- $this->xmlrpcstr['http_error'] = "Did not receive a '200 OK' response from remote server.";\r
- $this->xmlrpcerr['no_data'] = '6';\r
- $this->xmlrpcstr['no_data'] ='No data received from server.';\r
- \r
- $this->initialize($config);\r
- \r
- log_message('debug', "XML-RPC Class Initialized");\r
- }\r
- \r
- \r
- //-------------------------------------\r
- // Initialize Prefs\r
- //-------------------------------------\r
-\r
- function initialize($config = array())\r
- {\r
- if (sizeof($config) > 0)\r
- {\r
- foreach ($config as $key => $val)\r
- {\r
- if (isset($this->$key))\r
- {\r
- $this->$key = $val; \r
- }\r
- }\r
- }\r
- }\r
- // END\r
- \r
- //-------------------------------------\r
- // Take URL and parse it\r
- //-------------------------------------\r
-\r
- function server($url, $port=80)\r
- {\r
- if (substr($url, 0, 4) != "http")\r
- {\r
- $url = "http://".$url;\r
- }\r
- \r
- $parts = parse_url($url);\r
- \r
- $path = ( ! isset($parts['path'])) ? '/' : $parts['path'];\r
- \r
- if (isset($parts['query']) && $parts['query'] != '')\r
- {\r
- $path .= '?'.$parts['query'];\r
- } \r
- \r
- $this->client = new XML_RPC_Client($path, $parts['host'], $port);\r
- }\r
- // END\r
- \r
- //-------------------------------------\r
- // Set Timeout\r
- //-------------------------------------\r
-\r
- function timeout($seconds=5)\r
- {\r
- if ( ! is_null($this->client) && is_int($seconds))\r
- {\r
- $this->client->timeout = $seconds;\r
- }\r
- }\r
- // END\r
- \r
- //-------------------------------------\r
- // Set Methods\r
- //-------------------------------------\r
-\r
- function method($function)\r
- {\r
- $this->method = $function;\r
- }\r
- // END\r
- \r
- //-------------------------------------\r
- // Take Array of Data and Create Objects\r
- //-------------------------------------\r
-\r
- function request($incoming)\r
- {\r
- if ( ! is_array($incoming))\r
- {\r
- // Send Error\r
- }\r
- \r
- $this->data = array();\r
- \r
- foreach($incoming as $key => $value)\r
- {\r
- $this->data[$key] = $this->values_parsing($value);\r
- }\r
- }\r
- // END\r
- \r
- \r
- //-------------------------------------\r
- // Set Debug\r
- //-------------------------------------\r
-\r
- function set_debug($flag = TRUE)\r
- {\r
- $this->debug = ($flag == TRUE) ? TRUE : FALSE;\r
- }\r
- \r
- //-------------------------------------\r
- // Values Parsing\r
- //-------------------------------------\r
-\r
- function values_parsing($value, $return = FALSE)\r
- {\r
- if (is_array($value) && isset($value['0']))\r
- {\r
- if ( ! isset($value['1']) OR ! isset($this->xmlrpcTypes[strtolower($value['1'])]))\r
- {\r
- if (is_array($value[0]))\r
- {\r
- $temp = new XML_RPC_Values($value['0'], 'array');\r
- }\r
- else\r
- {\r
- $temp = new XML_RPC_Values($value['0'], 'string');\r
- }\r
- }\r
- elseif(is_array($value['0']) && ($value['1'] == 'struct' OR $value['1'] == 'array'))\r
- {\r
- while (list($k) = each($value['0']))\r
- {\r
- $value['0'][$k] = $this->values_parsing($value['0'][$k], TRUE);\r
- }\r
- \r
- $temp = new XML_RPC_Values($value['0'], $value['1']);\r
- }\r
- else\r
- {\r
- $temp = new XML_RPC_Values($value['0'], $value['1']);\r
- }\r
- }\r
- else\r
- {\r
- $temp = new XML_RPC_Values($value, 'string');\r
- }\r
-\r
- return $temp;\r
- }\r
- // END\r
-\r
-\r
- //-------------------------------------\r
- // Sends XML-RPC Request\r
- //-------------------------------------\r
-\r
- function send_request()\r
- {\r
- $this->message = new XML_RPC_Message($this->method,$this->data);\r
- $this->message->debug = $this->debug;\r
- \r
- if ( ! $this->result = $this->client->send($this->message))\r
- {\r
- $this->error = $this->result->errstr;\r
- return FALSE;\r
- }\r
- elseif( ! is_object($this->result->val))\r
- {\r
- $this->error = $this->result->errstr;\r
- return FALSE;\r
- }\r
- \r
- $this->response = $this->result->decode();\r
- \r
- return TRUE;\r
- }\r
- // END\r
- \r
- //-------------------------------------\r
- // Returns Error\r
- //-------------------------------------\r
-\r
- function display_error()\r
- {\r
- return $this->error;\r
- }\r
- // END\r
- \r
- //-------------------------------------\r
- // Returns Remote Server Response\r
- //-------------------------------------\r
-\r
- function display_response()\r
- {\r
- return $this->response;\r
- }\r
- // END\r
- \r
- //-------------------------------------\r
- // Sends an Error Message for Server Request\r
- //-------------------------------------\r
- \r
- function send_error_message($number, $message)\r
- {\r
- return new XML_RPC_Response('0',$number, $message);\r
- }\r
- // END\r
- \r
- \r
- //-------------------------------------\r
- // Send Response for Server Request\r
- //-------------------------------------\r
- \r
- function send_response($response)\r
- {\r
- // $response should be array of values, which will be parsed\r
- // based on their data and type into a valid group of XML-RPC values\r
- \r
- $response = $this->values_parsing($response);\r
- \r
- return new XML_RPC_Response($response);\r
- }\r
- // END\r
- \r
-} // END XML_RPC Class\r
-\r
- \r
- \r
-/**\r
- * XML-RPC Client class\r
- *\r
- * @category XML-RPC\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html\r
- */\r
-class XML_RPC_Client extends CI_Xmlrpc\r
-{\r
- var $path = '';\r
- var $server = '';\r
- var $port = 80;\r
- var $errno = '';\r
- var $errstring = '';\r
- var $timeout = 5;\r
- var $no_multicall = false;\r
-\r
- function XML_RPC_Client($path, $server, $port=80)\r
- {\r
- parent::CI_Xmlrpc();\r
- \r
- $this->port = $port;\r
- $this->server = $server;\r
- $this->path = $path;\r
- }\r
- \r
- function send($msg)\r
- {\r
- if (is_array($msg))\r
- {\r
- // Multi-call disabled\r
- $r = new XML_RPC_Response(0, $this->xmlrpcerr['multicall_recursion'],$this->xmlrpcstr['multicall_recursion']);\r
- return $r;\r
- }\r
-\r
- return $this->sendPayload($msg);\r
- }\r
-\r
- function sendPayload($msg)\r
- { \r
- $fp = @fsockopen($this->server, $this->port,$this->errno, $this->errstr, $this->timeout);\r
- \r
- if ( ! is_resource($fp))\r
- {\r
- error_log($this->xmlrpcstr['http_error']);\r
- $r = new XML_RPC_Response(0, $this->xmlrpcerr['http_error'],$this->xmlrpcstr['http_error']);\r
- return $r;\r
- }\r
- \r
- if(empty($msg->payload))\r
- {\r
- // $msg = XML_RPC_Messages\r
- $msg->createPayload();\r
- }\r
- \r
- $r = "\r\n";\r
- $op = "POST {$this->path} HTTP/1.0$r";\r
- $op .= "Host: {$this->server}$r";\r
- $op .= "Content-Type: text/xml$r";\r
- $op .= "User-Agent: {$this->xmlrpcName}$r";\r
- $op .= "Content-Length: ".strlen($msg->payload). "$r$r";\r
- $op .= $msg->payload;\r
- \r
-\r
- if ( ! fputs($fp, $op, strlen($op)))\r
- {\r
- error_log($this->xmlrpcstr['http_error']);\r
- $r = new XML_RPC_Response(0, $this->xmlrpcerr['http_error'], $this->xmlrpcstr['http_error']);\r
- return $r;\r
- }\r
- $resp = $msg->parseResponse($fp);\r
- fclose($fp);\r
- return $resp;\r
- }\r
-\r
-} // end class XML_RPC_Client\r
-\r
-\r
-/**\r
- * XML-RPC Response class\r
- *\r
- * @category XML-RPC\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html\r
- */\r
-class XML_RPC_Response\r
-{\r
- var $val = 0;\r
- var $errno = 0;\r
- var $errstr = '';\r
- var $headers = array();\r
-\r
- function XML_RPC_Response($val, $code = 0, $fstr = '')\r
- { \r
- if ($code != 0)\r
- {\r
- // error\r
- $this->errno = $code;\r
- $this->errstr = htmlentities($fstr);\r
- }\r
- else if ( ! is_object($val))\r
- {\r
- // programmer error, not an object\r
- error_log("Invalid type '" . gettype($val) . "' (value: $val) passed to XML_RPC_Response. Defaulting to empty value.");\r
- $this->val = new XML_RPC_Values();\r
- }\r
- else\r
- {\r
- $this->val = $val;\r
- }\r
- }\r
-\r
- function faultCode()\r
- {\r
- return $this->errno;\r
- }\r
-\r
- function faultString()\r
- {\r
- return $this->errstr;\r
- }\r
-\r
- function value()\r
- {\r
- return $this->val;\r
- }\r
- \r
- function prepare_response()\r
- {\r
- $result = "<methodResponse>\n";\r
- if ($this->errno)\r
- {\r
- $result .= '<fault>\r
- <value>\r
- <struct>\r
- <member>\r
- <name>faultCode</name>\r
- <value><int>' . $this->errno . '</int></value>\r
- </member>\r
- <member>\r
- <name>faultString</name>\r
- <value><string>' . $this->errstr . '</string></value>\r
- </member>\r
- </struct>\r
- </value>\r
-</fault>';\r
- }\r
- else\r
- {\r
- $result .= "<params>\n<param>\n" .\r
- $this->val->serialize_class() .\r
- "</param>\n</params>";\r
- }\r
- $result .= "\n</methodResponse>";\r
- return $result;\r
- }\r
- \r
- function decode($array=FALSE)\r
- {\r
- $CI =& get_instance();\r
-\r
- if ($array !== FALSE && is_array($array))\r
- {\r
- while (list($key) = each($array))\r
- {\r
- if (is_array($array[$key]))\r
- {\r
- $array[$key] = $this->decode($array[$key]);\r
- }\r
- else\r
- {\r
- $array[$key] = $CI->input->xss_clean($array[$key]);\r
- }\r
- }\r
- \r
- $result = $array;\r
- }\r
- else\r
- {\r
- $result = $this->xmlrpc_decoder($this->val);\r
- \r
- if (is_array($result))\r
- {\r
- $result = $this->decode($result);\r
- }\r
- else\r
- {\r
- $result = $CI->input->xss_clean($result);\r
- }\r
- }\r
- \r
- return $result;\r
- }\r
-\r
- \r
- \r
- //-------------------------------------\r
- // XML-RPC Object to PHP Types\r
- //-------------------------------------\r
-\r
- function xmlrpc_decoder($xmlrpc_val)\r
- {\r
- $kind = $xmlrpc_val->kindOf();\r
-\r
- if($kind == 'scalar')\r
- {\r
- return $xmlrpc_val->scalarval();\r
- }\r
- elseif($kind == 'array')\r
- {\r
- reset($xmlrpc_val->me);\r
- list($a,$b) = each($xmlrpc_val->me);\r
- $size = sizeof($b);\r
- \r
- $arr = array();\r
-\r
- for($i = 0; $i < $size; $i++)\r
- {\r
- $arr[] = $this->xmlrpc_decoder($xmlrpc_val->me['array'][$i]);\r
- }\r
- return $arr;\r
- }\r
- elseif($kind == 'struct')\r
- {\r
- reset($xmlrpc_val->me['struct']);\r
- $arr = array();\r
-\r
- while(list($key,$value) = each($xmlrpc_val->me['struct']))\r
- {\r
- $arr[$key] = $this->xmlrpc_decoder($value);\r
- }\r
- return $arr;\r
- }\r
- }\r
- \r
- \r
- //-------------------------------------\r
- // ISO-8601 time to server or UTC time\r
- //-------------------------------------\r
-\r
- function iso8601_decode($time, $utc=0)\r
- {\r
- // return a timet in the localtime, or UTC\r
- $t = 0;\r
- if (preg_match('/([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})/', $time, $regs))\r
- {\r
- if ($utc == 1)\r
- $t = gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);\r
- else\r
- $t = mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);\r
- }\r
- return $t;\r
- }\r
- \r
-} // End Response Class\r
-\r
-\r
-\r
-/**\r
- * XML-RPC Message class\r
- *\r
- * @category XML-RPC\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html\r
- */\r
-class XML_RPC_Message extends CI_Xmlrpc\r
-{\r
- var $payload;\r
- var $method_name;\r
- var $params = array();\r
- var $xh = array();\r
-\r
- function XML_RPC_Message($method, $pars=0)\r
- {\r
- parent::CI_Xmlrpc();\r
- \r
- $this->method_name = $method;\r
- if (is_array($pars) && sizeof($pars) > 0)\r
- {\r
- for($i=0; $i<sizeof($pars); $i++)\r
- {\r
- // $pars[$i] = XML_RPC_Values\r
- $this->params[] = $pars[$i];\r
- }\r
- }\r
- }\r
- \r
- //-------------------------------------\r
- // Create Payload to Send\r
- //-------------------------------------\r
- \r
- function createPayload()\r
- {\r
- $this->payload = "<?xml version=\"1.0\"?".">\r\n<methodCall>\r\n";\r
- $this->payload .= '<methodName>' . $this->method_name . "</methodName>\r\n";\r
- $this->payload .= "<params>\r\n";\r
- \r
- for($i=0; $i<sizeof($this->params); $i++)\r
- {\r
- // $p = XML_RPC_Values\r
- $p = $this->params[$i];\r
- $this->payload .= "<param>\r\n".$p->serialize_class()."</param>\r\n";\r
- }\r
- \r
- $this->payload .= "</params>\r\n</methodCall>\r\n";\r
- }\r
- \r
- //-------------------------------------\r
- // Parse External XML-RPC Server's Response\r
- //-------------------------------------\r
- \r
- function parseResponse($fp)\r
- {\r
- $data = '';\r
- \r
- while($datum = fread($fp, 4096))\r
- {\r
- $data .= $datum;\r
- }\r
- \r
- //-------------------------------------\r
- // DISPLAY HTTP CONTENT for DEBUGGING\r
- //-------------------------------------\r
- \r
- if ($this->debug === TRUE)\r
- {\r
- echo "<pre>";\r
- echo "---DATA---\n" . htmlspecialchars($data) . "\n---END DATA---\n\n";\r
- echo "</pre>";\r
- }\r
- \r
- //-------------------------------------\r
- // Check for data\r
- //-------------------------------------\r
-\r
- if($data == "")\r
- {\r
- error_log($this->xmlrpcstr['no_data']);\r
- $r = new XML_RPC_Response(0, $this->xmlrpcerr['no_data'], $this->xmlrpcstr['no_data']);\r
- return $r;\r
- }\r
- \r
- \r
- //-------------------------------------\r
- // Check for HTTP 200 Response\r
- //-------------------------------------\r
- \r
- if (strncmp($data, 'HTTP', 4) == 0 && ! preg_match('/^HTTP\/[0-9\.]+ 200 /', $data))\r
- {\r
- $errstr= substr($data, 0, strpos($data, "\n")-1);\r
- $r = new XML_RPC_Response(0, $this->xmlrpcerr['http_error'], $this->xmlrpcstr['http_error']. ' (' . $errstr . ')');\r
- return $r;\r
- }\r
- \r
- //-------------------------------------\r
- // Create and Set Up XML Parser\r
- //-------------------------------------\r
- \r
- $parser = xml_parser_create($this->xmlrpc_defencoding);\r
-\r
- $this->xh[$parser] = array();\r
- $this->xh[$parser]['isf'] = 0;\r
- $this->xh[$parser]['ac'] = '';\r
- $this->xh[$parser]['headers'] = array();\r
- $this->xh[$parser]['stack'] = array();\r
- $this->xh[$parser]['valuestack'] = array();\r
- $this->xh[$parser]['isf_reason'] = 0;\r
-\r
- xml_set_object($parser, $this);\r
- xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);\r
- xml_set_element_handler($parser, 'open_tag', 'closing_tag');\r
- xml_set_character_data_handler($parser, 'character_data');\r
- //xml_set_default_handler($parser, 'default_handler');\r
-\r
-\r
- //-------------------------------------\r
- // GET HEADERS\r
- //-------------------------------------\r
- \r
- $lines = explode("\r\n", $data);\r
- while (($line = array_shift($lines)))\r
- {\r
- if (strlen($line) < 1)\r
- {\r
- break;\r
- }\r
- $this->xh[$parser]['headers'][] = $line;\r
- }\r
- $data = implode("\r\n", $lines);\r
- \r
- \r
- //-------------------------------------\r
- // PARSE XML DATA\r
- //------------------------------------- \r
-\r
- if ( ! xml_parse($parser, $data, sizeof($data)))\r
- {\r
- $errstr = sprintf('XML error: %s at line %d',\r
- xml_error_string(xml_get_error_code($parser)),\r
- xml_get_current_line_number($parser));\r
- //error_log($errstr);\r
- $r = new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return']);\r
- xml_parser_free($parser);\r
- return $r;\r
- }\r
- xml_parser_free($parser);\r
- \r
- // ---------------------------------------\r
- // Got Ourselves Some Badness, It Seems\r
- // ---------------------------------------\r
- \r
- if ($this->xh[$parser]['isf'] > 1)\r
- {\r
- if ($this->debug === TRUE)\r
- {\r
- echo "---Invalid Return---\n";\r
- echo $this->xh[$parser]['isf_reason'];\r
- echo "---Invalid Return---\n\n";\r
- }\r
- \r
- $r = new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'],$this->xmlrpcstr['invalid_return'].' '.$this->xh[$parser]['isf_reason']);\r
- return $r;\r
- }\r
- elseif ( ! is_object($this->xh[$parser]['value']))\r
- {\r
- $r = new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'],$this->xmlrpcstr['invalid_return'].' '.$this->xh[$parser]['isf_reason']);\r
- return $r;\r
- }\r
- \r
- //-------------------------------------\r
- // DISPLAY XML CONTENT for DEBUGGING\r
- //------------------------------------- \r
- \r
- if ($this->debug === TRUE)\r
- {\r
- echo "<pre>";\r
- \r
- if (count($this->xh[$parser]['headers'] > 0))\r
- {\r
- echo "---HEADERS---\n";\r
- foreach ($this->xh[$parser]['headers'] as $header)\r
- {\r
- echo "$header\n";\r
- }\r
- echo "---END HEADERS---\n\n";\r
- }\r
- \r
- echo "---DATA---\n" . htmlspecialchars($data) . "\n---END DATA---\n\n";\r
- \r
- echo "---PARSED---\n" ;\r
- var_dump($this->xh[$parser]['value']);\r
- echo "\n---END PARSED---</pre>";\r
- }\r
- \r
- //-------------------------------------\r
- // SEND RESPONSE\r
- //-------------------------------------\r
- \r
- $v = $this->xh[$parser]['value'];\r
- \r
- if ($this->xh[$parser]['isf'])\r
- {\r
- $errno_v = $v->me['struct']['faultCode'];\r
- $errstr_v = $v->me['struct']['faultString'];\r
- $errno = $errno_v->scalarval();\r
-\r
- if ($errno == 0)\r
- {\r
- // FAULT returned, errno needs to reflect that\r
- $errno = -1;\r
- }\r
-\r
- $r = new XML_RPC_Response($v, $errno, $errstr_v->scalarval());\r
- }\r
- else\r
- {\r
- $r = new XML_RPC_Response($v);\r
- }\r
-\r
- $r->headers = $this->xh[$parser]['headers'];\r
- return $r;\r
- }\r
- \r
- // ------------------------------------\r
- // Begin Return Message Parsing section\r
- // ------------------------------------\r
- \r
- // quick explanation of components:\r
- // ac - used to accumulate values\r
- // isf - used to indicate a fault\r
- // lv - used to indicate "looking for a value": implements\r
- // the logic to allow values with no types to be strings\r
- // params - used to store parameters in method calls\r
- // method - used to store method name\r
- // stack - array with parent tree of the xml element,\r
- // used to validate the nesting of elements\r
-\r
- //-------------------------------------\r
- // Start Element Handler\r
- //-------------------------------------\r
-\r
- function open_tag($the_parser, $name, $attrs)\r
- {\r
- // If invalid nesting, then return\r
- if ($this->xh[$the_parser]['isf'] > 1) return;\r
- \r
- // Evaluate and check for correct nesting of XML elements\r
- \r
- if (count($this->xh[$the_parser]['stack']) == 0)\r
- {\r
- if ($name != 'METHODRESPONSE' && $name != 'METHODCALL')\r
- {\r
- $this->xh[$the_parser]['isf'] = 2;\r
- $this->xh[$the_parser]['isf_reason'] = 'Top level XML-RPC element is missing';\r
- return;\r
- }\r
- }\r
- else\r
- {\r
- // not top level element: see if parent is OK\r
- if ( ! in_array($this->xh[$the_parser]['stack'][0], $this->valid_parents[$name], TRUE))\r
- {\r
- $this->xh[$the_parser]['isf'] = 2;\r
- $this->xh[$the_parser]['isf_reason'] = "XML-RPC element $name cannot be child of ".$this->xh[$the_parser]['stack'][0];\r
- return;\r
- }\r
- }\r
- \r
- switch($name)\r
- {\r
- case 'STRUCT':\r
- case 'ARRAY':\r
- // Creates array for child elements\r
- \r
- $cur_val = array('value' => array(),\r
- 'type' => $name);\r
- \r
- array_unshift($this->xh[$the_parser]['valuestack'], $cur_val);\r
- break;\r
- case 'METHODNAME':\r
- case 'NAME':\r
- $this->xh[$the_parser]['ac'] = '';\r
- break;\r
- case 'FAULT':\r
- $this->xh[$the_parser]['isf'] = 1;\r
- break;\r
- case 'PARAM':\r
- $this->xh[$the_parser]['value'] = null;\r
- break;\r
- case 'VALUE':\r
- $this->xh[$the_parser]['vt'] = 'value';\r
- $this->xh[$the_parser]['ac'] = '';\r
- $this->xh[$the_parser]['lv'] = 1;\r
- break;\r
- case 'I4':\r
- case 'INT':\r
- case 'STRING':\r
- case 'BOOLEAN':\r
- case 'DOUBLE':\r
- case 'DATETIME.ISO8601':\r
- case 'BASE64':\r
- if ($this->xh[$the_parser]['vt'] != 'value')\r
- {\r
- //two data elements inside a value: an error occurred!\r
- $this->xh[$the_parser]['isf'] = 2;\r
- $this->xh[$the_parser]['isf_reason'] = "'Twas a $name element following a ".$this->xh[$the_parser]['vt']." element inside a single value";\r
- return;\r
- }\r
- \r
- $this->xh[$the_parser]['ac'] = '';\r
- break;\r
- case 'MEMBER':\r
- // Set name of <member> to nothing to prevent errors later if no <name> is found\r
- $this->xh[$the_parser]['valuestack'][0]['name'] = '';\r
- \r
- // Set NULL value to check to see if value passed for this param/member\r
- $this->xh[$the_parser]['value'] = null;\r
- break;\r
- case 'DATA':\r
- case 'METHODCALL':\r
- case 'METHODRESPONSE':\r
- case 'PARAMS':\r
- // valid elements that add little to processing\r
- break;\r
- default:\r
- /// An Invalid Element is Found, so we have trouble\r
- $this->xh[$the_parser]['isf'] = 2;\r
- $this->xh[$the_parser]['isf_reason'] = "Invalid XML-RPC element found: $name";\r
- break;\r
- }\r
- \r
- // Add current element name to stack, to allow validation of nesting\r
- array_unshift($this->xh[$the_parser]['stack'], $name);\r
-\r
- if ($name != 'VALUE') $this->xh[$the_parser]['lv'] = 0;\r
- }\r
- // END\r
-\r
-\r
- //-------------------------------------\r
- // End Element Handler\r
- //-------------------------------------\r
-\r
- function closing_tag($the_parser, $name)\r
- {\r
- if ($this->xh[$the_parser]['isf'] > 1) return;\r
- \r
- // Remove current element from stack and set variable\r
- // NOTE: If the XML validates, then we do not have to worry about\r
- // the opening and closing of elements. Nesting is checked on the opening\r
- // tag so we be safe there as well.\r
- \r
- $curr_elem = array_shift($this->xh[$the_parser]['stack']);\r
- \r
- switch($name)\r
- {\r
- case 'STRUCT':\r
- case 'ARRAY':\r
- $cur_val = array_shift($this->xh[$the_parser]['valuestack']);\r
- $this->xh[$the_parser]['value'] = ( ! isset($cur_val['values'])) ? array() : $cur_val['values'];\r
- $this->xh[$the_parser]['vt'] = strtolower($name);\r
- break;\r
- case 'NAME':\r
- $this->xh[$the_parser]['valuestack'][0]['name'] = $this->xh[$the_parser]['ac'];\r
- break;\r
- case 'BOOLEAN':\r
- case 'I4':\r
- case 'INT':\r
- case 'STRING':\r
- case 'DOUBLE':\r
- case 'DATETIME.ISO8601':\r
- case 'BASE64':\r
- $this->xh[$the_parser]['vt'] = strtolower($name);\r
- \r
- if ($name == 'STRING')\r
- {\r
- $this->xh[$the_parser]['value'] = $this->xh[$the_parser]['ac'];\r
- }\r
- elseif ($name=='DATETIME.ISO8601')\r
- {\r
- $this->xh[$the_parser]['vt'] = $this->xmlrpcDateTime;\r
- $this->xh[$the_parser]['value'] = $this->xh[$the_parser]['ac'];\r
- }\r
- elseif ($name=='BASE64')\r
- {\r
- $this->xh[$the_parser]['value'] = base64_decode($this->xh[$the_parser]['ac']);\r
- }\r
- elseif ($name=='BOOLEAN')\r
- {\r
- // Translated BOOLEAN values to TRUE AND FALSE\r
- if ($this->xh[$the_parser]['ac'] == '1')\r
- {\r
- $this->xh[$the_parser]['value'] = TRUE;\r
- }\r
- else\r
- {\r
- $this->xh[$the_parser]['value'] = FALSE;\r
- }\r
- }\r
- elseif ($name=='DOUBLE')\r
- {\r
- // we have a DOUBLE\r
- // we must check that only 0123456789-.<space> are characters here\r
- if ( ! preg_match('/^[+-]?[eE0-9\t \.]+$/', $this->xh[$the_parser]['ac']))\r
- {\r
- $this->xh[$the_parser]['value'] = 'ERROR_NON_NUMERIC_FOUND';\r
- }\r
- else\r
- {\r
- $this->xh[$the_parser]['value'] = (double)$this->xh[$the_parser]['ac'];\r
- }\r
- }\r
- else\r
- {\r
- // we have an I4/INT\r
- // we must check that only 0123456789-<space> are characters here\r
- if ( ! preg_match('/^[+-]?[0-9\t ]+$/', $this->xh[$the_parser]['ac']))\r
- {\r
- $this->xh[$the_parser]['value'] = 'ERROR_NON_NUMERIC_FOUND';\r
- }\r
- else\r
- {\r
- $this->xh[$the_parser]['value'] = (int)$this->xh[$the_parser]['ac'];\r
- }\r
- }\r
- $this->xh[$the_parser]['ac'] = '';\r
- $this->xh[$the_parser]['lv'] = 3; // indicate we've found a value\r
- break;\r
- case 'VALUE':\r
- // This if() detects if no scalar was inside <VALUE></VALUE>\r
- if ($this->xh[$the_parser]['vt']=='value')\r
- {\r
- $this->xh[$the_parser]['value'] = $this->xh[$the_parser]['ac'];\r
- $this->xh[$the_parser]['vt'] = $this->xmlrpcString;\r
- }\r
- \r
- // build the XML-RPC value out of the data received, and substitute it\r
- $temp = new XML_RPC_Values($this->xh[$the_parser]['value'], $this->xh[$the_parser]['vt']);\r
- \r
- if (count($this->xh[$the_parser]['valuestack']) && $this->xh[$the_parser]['valuestack'][0]['type'] == 'ARRAY')\r
- {\r
- // Array\r
- $this->xh[$the_parser]['valuestack'][0]['values'][] = $temp;\r
- }\r
- else\r
- {\r
- // Struct\r
- $this->xh[$the_parser]['value'] = $temp;\r
- }\r
- break;\r
- case 'MEMBER':\r
- $this->xh[$the_parser]['ac']='';\r
- \r
- // If value add to array in the stack for the last element built\r
- if ($this->xh[$the_parser]['value'])\r
- {\r
- $this->xh[$the_parser]['valuestack'][0]['values'][$this->xh[$the_parser]['valuestack'][0]['name']] = $this->xh[$the_parser]['value'];\r
- }\r
- break;\r
- case 'DATA':\r
- $this->xh[$the_parser]['ac']='';\r
- break;\r
- case 'PARAM':\r
- if ($this->xh[$the_parser]['value'])\r
- {\r
- $this->xh[$the_parser]['params'][] = $this->xh[$the_parser]['value'];\r
- }\r
- break;\r
- case 'METHODNAME':\r
- $this->xh[$the_parser]['method'] = ltrim($this->xh[$the_parser]['ac']);\r
- break;\r
- case 'PARAMS':\r
- case 'FAULT':\r
- case 'METHODCALL':\r
- case 'METHORESPONSE':\r
- // We're all good kids with nuthin' to do\r
- break;\r
- default:\r
- // End of an Invalid Element. Taken care of during the opening tag though\r
- break;\r
- }\r
- }\r
-\r
- //-------------------------------------\r
- // Parses Character Data\r
- //-------------------------------------\r
-\r
- function character_data($the_parser, $data)\r
- {\r
- if ($this->xh[$the_parser]['isf'] > 1) return; // XML Fault found already\r
- \r
- // If a value has not been found\r
- if ($this->xh[$the_parser]['lv'] != 3)\r
- {\r
- if ($this->xh[$the_parser]['lv'] == 1)\r
- {\r
- $this->xh[$the_parser]['lv'] = 2; // Found a value\r
- }\r
- \r
- if( ! @isset($this->xh[$the_parser]['ac']))\r
- {\r
- $this->xh[$the_parser]['ac'] = '';\r
- }\r
- \r
- $this->xh[$the_parser]['ac'] .= $data;\r
- }\r
- }\r
- \r
- \r
- function addParam($par) { $this->params[]=$par; }\r
- \r
- function output_parameters($array=FALSE)\r
- {\r
- $CI =& get_instance(); \r
-\r
- if ($array !== FALSE && is_array($array))\r
- {\r
- while (list($key) = each($array))\r
- {\r
- if (is_array($array[$key]))\r
- {\r
- $array[$key] = $this->output_parameters($array[$key]);\r
- }\r
- else\r
- {\r
- $array[$key] = $CI->input->xss_clean($array[$key]);\r
- }\r
- }\r
- \r
- $parameters = $array;\r
- }\r
- else\r
- {\r
- $parameters = array();\r
- \r
- for ($i = 0; $i < sizeof($this->params); $i++)\r
- {\r
- $a_param = $this->decode_message($this->params[$i]);\r
- \r
- if (is_array($a_param))\r
- {\r
- $parameters[] = $this->output_parameters($a_param);\r
- }\r
- else\r
- {\r
- $parameters[] = $CI->input->xss_clean($a_param);\r
- }\r
- } \r
- }\r
- \r
- return $parameters;\r
- }\r
- \r
- \r
- function decode_message($param)\r
- {\r
- $kind = $param->kindOf();\r
-\r
- if($kind == 'scalar')\r
- {\r
- return $param->scalarval();\r
- }\r
- elseif($kind == 'array')\r
- {\r
- reset($param->me);\r
- list($a,$b) = each($param->me);\r
- \r
- $arr = array();\r
-\r
- for($i = 0; $i < sizeof($b); $i++)\r
- {\r
- $arr[] = $this->decode_message($param->me['array'][$i]);\r
- }\r
- \r
- return $arr;\r
- }\r
- elseif($kind == 'struct')\r
- {\r
- reset($param->me['struct']);\r
- \r
- $arr = array();\r
-\r
- while(list($key,$value) = each($param->me['struct']))\r
- {\r
- $arr[$key] = $this->decode_message($value);\r
- }\r
- \r
- return $arr;\r
- }\r
- }\r
- \r
-} // End XML_RPC_Messages class\r
-\r
-\r
-\r
-/**\r
- * XML-RPC Values class\r
- *\r
- * @category XML-RPC\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html\r
- */\r
-class XML_RPC_Values extends CI_Xmlrpc\r
-{\r
- var $me = array();\r
- var $mytype = 0;\r
-\r
- function XML_RPC_Values($val=-1, $type='')\r
- { \r
- parent::CI_Xmlrpc();\r
- \r
- if ($val != -1 OR $type != '')\r
- {\r
- $type = $type == '' ? 'string' : $type;\r
- \r
- if ($this->xmlrpcTypes[$type] == 1)\r
- {\r
- $this->addScalar($val,$type);\r
- }\r
- elseif ($this->xmlrpcTypes[$type] == 2)\r
- {\r
- $this->addArray($val);\r
- }\r
- elseif ($this->xmlrpcTypes[$type] == 3)\r
- {\r
- $this->addStruct($val);\r
- }\r
- }\r
- }\r
-\r
- function addScalar($val, $type='string')\r
- {\r
- $typeof = $this->xmlrpcTypes[$type];\r
- \r
- if ($this->mytype==1)\r
- {\r
- echo '<strong>XML_RPC_Values</strong>: scalar can have only one value<br />';\r
- return 0;\r
- }\r
- \r
- if ($typeof != 1)\r
- {\r
- echo '<strong>XML_RPC_Values</strong>: not a scalar type (${typeof})<br />';\r
- return 0;\r
- }\r
-\r
- if ($type == $this->xmlrpcBoolean)\r
- {\r
- if (strcasecmp($val,'true')==0 OR $val==1 OR ($val==true && strcasecmp($val,'false')))\r
- {\r
- $val = 1;\r
- }\r
- else\r
- {\r
- $val=0;\r
- }\r
- }\r
-\r
- if ($this->mytype == 2)\r
- {\r
- // adding to an array here\r
- $ar = $this->me['array'];\r
- $ar[] = new XML_RPC_Values($val, $type);\r
- $this->me['array'] = $ar;\r
- }\r
- else\r
- {\r
- // a scalar, so set the value and remember we're scalar\r
- $this->me[$type] = $val;\r
- $this->mytype = $typeof;\r
- }\r
- return 1;\r
- }\r
-\r
- function addArray($vals)\r
- {\r
- if ($this->mytype != 0)\r
- {\r
- echo '<strong>XML_RPC_Values</strong>: already initialized as a [' . $this->kindOf() . ']<br />';\r
- return 0;\r
- }\r
-\r
- $this->mytype = $this->xmlrpcTypes['array'];\r
- $this->me['array'] = $vals;\r
- return 1;\r
- }\r
-\r
- function addStruct($vals)\r
- {\r
- if ($this->mytype != 0)\r
- {\r
- echo '<strong>XML_RPC_Values</strong>: already initialized as a [' . $this->kindOf() . ']<br />';\r
- return 0;\r
- }\r
- $this->mytype = $this->xmlrpcTypes['struct'];\r
- $this->me['struct'] = $vals;\r
- return 1;\r
- }\r
-\r
- function kindOf()\r
- {\r
- switch($this->mytype)\r
- {\r
- case 3:\r
- return 'struct';\r
- break;\r
- case 2:\r
- return 'array';\r
- break;\r
- case 1:\r
- return 'scalar';\r
- break;\r
- default:\r
- return 'undef';\r
- }\r
- }\r
-\r
- function serializedata($typ, $val)\r
- {\r
- $rs = '';\r
- \r
- switch($this->xmlrpcTypes[$typ])\r
- {\r
- case 3:\r
- // struct\r
- $rs .= "<struct>\n";\r
- reset($val);\r
- while(list($key2, $val2) = each($val))\r
- {\r
- $rs .= "<member>\n<name>{$key2}</name>\n";\r
- $rs .= $this->serializeval($val2);\r
- $rs .= "</member>\n";\r
- }\r
- $rs .= '</struct>';\r
- break;\r
- case 2:\r
- // array\r
- $rs .= "<array>\n<data>\n";\r
- for($i=0; $i < sizeof($val); $i++)\r
- {\r
- $rs .= $this->serializeval($val[$i]);\r
- }\r
- $rs.="</data>\n</array>\n";\r
- break;\r
- case 1:\r
- // others\r
- switch ($typ)\r
- {\r
- case $this->xmlrpcBase64:\r
- $rs .= "<{$typ}>" . base64_encode($val) . "</{$typ}>\n";\r
- break;\r
- case $this->xmlrpcBoolean:\r
- $rs .= "<{$typ}>" . ($val ? '1' : '0') . "</{$typ}>\n";\r
- break;\r
- case $this->xmlrpcString:\r
- $rs .= "<{$typ}>" . htmlspecialchars($val). "</{$typ}>\n";\r
- break;\r
- default:\r
- $rs .= "<{$typ}>{$val}</{$typ}>\n";\r
- break;\r
- }\r
- default:\r
- break;\r
- }\r
- return $rs;\r
- }\r
-\r
- function serialize_class()\r
- {\r
- return $this->serializeval($this);\r
- }\r
-\r
- function serializeval($o)\r
- {\r
- $ar = $o->me;\r
- reset($ar);\r
- \r
- list($typ, $val) = each($ar);\r
- $rs = "<value>\n".$this->serializedata($typ, $val)."</value>\n";\r
- return $rs;\r
- }\r
- \r
- function scalarval()\r
- {\r
- reset($this->me);\r
- list($a,$b) = each($this->me);\r
- return $b;\r
- }\r
-\r
-\r
- //-------------------------------------\r
- // Encode time in ISO-8601 form.\r
- //-------------------------------------\r
- \r
- // Useful for sending time in XML-RPC\r
-\r
- function iso8601_encode($time, $utc=0)\r
- { \r
- if ($utc == 1)\r
- {\r
- $t = strftime("%Y%m%dT%H:%M:%S", $time);\r
- }\r
- else\r
- {\r
- if (function_exists('gmstrftime'))\r
- $t = gmstrftime("%Y%m%dT%H:%M:%S", $time);\r
- else\r
- $t = strftime("%Y%m%dT%H:%M:%S", $time - date('Z'));\r
- }\r
- return $t;\r
- }\r
- \r
-}\r
-// END XML_RPC_Values Class\r
-\r
-/* End of file Xmlrpc.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+if ( ! function_exists('xml_parser_create'))
+{
+ show_error('Your PHP installation does not support XML');
+}
+
+
+// ------------------------------------------------------------------------
+
+/**
+ * XML-RPC request handler class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category XML-RPC
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html
+ */
+class CI_Xmlrpc {
+
+ var $debug = FALSE; // Debugging on or off
+ var $xmlrpcI4 = 'i4';
+ var $xmlrpcInt = 'int';
+ var $xmlrpcBoolean = 'boolean';
+ var $xmlrpcDouble = 'double';
+ var $xmlrpcString = 'string';
+ var $xmlrpcDateTime = 'datetime.iso8601';
+ var $xmlrpcBase64 = 'base64';
+ var $xmlrpcArray = 'array';
+ var $xmlrpcStruct = 'struct';
+
+ var $xmlrpcTypes = array();
+ var $valid_parents = array();
+ var $xmlrpcerr = array(); // Response numbers
+ var $xmlrpcstr = array(); // Response strings
+
+ var $xmlrpc_defencoding = 'UTF-8';
+ var $xmlrpcName = 'XML-RPC for CodeIgniter';
+ var $xmlrpcVersion = '1.1';
+ var $xmlrpcerruser = 800; // Start of user errors
+ var $xmlrpcerrxml = 100; // Start of XML Parse errors
+ var $xmlrpc_backslash = ''; // formulate backslashes for escaping regexp
+
+ var $client;
+ var $method;
+ var $data;
+ var $message = '';
+ var $error = ''; // Error string for request
+ var $result;
+ var $response = array(); // Response from remote server
+
+
+ //-------------------------------------
+ // VALUES THAT MULTIPLE CLASSES NEED
+ //-------------------------------------
+
+ function CI_Xmlrpc ($config = array())
+ {
+ $this->xmlrpcName = $this->xmlrpcName;
+ $this->xmlrpc_backslash = chr(92).chr(92);
+
+ // Types for info sent back and forth
+ $this->xmlrpcTypes = array(
+ $this->xmlrpcI4 => '1',
+ $this->xmlrpcInt => '1',
+ $this->xmlrpcBoolean => '1',
+ $this->xmlrpcString => '1',
+ $this->xmlrpcDouble => '1',
+ $this->xmlrpcDateTime => '1',
+ $this->xmlrpcBase64 => '1',
+ $this->xmlrpcArray => '2',
+ $this->xmlrpcStruct => '3'
+ );
+
+ // Array of Valid Parents for Various XML-RPC elements
+ $this->valid_parents = array('BOOLEAN' => array('VALUE'),
+ 'I4' => array('VALUE'),
+ 'INT' => array('VALUE'),
+ 'STRING' => array('VALUE'),
+ 'DOUBLE' => array('VALUE'),
+ 'DATETIME.ISO8601' => array('VALUE'),
+ 'BASE64' => array('VALUE'),
+ 'ARRAY' => array('VALUE'),
+ 'STRUCT' => array('VALUE'),
+ 'PARAM' => array('PARAMS'),
+ 'METHODNAME' => array('METHODCALL'),
+ 'PARAMS' => array('METHODCALL', 'METHODRESPONSE'),
+ 'MEMBER' => array('STRUCT'),
+ 'NAME' => array('MEMBER'),
+ 'DATA' => array('ARRAY'),
+ 'FAULT' => array('METHODRESPONSE'),
+ 'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT')
+ );
+
+
+ // XML-RPC Responses
+ $this->xmlrpcerr['unknown_method'] = '1';
+ $this->xmlrpcstr['unknown_method'] = 'This is not a known method for this XML-RPC Server';
+ $this->xmlrpcerr['invalid_return'] = '2';
+ $this->xmlrpcstr['invalid_return'] = 'The XML data receieved was either invalid or not in the correct form for XML-RPC. Turn on debugging to examine the XML data further.';
+ $this->xmlrpcerr['incorrect_params'] = '3';
+ $this->xmlrpcstr['incorrect_params'] = 'Incorrect parameters were passed to method';
+ $this->xmlrpcerr['introspect_unknown'] = '4';
+ $this->xmlrpcstr['introspect_unknown'] = "Cannot inspect signature for request: method unknown";
+ $this->xmlrpcerr['http_error'] = '5';
+ $this->xmlrpcstr['http_error'] = "Did not receive a '200 OK' response from remote server.";
+ $this->xmlrpcerr['no_data'] = '6';
+ $this->xmlrpcstr['no_data'] ='No data received from server.';
+
+ $this->initialize($config);
+
+ log_message('debug', "XML-RPC Class Initialized");
+ }
+
+
+ //-------------------------------------
+ // Initialize Prefs
+ //-------------------------------------
+
+ function initialize($config = array())
+ {
+ if (sizeof($config) > 0)
+ {
+ foreach ($config as $key => $val)
+ {
+ if (isset($this->$key))
+ {
+ $this->$key = $val;
+ }
+ }
+ }
+ }
+ // END
+
+ //-------------------------------------
+ // Take URL and parse it
+ //-------------------------------------
+
+ function server($url, $port=80)
+ {
+ if (substr($url, 0, 4) != "http")
+ {
+ $url = "http://".$url;
+ }
+
+ $parts = parse_url($url);
+
+ $path = ( ! isset($parts['path'])) ? '/' : $parts['path'];
+
+ if (isset($parts['query']) && $parts['query'] != '')
+ {
+ $path .= '?'.$parts['query'];
+ }
+
+ $this->client = new XML_RPC_Client($path, $parts['host'], $port);
+ }
+ // END
+
+ //-------------------------------------
+ // Set Timeout
+ //-------------------------------------
+
+ function timeout($seconds=5)
+ {
+ if ( ! is_null($this->client) && is_int($seconds))
+ {
+ $this->client->timeout = $seconds;
+ }
+ }
+ // END
+
+ //-------------------------------------
+ // Set Methods
+ //-------------------------------------
+
+ function method($function)
+ {
+ $this->method = $function;
+ }
+ // END
+
+ //-------------------------------------
+ // Take Array of Data and Create Objects
+ //-------------------------------------
+
+ function request($incoming)
+ {
+ if ( ! is_array($incoming))
+ {
+ // Send Error
+ }
+
+ $this->data = array();
+
+ foreach($incoming as $key => $value)
+ {
+ $this->data[$key] = $this->values_parsing($value);
+ }
+ }
+ // END
+
+
+ //-------------------------------------
+ // Set Debug
+ //-------------------------------------
+
+ function set_debug($flag = TRUE)
+ {
+ $this->debug = ($flag == TRUE) ? TRUE : FALSE;
+ }
+
+ //-------------------------------------
+ // Values Parsing
+ //-------------------------------------
+
+ function values_parsing($value, $return = FALSE)
+ {
+ if (is_array($value) && isset($value['0']))
+ {
+ if ( ! isset($value['1']) OR ! isset($this->xmlrpcTypes[strtolower($value['1'])]))
+ {
+ if (is_array($value[0]))
+ {
+ $temp = new XML_RPC_Values($value['0'], 'array');
+ }
+ else
+ {
+ $temp = new XML_RPC_Values($value['0'], 'string');
+ }
+ }
+ elseif(is_array($value['0']) && ($value['1'] == 'struct' OR $value['1'] == 'array'))
+ {
+ while (list($k) = each($value['0']))
+ {
+ $value['0'][$k] = $this->values_parsing($value['0'][$k], TRUE);
+ }
+
+ $temp = new XML_RPC_Values($value['0'], $value['1']);
+ }
+ else
+ {
+ $temp = new XML_RPC_Values($value['0'], $value['1']);
+ }
+ }
+ else
+ {
+ $temp = new XML_RPC_Values($value, 'string');
+ }
+
+ return $temp;
+ }
+ // END
+
+
+ //-------------------------------------
+ // Sends XML-RPC Request
+ //-------------------------------------
+
+ function send_request()
+ {
+ $this->message = new XML_RPC_Message($this->method,$this->data);
+ $this->message->debug = $this->debug;
+
+ if ( ! $this->result = $this->client->send($this->message))
+ {
+ $this->error = $this->result->errstr;
+ return FALSE;
+ }
+ elseif( ! is_object($this->result->val))
+ {
+ $this->error = $this->result->errstr;
+ return FALSE;
+ }
+
+ $this->response = $this->result->decode();
+
+ return TRUE;
+ }
+ // END
+
+ //-------------------------------------
+ // Returns Error
+ //-------------------------------------
+
+ function display_error()
+ {
+ return $this->error;
+ }
+ // END
+
+ //-------------------------------------
+ // Returns Remote Server Response
+ //-------------------------------------
+
+ function display_response()
+ {
+ return $this->response;
+ }
+ // END
+
+ //-------------------------------------
+ // Sends an Error Message for Server Request
+ //-------------------------------------
+
+ function send_error_message($number, $message)
+ {
+ return new XML_RPC_Response('0',$number, $message);
+ }
+ // END
+
+
+ //-------------------------------------
+ // Send Response for Server Request
+ //-------------------------------------
+
+ function send_response($response)
+ {
+ // $response should be array of values, which will be parsed
+ // based on their data and type into a valid group of XML-RPC values
+
+ $response = $this->values_parsing($response);
+
+ return new XML_RPC_Response($response);
+ }
+ // END
+
+} // END XML_RPC Class
+
+
+
+/**
+ * XML-RPC Client class
+ *
+ * @category XML-RPC
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html
+ */
+class XML_RPC_Client extends CI_Xmlrpc
+{
+ var $path = '';
+ var $server = '';
+ var $port = 80;
+ var $errno = '';
+ var $errstring = '';
+ var $timeout = 5;
+ var $no_multicall = false;
+
+ function XML_RPC_Client($path, $server, $port=80)
+ {
+ parent::CI_Xmlrpc();
+
+ $this->port = $port;
+ $this->server = $server;
+ $this->path = $path;
+ }
+
+ function send($msg)
+ {
+ if (is_array($msg))
+ {
+ // Multi-call disabled
+ $r = new XML_RPC_Response(0, $this->xmlrpcerr['multicall_recursion'],$this->xmlrpcstr['multicall_recursion']);
+ return $r;
+ }
+
+ return $this->sendPayload($msg);
+ }
+
+ function sendPayload($msg)
+ {
+ $fp = @fsockopen($this->server, $this->port,$this->errno, $this->errstr, $this->timeout);
+
+ if ( ! is_resource($fp))
+ {
+ error_log($this->xmlrpcstr['http_error']);
+ $r = new XML_RPC_Response(0, $this->xmlrpcerr['http_error'],$this->xmlrpcstr['http_error']);
+ return $r;
+ }
+
+ if(empty($msg->payload))
+ {
+ // $msg = XML_RPC_Messages
+ $msg->createPayload();
+ }
+
+ $r = "\r\n";
+ $op = "POST {$this->path} HTTP/1.0$r";
+ $op .= "Host: {$this->server}$r";
+ $op .= "Content-Type: text/xml$r";
+ $op .= "User-Agent: {$this->xmlrpcName}$r";
+ $op .= "Content-Length: ".strlen($msg->payload). "$r$r";
+ $op .= $msg->payload;
+
+
+ if ( ! fputs($fp, $op, strlen($op)))
+ {
+ error_log($this->xmlrpcstr['http_error']);
+ $r = new XML_RPC_Response(0, $this->xmlrpcerr['http_error'], $this->xmlrpcstr['http_error']);
+ return $r;
+ }
+ $resp = $msg->parseResponse($fp);
+ fclose($fp);
+ return $resp;
+ }
+
+} // end class XML_RPC_Client
+
+
+/**
+ * XML-RPC Response class
+ *
+ * @category XML-RPC
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html
+ */
+class XML_RPC_Response
+{
+ var $val = 0;
+ var $errno = 0;
+ var $errstr = '';
+ var $headers = array();
+
+ function XML_RPC_Response($val, $code = 0, $fstr = '')
+ {
+ if ($code != 0)
+ {
+ // error
+ $this->errno = $code;
+ $this->errstr = htmlentities($fstr);
+ }
+ else if ( ! is_object($val))
+ {
+ // programmer error, not an object
+ error_log("Invalid type '" . gettype($val) . "' (value: $val) passed to XML_RPC_Response. Defaulting to empty value.");
+ $this->val = new XML_RPC_Values();
+ }
+ else
+ {
+ $this->val = $val;
+ }
+ }
+
+ function faultCode()
+ {
+ return $this->errno;
+ }
+
+ function faultString()
+ {
+ return $this->errstr;
+ }
+
+ function value()
+ {
+ return $this->val;
+ }
+
+ function prepare_response()
+ {
+ $result = "<methodResponse>\n";
+ if ($this->errno)
+ {
+ $result .= '<fault>
+ <value>
+ <struct>
+ <member>
+ <name>faultCode</name>
+ <value><int>' . $this->errno . '</int></value>
+ </member>
+ <member>
+ <name>faultString</name>
+ <value><string>' . $this->errstr . '</string></value>
+ </member>
+ </struct>
+ </value>
+</fault>';
+ }
+ else
+ {
+ $result .= "<params>\n<param>\n" .
+ $this->val->serialize_class() .
+ "</param>\n</params>";
+ }
+ $result .= "\n</methodResponse>";
+ return $result;
+ }
+
+ function decode($array=FALSE)
+ {
+ $CI =& get_instance();
+
+ if ($array !== FALSE && is_array($array))
+ {
+ while (list($key) = each($array))
+ {
+ if (is_array($array[$key]))
+ {
+ $array[$key] = $this->decode($array[$key]);
+ }
+ else
+ {
+ $array[$key] = $CI->input->xss_clean($array[$key]);
+ }
+ }
+
+ $result = $array;
+ }
+ else
+ {
+ $result = $this->xmlrpc_decoder($this->val);
+
+ if (is_array($result))
+ {
+ $result = $this->decode($result);
+ }
+ else
+ {
+ $result = $CI->input->xss_clean($result);
+ }
+ }
+
+ return $result;
+ }
+
+
+
+ //-------------------------------------
+ // XML-RPC Object to PHP Types
+ //-------------------------------------
+
+ function xmlrpc_decoder($xmlrpc_val)
+ {
+ $kind = $xmlrpc_val->kindOf();
+
+ if($kind == 'scalar')
+ {
+ return $xmlrpc_val->scalarval();
+ }
+ elseif($kind == 'array')
+ {
+ reset($xmlrpc_val->me);
+ list($a,$b) = each($xmlrpc_val->me);
+ $size = sizeof($b);
+
+ $arr = array();
+
+ for($i = 0; $i < $size; $i++)
+ {
+ $arr[] = $this->xmlrpc_decoder($xmlrpc_val->me['array'][$i]);
+ }
+ return $arr;
+ }
+ elseif($kind == 'struct')
+ {
+ reset($xmlrpc_val->me['struct']);
+ $arr = array();
+
+ while(list($key,$value) = each($xmlrpc_val->me['struct']))
+ {
+ $arr[$key] = $this->xmlrpc_decoder($value);
+ }
+ return $arr;
+ }
+ }
+
+
+ //-------------------------------------
+ // ISO-8601 time to server or UTC time
+ //-------------------------------------
+
+ function iso8601_decode($time, $utc=0)
+ {
+ // return a timet in the localtime, or UTC
+ $t = 0;
+ if (preg_match('/([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})/', $time, $regs))
+ {
+ if ($utc == 1)
+ $t = gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
+ else
+ $t = mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
+ }
+ return $t;
+ }
+
+} // End Response Class
+
+
+
+/**
+ * XML-RPC Message class
+ *
+ * @category XML-RPC
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html
+ */
+class XML_RPC_Message extends CI_Xmlrpc
+{
+ var $payload;
+ var $method_name;
+ var $params = array();
+ var $xh = array();
+
+ function XML_RPC_Message($method, $pars=0)
+ {
+ parent::CI_Xmlrpc();
+
+ $this->method_name = $method;
+ if (is_array($pars) && sizeof($pars) > 0)
+ {
+ for($i=0; $i<sizeof($pars); $i++)
+ {
+ // $pars[$i] = XML_RPC_Values
+ $this->params[] = $pars[$i];
+ }
+ }
+ }
+
+ //-------------------------------------
+ // Create Payload to Send
+ //-------------------------------------
+
+ function createPayload()
+ {
+ $this->payload = "<?xml version=\"1.0\"?".">\r\n<methodCall>\r\n";
+ $this->payload .= '<methodName>' . $this->method_name . "</methodName>\r\n";
+ $this->payload .= "<params>\r\n";
+
+ for($i=0; $i<sizeof($this->params); $i++)
+ {
+ // $p = XML_RPC_Values
+ $p = $this->params[$i];
+ $this->payload .= "<param>\r\n".$p->serialize_class()."</param>\r\n";
+ }
+
+ $this->payload .= "</params>\r\n</methodCall>\r\n";
+ }
+
+ //-------------------------------------
+ // Parse External XML-RPC Server's Response
+ //-------------------------------------
+
+ function parseResponse($fp)
+ {
+ $data = '';
+
+ while($datum = fread($fp, 4096))
+ {
+ $data .= $datum;
+ }
+
+ //-------------------------------------
+ // DISPLAY HTTP CONTENT for DEBUGGING
+ //-------------------------------------
+
+ if ($this->debug === TRUE)
+ {
+ echo "<pre>";
+ echo "---DATA---\n" . htmlspecialchars($data) . "\n---END DATA---\n\n";
+ echo "</pre>";
+ }
+
+ //-------------------------------------
+ // Check for data
+ //-------------------------------------
+
+ if($data == "")
+ {
+ error_log($this->xmlrpcstr['no_data']);
+ $r = new XML_RPC_Response(0, $this->xmlrpcerr['no_data'], $this->xmlrpcstr['no_data']);
+ return $r;
+ }
+
+
+ //-------------------------------------
+ // Check for HTTP 200 Response
+ //-------------------------------------
+
+ if (strncmp($data, 'HTTP', 4) == 0 && ! preg_match('/^HTTP\/[0-9\.]+ 200 /', $data))
+ {
+ $errstr= substr($data, 0, strpos($data, "\n")-1);
+ $r = new XML_RPC_Response(0, $this->xmlrpcerr['http_error'], $this->xmlrpcstr['http_error']. ' (' . $errstr . ')');
+ return $r;
+ }
+
+ //-------------------------------------
+ // Create and Set Up XML Parser
+ //-------------------------------------
+
+ $parser = xml_parser_create($this->xmlrpc_defencoding);
+
+ $this->xh[$parser] = array();
+ $this->xh[$parser]['isf'] = 0;
+ $this->xh[$parser]['ac'] = '';
+ $this->xh[$parser]['headers'] = array();
+ $this->xh[$parser]['stack'] = array();
+ $this->xh[$parser]['valuestack'] = array();
+ $this->xh[$parser]['isf_reason'] = 0;
+
+ xml_set_object($parser, $this);
+ xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
+ xml_set_element_handler($parser, 'open_tag', 'closing_tag');
+ xml_set_character_data_handler($parser, 'character_data');
+ //xml_set_default_handler($parser, 'default_handler');
+
+
+ //-------------------------------------
+ // GET HEADERS
+ //-------------------------------------
+
+ $lines = explode("\r\n", $data);
+ while (($line = array_shift($lines)))
+ {
+ if (strlen($line) < 1)
+ {
+ break;
+ }
+ $this->xh[$parser]['headers'][] = $line;
+ }
+ $data = implode("\r\n", $lines);
+
+
+ //-------------------------------------
+ // PARSE XML DATA
+ //-------------------------------------
+
+ if ( ! xml_parse($parser, $data, sizeof($data)))
+ {
+ $errstr = sprintf('XML error: %s at line %d',
+ xml_error_string(xml_get_error_code($parser)),
+ xml_get_current_line_number($parser));
+ //error_log($errstr);
+ $r = new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return']);
+ xml_parser_free($parser);
+ return $r;
+ }
+ xml_parser_free($parser);
+
+ // ---------------------------------------
+ // Got Ourselves Some Badness, It Seems
+ // ---------------------------------------
+
+ if ($this->xh[$parser]['isf'] > 1)
+ {
+ if ($this->debug === TRUE)
+ {
+ echo "---Invalid Return---\n";
+ echo $this->xh[$parser]['isf_reason'];
+ echo "---Invalid Return---\n\n";
+ }
+
+ $r = new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'],$this->xmlrpcstr['invalid_return'].' '.$this->xh[$parser]['isf_reason']);
+ return $r;
+ }
+ elseif ( ! is_object($this->xh[$parser]['value']))
+ {
+ $r = new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'],$this->xmlrpcstr['invalid_return'].' '.$this->xh[$parser]['isf_reason']);
+ return $r;
+ }
+
+ //-------------------------------------
+ // DISPLAY XML CONTENT for DEBUGGING
+ //-------------------------------------
+
+ if ($this->debug === TRUE)
+ {
+ echo "<pre>";
+
+ if (count($this->xh[$parser]['headers'] > 0))
+ {
+ echo "---HEADERS---\n";
+ foreach ($this->xh[$parser]['headers'] as $header)
+ {
+ echo "$header\n";
+ }
+ echo "---END HEADERS---\n\n";
+ }
+
+ echo "---DATA---\n" . htmlspecialchars($data) . "\n---END DATA---\n\n";
+
+ echo "---PARSED---\n" ;
+ var_dump($this->xh[$parser]['value']);
+ echo "\n---END PARSED---</pre>";
+ }
+
+ //-------------------------------------
+ // SEND RESPONSE
+ //-------------------------------------
+
+ $v = $this->xh[$parser]['value'];
+
+ if ($this->xh[$parser]['isf'])
+ {
+ $errno_v = $v->me['struct']['faultCode'];
+ $errstr_v = $v->me['struct']['faultString'];
+ $errno = $errno_v->scalarval();
+
+ if ($errno == 0)
+ {
+ // FAULT returned, errno needs to reflect that
+ $errno = -1;
+ }
+
+ $r = new XML_RPC_Response($v, $errno, $errstr_v->scalarval());
+ }
+ else
+ {
+ $r = new XML_RPC_Response($v);
+ }
+
+ $r->headers = $this->xh[$parser]['headers'];
+ return $r;
+ }
+
+ // ------------------------------------
+ // Begin Return Message Parsing section
+ // ------------------------------------
+
+ // quick explanation of components:
+ // ac - used to accumulate values
+ // isf - used to indicate a fault
+ // lv - used to indicate "looking for a value": implements
+ // the logic to allow values with no types to be strings
+ // params - used to store parameters in method calls
+ // method - used to store method name
+ // stack - array with parent tree of the xml element,
+ // used to validate the nesting of elements
+
+ //-------------------------------------
+ // Start Element Handler
+ //-------------------------------------
+
+ function open_tag($the_parser, $name, $attrs)
+ {
+ // If invalid nesting, then return
+ if ($this->xh[$the_parser]['isf'] > 1) return;
+
+ // Evaluate and check for correct nesting of XML elements
+
+ if (count($this->xh[$the_parser]['stack']) == 0)
+ {
+ if ($name != 'METHODRESPONSE' && $name != 'METHODCALL')
+ {
+ $this->xh[$the_parser]['isf'] = 2;
+ $this->xh[$the_parser]['isf_reason'] = 'Top level XML-RPC element is missing';
+ return;
+ }
+ }
+ else
+ {
+ // not top level element: see if parent is OK
+ if ( ! in_array($this->xh[$the_parser]['stack'][0], $this->valid_parents[$name], TRUE))
+ {
+ $this->xh[$the_parser]['isf'] = 2;
+ $this->xh[$the_parser]['isf_reason'] = "XML-RPC element $name cannot be child of ".$this->xh[$the_parser]['stack'][0];
+ return;
+ }
+ }
+
+ switch($name)
+ {
+ case 'STRUCT':
+ case 'ARRAY':
+ // Creates array for child elements
+
+ $cur_val = array('value' => array(),
+ 'type' => $name);
+
+ array_unshift($this->xh[$the_parser]['valuestack'], $cur_val);
+ break;
+ case 'METHODNAME':
+ case 'NAME':
+ $this->xh[$the_parser]['ac'] = '';
+ break;
+ case 'FAULT':
+ $this->xh[$the_parser]['isf'] = 1;
+ break;
+ case 'PARAM':
+ $this->xh[$the_parser]['value'] = null;
+ break;
+ case 'VALUE':
+ $this->xh[$the_parser]['vt'] = 'value';
+ $this->xh[$the_parser]['ac'] = '';
+ $this->xh[$the_parser]['lv'] = 1;
+ break;
+ case 'I4':
+ case 'INT':
+ case 'STRING':
+ case 'BOOLEAN':
+ case 'DOUBLE':
+ case 'DATETIME.ISO8601':
+ case 'BASE64':
+ if ($this->xh[$the_parser]['vt'] != 'value')
+ {
+ //two data elements inside a value: an error occurred!
+ $this->xh[$the_parser]['isf'] = 2;
+ $this->xh[$the_parser]['isf_reason'] = "'Twas a $name element following a ".$this->xh[$the_parser]['vt']." element inside a single value";
+ return;
+ }
+
+ $this->xh[$the_parser]['ac'] = '';
+ break;
+ case 'MEMBER':
+ // Set name of <member> to nothing to prevent errors later if no <name> is found
+ $this->xh[$the_parser]['valuestack'][0]['name'] = '';
+
+ // Set NULL value to check to see if value passed for this param/member
+ $this->xh[$the_parser]['value'] = null;
+ break;
+ case 'DATA':
+ case 'METHODCALL':
+ case 'METHODRESPONSE':
+ case 'PARAMS':
+ // valid elements that add little to processing
+ break;
+ default:
+ /// An Invalid Element is Found, so we have trouble
+ $this->xh[$the_parser]['isf'] = 2;
+ $this->xh[$the_parser]['isf_reason'] = "Invalid XML-RPC element found: $name";
+ break;
+ }
+
+ // Add current element name to stack, to allow validation of nesting
+ array_unshift($this->xh[$the_parser]['stack'], $name);
+
+ if ($name != 'VALUE') $this->xh[$the_parser]['lv'] = 0;
+ }
+ // END
+
+
+ //-------------------------------------
+ // End Element Handler
+ //-------------------------------------
+
+ function closing_tag($the_parser, $name)
+ {
+ if ($this->xh[$the_parser]['isf'] > 1) return;
+
+ // Remove current element from stack and set variable
+ // NOTE: If the XML validates, then we do not have to worry about
+ // the opening and closing of elements. Nesting is checked on the opening
+ // tag so we be safe there as well.
+
+ $curr_elem = array_shift($this->xh[$the_parser]['stack']);
+
+ switch($name)
+ {
+ case 'STRUCT':
+ case 'ARRAY':
+ $cur_val = array_shift($this->xh[$the_parser]['valuestack']);
+ $this->xh[$the_parser]['value'] = ( ! isset($cur_val['values'])) ? array() : $cur_val['values'];
+ $this->xh[$the_parser]['vt'] = strtolower($name);
+ break;
+ case 'NAME':
+ $this->xh[$the_parser]['valuestack'][0]['name'] = $this->xh[$the_parser]['ac'];
+ break;
+ case 'BOOLEAN':
+ case 'I4':
+ case 'INT':
+ case 'STRING':
+ case 'DOUBLE':
+ case 'DATETIME.ISO8601':
+ case 'BASE64':
+ $this->xh[$the_parser]['vt'] = strtolower($name);
+
+ if ($name == 'STRING')
+ {
+ $this->xh[$the_parser]['value'] = $this->xh[$the_parser]['ac'];
+ }
+ elseif ($name=='DATETIME.ISO8601')
+ {
+ $this->xh[$the_parser]['vt'] = $this->xmlrpcDateTime;
+ $this->xh[$the_parser]['value'] = $this->xh[$the_parser]['ac'];
+ }
+ elseif ($name=='BASE64')
+ {
+ $this->xh[$the_parser]['value'] = base64_decode($this->xh[$the_parser]['ac']);
+ }
+ elseif ($name=='BOOLEAN')
+ {
+ // Translated BOOLEAN values to TRUE AND FALSE
+ if ($this->xh[$the_parser]['ac'] == '1')
+ {
+ $this->xh[$the_parser]['value'] = TRUE;
+ }
+ else
+ {
+ $this->xh[$the_parser]['value'] = FALSE;
+ }
+ }
+ elseif ($name=='DOUBLE')
+ {
+ // we have a DOUBLE
+ // we must check that only 0123456789-.<space> are characters here
+ if ( ! preg_match('/^[+-]?[eE0-9\t \.]+$/', $this->xh[$the_parser]['ac']))
+ {
+ $this->xh[$the_parser]['value'] = 'ERROR_NON_NUMERIC_FOUND';
+ }
+ else
+ {
+ $this->xh[$the_parser]['value'] = (double)$this->xh[$the_parser]['ac'];
+ }
+ }
+ else
+ {
+ // we have an I4/INT
+ // we must check that only 0123456789-<space> are characters here
+ if ( ! preg_match('/^[+-]?[0-9\t ]+$/', $this->xh[$the_parser]['ac']))
+ {
+ $this->xh[$the_parser]['value'] = 'ERROR_NON_NUMERIC_FOUND';
+ }
+ else
+ {
+ $this->xh[$the_parser]['value'] = (int)$this->xh[$the_parser]['ac'];
+ }
+ }
+ $this->xh[$the_parser]['ac'] = '';
+ $this->xh[$the_parser]['lv'] = 3; // indicate we've found a value
+ break;
+ case 'VALUE':
+ // This if() detects if no scalar was inside <VALUE></VALUE>
+ if ($this->xh[$the_parser]['vt']=='value')
+ {
+ $this->xh[$the_parser]['value'] = $this->xh[$the_parser]['ac'];
+ $this->xh[$the_parser]['vt'] = $this->xmlrpcString;
+ }
+
+ // build the XML-RPC value out of the data received, and substitute it
+ $temp = new XML_RPC_Values($this->xh[$the_parser]['value'], $this->xh[$the_parser]['vt']);
+
+ if (count($this->xh[$the_parser]['valuestack']) && $this->xh[$the_parser]['valuestack'][0]['type'] == 'ARRAY')
+ {
+ // Array
+ $this->xh[$the_parser]['valuestack'][0]['values'][] = $temp;
+ }
+ else
+ {
+ // Struct
+ $this->xh[$the_parser]['value'] = $temp;
+ }
+ break;
+ case 'MEMBER':
+ $this->xh[$the_parser]['ac']='';
+
+ // If value add to array in the stack for the last element built
+ if ($this->xh[$the_parser]['value'])
+ {
+ $this->xh[$the_parser]['valuestack'][0]['values'][$this->xh[$the_parser]['valuestack'][0]['name']] = $this->xh[$the_parser]['value'];
+ }
+ break;
+ case 'DATA':
+ $this->xh[$the_parser]['ac']='';
+ break;
+ case 'PARAM':
+ if ($this->xh[$the_parser]['value'])
+ {
+ $this->xh[$the_parser]['params'][] = $this->xh[$the_parser]['value'];
+ }
+ break;
+ case 'METHODNAME':
+ $this->xh[$the_parser]['method'] = ltrim($this->xh[$the_parser]['ac']);
+ break;
+ case 'PARAMS':
+ case 'FAULT':
+ case 'METHODCALL':
+ case 'METHORESPONSE':
+ // We're all good kids with nuthin' to do
+ break;
+ default:
+ // End of an Invalid Element. Taken care of during the opening tag though
+ break;
+ }
+ }
+
+ //-------------------------------------
+ // Parses Character Data
+ //-------------------------------------
+
+ function character_data($the_parser, $data)
+ {
+ if ($this->xh[$the_parser]['isf'] > 1) return; // XML Fault found already
+
+ // If a value has not been found
+ if ($this->xh[$the_parser]['lv'] != 3)
+ {
+ if ($this->xh[$the_parser]['lv'] == 1)
+ {
+ $this->xh[$the_parser]['lv'] = 2; // Found a value
+ }
+
+ if( ! @isset($this->xh[$the_parser]['ac']))
+ {
+ $this->xh[$the_parser]['ac'] = '';
+ }
+
+ $this->xh[$the_parser]['ac'] .= $data;
+ }
+ }
+
+
+ function addParam($par) { $this->params[]=$par; }
+
+ function output_parameters($array=FALSE)
+ {
+ $CI =& get_instance();
+
+ if ($array !== FALSE && is_array($array))
+ {
+ while (list($key) = each($array))
+ {
+ if (is_array($array[$key]))
+ {
+ $array[$key] = $this->output_parameters($array[$key]);
+ }
+ else
+ {
+ $array[$key] = $CI->input->xss_clean($array[$key]);
+ }
+ }
+
+ $parameters = $array;
+ }
+ else
+ {
+ $parameters = array();
+
+ for ($i = 0; $i < sizeof($this->params); $i++)
+ {
+ $a_param = $this->decode_message($this->params[$i]);
+
+ if (is_array($a_param))
+ {
+ $parameters[] = $this->output_parameters($a_param);
+ }
+ else
+ {
+ $parameters[] = $CI->input->xss_clean($a_param);
+ }
+ }
+ }
+
+ return $parameters;
+ }
+
+
+ function decode_message($param)
+ {
+ $kind = $param->kindOf();
+
+ if($kind == 'scalar')
+ {
+ return $param->scalarval();
+ }
+ elseif($kind == 'array')
+ {
+ reset($param->me);
+ list($a,$b) = each($param->me);
+
+ $arr = array();
+
+ for($i = 0; $i < sizeof($b); $i++)
+ {
+ $arr[] = $this->decode_message($param->me['array'][$i]);
+ }
+
+ return $arr;
+ }
+ elseif($kind == 'struct')
+ {
+ reset($param->me['struct']);
+
+ $arr = array();
+
+ while(list($key,$value) = each($param->me['struct']))
+ {
+ $arr[$key] = $this->decode_message($value);
+ }
+
+ return $arr;
+ }
+ }
+
+} // End XML_RPC_Messages class
+
+
+
+/**
+ * XML-RPC Values class
+ *
+ * @category XML-RPC
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html
+ */
+class XML_RPC_Values extends CI_Xmlrpc
+{
+ var $me = array();
+ var $mytype = 0;
+
+ function XML_RPC_Values($val=-1, $type='')
+ {
+ parent::CI_Xmlrpc();
+
+ if ($val != -1 OR $type != '')
+ {
+ $type = $type == '' ? 'string' : $type;
+
+ if ($this->xmlrpcTypes[$type] == 1)
+ {
+ $this->addScalar($val,$type);
+ }
+ elseif ($this->xmlrpcTypes[$type] == 2)
+ {
+ $this->addArray($val);
+ }
+ elseif ($this->xmlrpcTypes[$type] == 3)
+ {
+ $this->addStruct($val);
+ }
+ }
+ }
+
+ function addScalar($val, $type='string')
+ {
+ $typeof = $this->xmlrpcTypes[$type];
+
+ if ($this->mytype==1)
+ {
+ echo '<strong>XML_RPC_Values</strong>: scalar can have only one value<br />';
+ return 0;
+ }
+
+ if ($typeof != 1)
+ {
+ echo '<strong>XML_RPC_Values</strong>: not a scalar type (${typeof})<br />';
+ return 0;
+ }
+
+ if ($type == $this->xmlrpcBoolean)
+ {
+ if (strcasecmp($val,'true')==0 OR $val==1 OR ($val==true && strcasecmp($val,'false')))
+ {
+ $val = 1;
+ }
+ else
+ {
+ $val=0;
+ }
+ }
+
+ if ($this->mytype == 2)
+ {
+ // adding to an array here
+ $ar = $this->me['array'];
+ $ar[] = new XML_RPC_Values($val, $type);
+ $this->me['array'] = $ar;
+ }
+ else
+ {
+ // a scalar, so set the value and remember we're scalar
+ $this->me[$type] = $val;
+ $this->mytype = $typeof;
+ }
+ return 1;
+ }
+
+ function addArray($vals)
+ {
+ if ($this->mytype != 0)
+ {
+ echo '<strong>XML_RPC_Values</strong>: already initialized as a [' . $this->kindOf() . ']<br />';
+ return 0;
+ }
+
+ $this->mytype = $this->xmlrpcTypes['array'];
+ $this->me['array'] = $vals;
+ return 1;
+ }
+
+ function addStruct($vals)
+ {
+ if ($this->mytype != 0)
+ {
+ echo '<strong>XML_RPC_Values</strong>: already initialized as a [' . $this->kindOf() . ']<br />';
+ return 0;
+ }
+ $this->mytype = $this->xmlrpcTypes['struct'];
+ $this->me['struct'] = $vals;
+ return 1;
+ }
+
+ function kindOf()
+ {
+ switch($this->mytype)
+ {
+ case 3:
+ return 'struct';
+ break;
+ case 2:
+ return 'array';
+ break;
+ case 1:
+ return 'scalar';
+ break;
+ default:
+ return 'undef';
+ }
+ }
+
+ function serializedata($typ, $val)
+ {
+ $rs = '';
+
+ switch($this->xmlrpcTypes[$typ])
+ {
+ case 3:
+ // struct
+ $rs .= "<struct>\n";
+ reset($val);
+ while(list($key2, $val2) = each($val))
+ {
+ $rs .= "<member>\n<name>{$key2}</name>\n";
+ $rs .= $this->serializeval($val2);
+ $rs .= "</member>\n";
+ }
+ $rs .= '</struct>';
+ break;
+ case 2:
+ // array
+ $rs .= "<array>\n<data>\n";
+ for($i=0; $i < sizeof($val); $i++)
+ {
+ $rs .= $this->serializeval($val[$i]);
+ }
+ $rs.="</data>\n</array>\n";
+ break;
+ case 1:
+ // others
+ switch ($typ)
+ {
+ case $this->xmlrpcBase64:
+ $rs .= "<{$typ}>" . base64_encode($val) . "</{$typ}>\n";
+ break;
+ case $this->xmlrpcBoolean:
+ $rs .= "<{$typ}>" . ($val ? '1' : '0') . "</{$typ}>\n";
+ break;
+ case $this->xmlrpcString:
+ $rs .= "<{$typ}>" . htmlspecialchars($val). "</{$typ}>\n";
+ break;
+ default:
+ $rs .= "<{$typ}>{$val}</{$typ}>\n";
+ break;
+ }
+ default:
+ break;
+ }
+ return $rs;
+ }
+
+ function serialize_class()
+ {
+ return $this->serializeval($this);
+ }
+
+ function serializeval($o)
+ {
+ $ar = $o->me;
+ reset($ar);
+
+ list($typ, $val) = each($ar);
+ $rs = "<value>\n".$this->serializedata($typ, $val)."</value>\n";
+ return $rs;
+ }
+
+ function scalarval()
+ {
+ reset($this->me);
+ list($a,$b) = each($this->me);
+ return $b;
+ }
+
+
+ //-------------------------------------
+ // Encode time in ISO-8601 form.
+ //-------------------------------------
+
+ // Useful for sending time in XML-RPC
+
+ function iso8601_encode($time, $utc=0)
+ {
+ if ($utc == 1)
+ {
+ $t = strftime("%Y%m%dT%H:%M:%S", $time);
+ }
+ else
+ {
+ if (function_exists('gmstrftime'))
+ $t = gmstrftime("%Y%m%dT%H:%M:%S", $time);
+ else
+ $t = strftime("%Y%m%dT%H:%M:%S", $time - date('Z'));
+ }
+ return $t;
+ }
+
+}
+// END XML_RPC_Values Class
+
+/* End of file Xmlrpc.php */
/* Location: ./system/libraries/Xmlrpc.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-if ( ! function_exists('xml_parser_create'))\r
-{ \r
- show_error('Your PHP installation does not support XML');\r
-}\r
-\r
-if ( ! class_exists('CI_Xmlrpc'))\r
-{\r
- show_error('You must load the Xmlrpc class before loading the Xmlrpcs class in order to create a server.');\r
-}\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * XML-RPC server class\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category XML-RPC\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html\r
- */\r
-class CI_Xmlrpcs extends CI_Xmlrpc\r
-{\r
- var $methods = array(); //array of methods mapped to function names and signatures\r
- var $debug_msg = ''; // Debug Message\r
- var $system_methods = array(); // XML RPC Server methods\r
- var $controller_obj;\r
-\r
- var $object = FALSE;\r
- \r
- \r
- //-------------------------------------\r
- // Constructor, more or less\r
- //-------------------------------------\r
-\r
- function CI_Xmlrpcs($config=array())\r
- { \r
- parent::CI_Xmlrpc();\r
- $this->set_system_methods();\r
- \r
- if (isset($config['functions']) && is_array($config['functions']))\r
- {\r
- $this->methods = array_merge($this->methods, $config['functions']);\r
- }\r
- \r
- log_message('debug', "XML-RPC Server Class Initialized");\r
- }\r
- \r
- //-------------------------------------\r
- // Initialize Prefs and Serve\r
- //-------------------------------------\r
- \r
- function initialize($config=array())\r
- { \r
- if (isset($config['functions']) && is_array($config['functions']))\r
- {\r
- $this->methods = array_merge($this->methods, $config['functions']);\r
- }\r
- \r
- if (isset($config['debug']))\r
- {\r
- $this->debug = $config['debug'];\r
- }\r
- \r
- if (isset($config['object']) && is_object($config['object']))\r
- {\r
- $this->object = $config['object'];\r
- }\r
- }\r
- \r
- //-------------------------------------\r
- // Setting of System Methods\r
- //-------------------------------------\r
- \r
- function set_system_methods ()\r
- {\r
- $this->methods = array(\r
- 'system.listMethods' => array(\r
- 'function' => 'this.listMethods',\r
- 'signature' => array(array($this->xmlrpcArray, $this->xmlrpcString), array($this->xmlrpcArray)),\r
- 'docstring' => 'Returns an array of available methods on this server'),\r
- 'system.methodHelp' => array(\r
- 'function' => 'this.methodHelp',\r
- 'signature' => array(array($this->xmlrpcString, $this->xmlrpcString)),\r
- 'docstring' => 'Returns a documentation string for the specified method'),\r
- 'system.methodSignature' => array(\r
- 'function' => 'this.methodSignature',\r
- 'signature' => array(array($this->xmlrpcArray, $this->xmlrpcString)),\r
- 'docstring' => 'Returns an array describing the return type and required parameters of a method'),\r
- 'system.multicall' => array(\r
- 'function' => 'this.multicall',\r
- 'signature' => array(array($this->xmlrpcArray, $this->xmlrpcArray)),\r
- 'docstring' => 'Combine multiple RPC calls in one request. See http://www.xmlrpc.com/discuss/msgReader$1208 for details')\r
- );\r
- }\r
-\r
-\r
- //-------------------------------------\r
- // Main Server Function\r
- //-------------------------------------\r
- \r
- function serve()\r
- {\r
- $r = $this->parseRequest();\r
- $payload = '<?xml version="1.0" encoding="'.$this->xmlrpc_defencoding.'"?'.'>'."\n";\r
- $payload .= $this->debug_msg;\r
- $payload .= $r->prepare_response();\r
- \r
- header("Content-Type: text/xml");\r
- header("Content-Length: ".strlen($payload));\r
- echo $payload;\r
- }\r
-\r
- //-------------------------------------\r
- // Add Method to Class\r
- //-------------------------------------\r
- \r
- function add_to_map($methodname,$function,$sig,$doc)\r
- {\r
- $this->methods[$methodname] = array(\r
- 'function' => $function,\r
- 'signature' => $sig,\r
- 'docstring' => $doc\r
- );\r
- }\r
-\r
-\r
- //-------------------------------------\r
- // Parse Server Request\r
- //-------------------------------------\r
- \r
- function parseRequest($data='')\r
- {\r
- global $HTTP_RAW_POST_DATA;\r
- \r
- //-------------------------------------\r
- // Get Data\r
- //-------------------------------------\r
-\r
- if ($data == '')\r
- {\r
- $data = $HTTP_RAW_POST_DATA;\r
- }\r
-\r
- //-------------------------------------\r
- // Set up XML Parser\r
- //-------------------------------------\r
- \r
- $parser = xml_parser_create($this->xmlrpc_defencoding);\r
- $parser_object = new XML_RPC_Message("filler");\r
- \r
- $parser_object->xh[$parser] = array();\r
- $parser_object->xh[$parser]['isf'] = 0;\r
- $parser_object->xh[$parser]['isf_reason'] = '';\r
- $parser_object->xh[$parser]['params'] = array();\r
- $parser_object->xh[$parser]['stack'] = array();\r
- $parser_object->xh[$parser]['valuestack'] = array();\r
- $parser_object->xh[$parser]['method'] = '';\r
-\r
- xml_set_object($parser, $parser_object);\r
- xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);\r
- xml_set_element_handler($parser, 'open_tag', 'closing_tag');\r
- xml_set_character_data_handler($parser, 'character_data');\r
- //xml_set_default_handler($parser, 'default_handler');\r
- \r
- \r
- //-------------------------------------\r
- // PARSE + PROCESS XML DATA\r
- //------------------------------------- \r
- \r
- if ( ! xml_parse($parser, $data, 1))\r
- {\r
- // return XML error as a faultCode\r
- $r = new XML_RPC_Response(0,\r
- $this->xmlrpcerrxml + xml_get_error_code($parser),\r
- sprintf('XML error: %s at line %d',\r
- xml_error_string(xml_get_error_code($parser)),\r
- xml_get_current_line_number($parser)));\r
- xml_parser_free($parser);\r
- }\r
- elseif($parser_object->xh[$parser]['isf'])\r
- {\r
- return new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return']);\r
- }\r
- else\r
- {\r
- xml_parser_free($parser);\r
- \r
- $m = new XML_RPC_Message($parser_object->xh[$parser]['method']);\r
- $plist='';\r
- \r
- for($i=0; $i < sizeof($parser_object->xh[$parser]['params']); $i++)\r
- {\r
- if ($this->debug === TRUE)\r
- {\r
- $plist .= "$i - " . print_r(get_object_vars($parser_object->xh[$parser]['params'][$i]), TRUE). ";\n";\r
- }\r
- \r
- $m->addParam($parser_object->xh[$parser]['params'][$i]);\r
- }\r
- \r
- if ($this->debug === TRUE)\r
- {\r
- echo "<pre>";\r
- echo "---PLIST---\n" . $plist . "\n---PLIST END---\n\n";\r
- echo "</pre>";\r
- }\r
- \r
- $r = $this->_execute($m);\r
- }\r
- \r
- //-------------------------------------\r
- // SET DEBUGGING MESSAGE\r
- //------------------------------------- \r
- \r
- if ($this->debug === TRUE)\r
- {\r
- $this->debug_msg = "<!-- DEBUG INFO:\n\n".$plist."\n END DEBUG-->\n";\r
- }\r
- \r
- return $r;\r
- }\r
-\r
- //-------------------------------------\r
- // Executes the Method\r
- //-------------------------------------\r
- \r
- function _execute($m)\r
- {\r
- $methName = $m->method_name;\r
- \r
- // Check to see if it is a system call\r
- $system_call = (strncmp($methName, 'system', 5) == 0) ? TRUE : FALSE;\r
- \r
- //-------------------------------------\r
- // Valid Method\r
- //-------------------------------------\r
- \r
- if ( ! isset($this->methods[$methName]['function']))\r
- {\r
- return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);\r
- }\r
- \r
- //-------------------------------------\r
- // Check for Method (and Object)\r
- //-------------------------------------\r
- \r
- $method_parts = explode(".", $this->methods[$methName]['function']);\r
- $objectCall = (isset($method_parts['1']) && $method_parts['1'] != "") ? TRUE : FALSE;\r
- \r
- if ($system_call === TRUE)\r
- {\r
- if ( ! is_callable(array($this,$method_parts['1'])))\r
- {\r
- return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);\r
- }\r
- }\r
- else\r
- {\r
- if ($objectCall && ! is_callable(array($method_parts['0'],$method_parts['1'])))\r
- {\r
- return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);\r
- }\r
- elseif ( ! $objectCall && ! is_callable($this->methods[$methName]['function']))\r
- {\r
- return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);\r
- }\r
- }\r
- \r
- //-------------------------------------\r
- // Checking Methods Signature\r
- //-------------------------------------\r
- \r
- if (isset($this->methods[$methName]['signature']))\r
- {\r
- $sig = $this->methods[$methName]['signature'];\r
- for($i=0; $i<sizeof($sig); $i++)\r
- {\r
- $current_sig = $sig[$i];\r
- \r
- if (sizeof($current_sig) == sizeof($m->params)+1)\r
- {\r
- for($n=0; $n < sizeof($m->params); $n++)\r
- {\r
- $p = $m->params[$n];\r
- $pt = ($p->kindOf() == 'scalar') ? $p->scalarval() : $p->kindOf();\r
- \r
- if ($pt != $current_sig[$n+1])\r
- {\r
- $pno = $n+1;\r
- $wanted = $current_sig[$n+1];\r
- \r
- return new XML_RPC_Response(0,\r
- $this->xmlrpcerr['incorrect_params'],\r
- $this->xmlrpcstr['incorrect_params'] .\r
- ": Wanted {$wanted}, got {$pt} at param {$pno})");\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- //-------------------------------------\r
- // Calls the Function\r
- //-------------------------------------\r
-\r
- if ($objectCall === TRUE)\r
- {\r
- if ($method_parts[0] == "this" && $system_call == TRUE)\r
- {\r
- return call_user_func(array($this, $method_parts[1]), $m);\r
- }\r
- else\r
- {\r
- if ($this->object === FALSE)\r
- {\r
- $CI =& get_instance();\r
- return $CI->$method_parts['1']($m);\r
- }\r
- else\r
- {\r
- return $this->object->$method_parts['1']($m);\r
- //return call_user_func(array(&$method_parts['0'],$method_parts['1']), $m);\r
- }\r
- }\r
- }\r
- else\r
- {\r
- return call_user_func($this->methods[$methName]['function'], $m);\r
- }\r
- }\r
- \r
- \r
- //-------------------------------------\r
- // Server Function: List Methods\r
- //-------------------------------------\r
- \r
- function listMethods($m)\r
- {\r
- $v = new XML_RPC_Values();\r
- $output = array();\r
- \r
- foreach($this->methods as $key => $value)\r
- {\r
- $output[] = new XML_RPC_Values($key, 'string');\r
- }\r
- \r
- foreach($this->system_methods as $key => $value)\r
- {\r
- $output[]= new XML_RPC_Values($key, 'string');\r
- }\r
-\r
- $v->addArray($output);\r
- return new XML_RPC_Response($v);\r
- }\r
- \r
- //-------------------------------------\r
- // Server Function: Return Signature for Method\r
- //-------------------------------------\r
- \r
- function methodSignature($m)\r
- {\r
- $parameters = $m->output_parameters();\r
- $method_name = $parameters[0];\r
- \r
- if (isset($this->methods[$method_name]))\r
- {\r
- if ($this->methods[$method_name]['signature'])\r
- {\r
- $sigs = array();\r
- $signature = $this->methods[$method_name]['signature'];\r
- \r
- for($i=0; $i < sizeof($signature); $i++)\r
- {\r
- $cursig = array();\r
- $inSig = $signature[$i];\r
- for($j=0; $j<sizeof($inSig); $j++)\r
- {\r
- $cursig[]= new XML_RPC_Values($inSig[$j], 'string');\r
- }\r
- $sigs[]= new XML_RPC_Values($cursig, 'array');\r
- }\r
- $r = new XML_RPC_Response(new XML_RPC_Values($sigs, 'array'));\r
- }\r
- else\r
- {\r
- $r = new XML_RPC_Response(new XML_RPC_Values('undef', 'string'));\r
- }\r
- }\r
- else\r
- {\r
- $r = new XML_RPC_Response(0,$this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']);\r
- }\r
- return $r;\r
- }\r
- \r
- //-------------------------------------\r
- // Server Function: Doc String for Method\r
- //-------------------------------------\r
- \r
- function methodHelp($m)\r
- {\r
- $parameters = $m->output_parameters();\r
- $method_name = $parameters[0];\r
- \r
- if (isset($this->methods[$method_name]))\r
- {\r
- $docstring = isset($this->methods[$method_name]['docstring']) ? $this->methods[$method_name]['docstring'] : '';\r
- \r
- return new XML_RPC_Response(new XML_RPC_Values($docstring, 'string'));\r
- }\r
- else\r
- {\r
- return new XML_RPC_Response(0, $this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']);\r
- }\r
- }\r
-\r
- //-------------------------------------\r
- // Server Function: Multi-call\r
- //-------------------------------------\r
-\r
- function multicall($m)\r
- {\r
- // Disabled\r
- return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);\r
- \r
- $parameters = $m->output_parameters();\r
- $calls = $parameters[0];\r
-\r
- $result = array();\r
-\r
- foreach ($calls as $value)\r
- {\r
- //$attempt = $this->_execute(new XML_RPC_Message($value[0], $value[1]));\r
- \r
- $m = new XML_RPC_Message($value[0]);\r
- $plist='';\r
- \r
- for($i=0; $i < sizeof($value[1]); $i++)\r
- {\r
- $m->addParam(new XML_RPC_Values($value[1][$i], 'string'));\r
- }\r
- \r
- $attempt = $this->_execute($m);\r
-\r
- if ($attempt->faultCode() != 0)\r
- {\r
- return $attempt;\r
- }\r
-\r
- $result[] = new XML_RPC_Values(array($attempt->value()), 'array');\r
- }\r
-\r
- return new XML_RPC_Response(new XML_RPC_Values($result, 'array'));\r
- }\r
- \r
- \r
- //-------------------------------------\r
- // Multi-call Function: Error Handling\r
- //-------------------------------------\r
-\r
- function multicall_error($err)\r
- {\r
- $str = is_string($err) ? $this->xmlrpcstr["multicall_${err}"] : $err->faultString();\r
- $code = is_string($err) ? $this->xmlrpcerr["multicall_${err}"] : $err->faultCode();\r
- \r
- $struct['faultCode'] = new XML_RPC_Values($code, 'int');\r
- $struct['faultString'] = new XML_RPC_Values($str, 'string');\r
- \r
- return new XML_RPC_Values($struct, 'struct');\r
- }\r
- \r
- \r
- //-------------------------------------\r
- // Multi-call Function: Processes method\r
- //-------------------------------------\r
- \r
- function do_multicall($call)\r
- {\r
- if ($call->kindOf() != 'struct')\r
- return $this->multicall_error('notstruct');\r
- elseif ( ! $methName = $call->me['struct']['methodName'])\r
- return $this->multicall_error('nomethod');\r
- \r
- list($scalar_type,$scalar_value)=each($methName->me);\r
- $scalar_type = $scalar_type == $this->xmlrpcI4 ? $this->xmlrpcInt : $scalar_type;\r
- \r
- if ($methName->kindOf() != 'scalar' OR $scalar_type != 'string')\r
- return $this->multicall_error('notstring');\r
- elseif ($scalar_value == 'system.multicall')\r
- return $this->multicall_error('recursion');\r
- elseif ( ! $params = $call->me['struct']['params'])\r
- return $this->multicall_error('noparams');\r
- elseif ($params->kindOf() != 'array')\r
- return $this->multicall_error('notarray');\r
- \r
- list($a,$b)=each($params->me);\r
- $numParams = sizeof($b);\r
-\r
- $msg = new XML_RPC_Message($scalar_value);\r
- for ($i = 0; $i < $numParams; $i++)\r
- {\r
- $msg->params[] = $params->me['array'][$i];\r
- }\r
-\r
- $result = $this->_execute($msg);\r
-\r
- if ($result->faultCode() != 0)\r
- {\r
- return $this->multicall_error($result);\r
- }\r
-\r
- return new XML_RPC_Values(array($result->value()), 'array');\r
- } \r
- \r
-}\r
-// END XML_RPC_Server class\r
-\r
-\r
-/* End of file Xmlrpcs.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+if ( ! function_exists('xml_parser_create'))
+{
+ show_error('Your PHP installation does not support XML');
+}
+
+if ( ! class_exists('CI_Xmlrpc'))
+{
+ show_error('You must load the Xmlrpc class before loading the Xmlrpcs class in order to create a server.');
+}
+
+// ------------------------------------------------------------------------
+
+/**
+ * XML-RPC server class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category XML-RPC
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html
+ */
+class CI_Xmlrpcs extends CI_Xmlrpc
+{
+ var $methods = array(); //array of methods mapped to function names and signatures
+ var $debug_msg = ''; // Debug Message
+ var $system_methods = array(); // XML RPC Server methods
+ var $controller_obj;
+
+ var $object = FALSE;
+
+
+ //-------------------------------------
+ // Constructor, more or less
+ //-------------------------------------
+
+ function CI_Xmlrpcs($config=array())
+ {
+ parent::CI_Xmlrpc();
+ $this->set_system_methods();
+
+ if (isset($config['functions']) && is_array($config['functions']))
+ {
+ $this->methods = array_merge($this->methods, $config['functions']);
+ }
+
+ log_message('debug', "XML-RPC Server Class Initialized");
+ }
+
+ //-------------------------------------
+ // Initialize Prefs and Serve
+ //-------------------------------------
+
+ function initialize($config=array())
+ {
+ if (isset($config['functions']) && is_array($config['functions']))
+ {
+ $this->methods = array_merge($this->methods, $config['functions']);
+ }
+
+ if (isset($config['debug']))
+ {
+ $this->debug = $config['debug'];
+ }
+
+ if (isset($config['object']) && is_object($config['object']))
+ {
+ $this->object = $config['object'];
+ }
+ }
+
+ //-------------------------------------
+ // Setting of System Methods
+ //-------------------------------------
+
+ function set_system_methods ()
+ {
+ $this->methods = array(
+ 'system.listMethods' => array(
+ 'function' => 'this.listMethods',
+ 'signature' => array(array($this->xmlrpcArray, $this->xmlrpcString), array($this->xmlrpcArray)),
+ 'docstring' => 'Returns an array of available methods on this server'),
+ 'system.methodHelp' => array(
+ 'function' => 'this.methodHelp',
+ 'signature' => array(array($this->xmlrpcString, $this->xmlrpcString)),
+ 'docstring' => 'Returns a documentation string for the specified method'),
+ 'system.methodSignature' => array(
+ 'function' => 'this.methodSignature',
+ 'signature' => array(array($this->xmlrpcArray, $this->xmlrpcString)),
+ 'docstring' => 'Returns an array describing the return type and required parameters of a method'),
+ 'system.multicall' => array(
+ 'function' => 'this.multicall',
+ 'signature' => array(array($this->xmlrpcArray, $this->xmlrpcArray)),
+ 'docstring' => 'Combine multiple RPC calls in one request. See http://www.xmlrpc.com/discuss/msgReader$1208 for details')
+ );
+ }
+
+
+ //-------------------------------------
+ // Main Server Function
+ //-------------------------------------
+
+ function serve()
+ {
+ $r = $this->parseRequest();
+ $payload = '<?xml version="1.0" encoding="'.$this->xmlrpc_defencoding.'"?'.'>'."\n";
+ $payload .= $this->debug_msg;
+ $payload .= $r->prepare_response();
+
+ header("Content-Type: text/xml");
+ header("Content-Length: ".strlen($payload));
+ echo $payload;
+ }
+
+ //-------------------------------------
+ // Add Method to Class
+ //-------------------------------------
+
+ function add_to_map($methodname,$function,$sig,$doc)
+ {
+ $this->methods[$methodname] = array(
+ 'function' => $function,
+ 'signature' => $sig,
+ 'docstring' => $doc
+ );
+ }
+
+
+ //-------------------------------------
+ // Parse Server Request
+ //-------------------------------------
+
+ function parseRequest($data='')
+ {
+ global $HTTP_RAW_POST_DATA;
+
+ //-------------------------------------
+ // Get Data
+ //-------------------------------------
+
+ if ($data == '')
+ {
+ $data = $HTTP_RAW_POST_DATA;
+ }
+
+ //-------------------------------------
+ // Set up XML Parser
+ //-------------------------------------
+
+ $parser = xml_parser_create($this->xmlrpc_defencoding);
+ $parser_object = new XML_RPC_Message("filler");
+
+ $parser_object->xh[$parser] = array();
+ $parser_object->xh[$parser]['isf'] = 0;
+ $parser_object->xh[$parser]['isf_reason'] = '';
+ $parser_object->xh[$parser]['params'] = array();
+ $parser_object->xh[$parser]['stack'] = array();
+ $parser_object->xh[$parser]['valuestack'] = array();
+ $parser_object->xh[$parser]['method'] = '';
+
+ xml_set_object($parser, $parser_object);
+ xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
+ xml_set_element_handler($parser, 'open_tag', 'closing_tag');
+ xml_set_character_data_handler($parser, 'character_data');
+ //xml_set_default_handler($parser, 'default_handler');
+
+
+ //-------------------------------------
+ // PARSE + PROCESS XML DATA
+ //-------------------------------------
+
+ if ( ! xml_parse($parser, $data, 1))
+ {
+ // return XML error as a faultCode
+ $r = new XML_RPC_Response(0,
+ $this->xmlrpcerrxml + xml_get_error_code($parser),
+ sprintf('XML error: %s at line %d',
+ xml_error_string(xml_get_error_code($parser)),
+ xml_get_current_line_number($parser)));
+ xml_parser_free($parser);
+ }
+ elseif($parser_object->xh[$parser]['isf'])
+ {
+ return new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return']);
+ }
+ else
+ {
+ xml_parser_free($parser);
+
+ $m = new XML_RPC_Message($parser_object->xh[$parser]['method']);
+ $plist='';
+
+ for($i=0; $i < sizeof($parser_object->xh[$parser]['params']); $i++)
+ {
+ if ($this->debug === TRUE)
+ {
+ $plist .= "$i - " . print_r(get_object_vars($parser_object->xh[$parser]['params'][$i]), TRUE). ";\n";
+ }
+
+ $m->addParam($parser_object->xh[$parser]['params'][$i]);
+ }
+
+ if ($this->debug === TRUE)
+ {
+ echo "<pre>";
+ echo "---PLIST---\n" . $plist . "\n---PLIST END---\n\n";
+ echo "</pre>";
+ }
+
+ $r = $this->_execute($m);
+ }
+
+ //-------------------------------------
+ // SET DEBUGGING MESSAGE
+ //-------------------------------------
+
+ if ($this->debug === TRUE)
+ {
+ $this->debug_msg = "<!-- DEBUG INFO:\n\n".$plist."\n END DEBUG-->\n";
+ }
+
+ return $r;
+ }
+
+ //-------------------------------------
+ // Executes the Method
+ //-------------------------------------
+
+ function _execute($m)
+ {
+ $methName = $m->method_name;
+
+ // Check to see if it is a system call
+ $system_call = (strncmp($methName, 'system', 5) == 0) ? TRUE : FALSE;
+
+ //-------------------------------------
+ // Valid Method
+ //-------------------------------------
+
+ if ( ! isset($this->methods[$methName]['function']))
+ {
+ return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);
+ }
+
+ //-------------------------------------
+ // Check for Method (and Object)
+ //-------------------------------------
+
+ $method_parts = explode(".", $this->methods[$methName]['function']);
+ $objectCall = (isset($method_parts['1']) && $method_parts['1'] != "") ? TRUE : FALSE;
+
+ if ($system_call === TRUE)
+ {
+ if ( ! is_callable(array($this,$method_parts['1'])))
+ {
+ return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);
+ }
+ }
+ else
+ {
+ if ($objectCall && ! is_callable(array($method_parts['0'],$method_parts['1'])))
+ {
+ return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);
+ }
+ elseif ( ! $objectCall && ! is_callable($this->methods[$methName]['function']))
+ {
+ return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);
+ }
+ }
+
+ //-------------------------------------
+ // Checking Methods Signature
+ //-------------------------------------
+
+ if (isset($this->methods[$methName]['signature']))
+ {
+ $sig = $this->methods[$methName]['signature'];
+ for($i=0; $i<sizeof($sig); $i++)
+ {
+ $current_sig = $sig[$i];
+
+ if (sizeof($current_sig) == sizeof($m->params)+1)
+ {
+ for($n=0; $n < sizeof($m->params); $n++)
+ {
+ $p = $m->params[$n];
+ $pt = ($p->kindOf() == 'scalar') ? $p->scalarval() : $p->kindOf();
+
+ if ($pt != $current_sig[$n+1])
+ {
+ $pno = $n+1;
+ $wanted = $current_sig[$n+1];
+
+ return new XML_RPC_Response(0,
+ $this->xmlrpcerr['incorrect_params'],
+ $this->xmlrpcstr['incorrect_params'] .
+ ": Wanted {$wanted}, got {$pt} at param {$pno})");
+ }
+ }
+ }
+ }
+ }
+
+ //-------------------------------------
+ // Calls the Function
+ //-------------------------------------
+
+ if ($objectCall === TRUE)
+ {
+ if ($method_parts[0] == "this" && $system_call == TRUE)
+ {
+ return call_user_func(array($this, $method_parts[1]), $m);
+ }
+ else
+ {
+ if ($this->object === FALSE)
+ {
+ $CI =& get_instance();
+ return $CI->$method_parts['1']($m);
+ }
+ else
+ {
+ return $this->object->$method_parts['1']($m);
+ //return call_user_func(array(&$method_parts['0'],$method_parts['1']), $m);
+ }
+ }
+ }
+ else
+ {
+ return call_user_func($this->methods[$methName]['function'], $m);
+ }
+ }
+
+
+ //-------------------------------------
+ // Server Function: List Methods
+ //-------------------------------------
+
+ function listMethods($m)
+ {
+ $v = new XML_RPC_Values();
+ $output = array();
+
+ foreach($this->methods as $key => $value)
+ {
+ $output[] = new XML_RPC_Values($key, 'string');
+ }
+
+ foreach($this->system_methods as $key => $value)
+ {
+ $output[]= new XML_RPC_Values($key, 'string');
+ }
+
+ $v->addArray($output);
+ return new XML_RPC_Response($v);
+ }
+
+ //-------------------------------------
+ // Server Function: Return Signature for Method
+ //-------------------------------------
+
+ function methodSignature($m)
+ {
+ $parameters = $m->output_parameters();
+ $method_name = $parameters[0];
+
+ if (isset($this->methods[$method_name]))
+ {
+ if ($this->methods[$method_name]['signature'])
+ {
+ $sigs = array();
+ $signature = $this->methods[$method_name]['signature'];
+
+ for($i=0; $i < sizeof($signature); $i++)
+ {
+ $cursig = array();
+ $inSig = $signature[$i];
+ for($j=0; $j<sizeof($inSig); $j++)
+ {
+ $cursig[]= new XML_RPC_Values($inSig[$j], 'string');
+ }
+ $sigs[]= new XML_RPC_Values($cursig, 'array');
+ }
+ $r = new XML_RPC_Response(new XML_RPC_Values($sigs, 'array'));
+ }
+ else
+ {
+ $r = new XML_RPC_Response(new XML_RPC_Values('undef', 'string'));
+ }
+ }
+ else
+ {
+ $r = new XML_RPC_Response(0,$this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']);
+ }
+ return $r;
+ }
+
+ //-------------------------------------
+ // Server Function: Doc String for Method
+ //-------------------------------------
+
+ function methodHelp($m)
+ {
+ $parameters = $m->output_parameters();
+ $method_name = $parameters[0];
+
+ if (isset($this->methods[$method_name]))
+ {
+ $docstring = isset($this->methods[$method_name]['docstring']) ? $this->methods[$method_name]['docstring'] : '';
+
+ return new XML_RPC_Response(new XML_RPC_Values($docstring, 'string'));
+ }
+ else
+ {
+ return new XML_RPC_Response(0, $this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']);
+ }
+ }
+
+ //-------------------------------------
+ // Server Function: Multi-call
+ //-------------------------------------
+
+ function multicall($m)
+ {
+ // Disabled
+ return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']);
+
+ $parameters = $m->output_parameters();
+ $calls = $parameters[0];
+
+ $result = array();
+
+ foreach ($calls as $value)
+ {
+ //$attempt = $this->_execute(new XML_RPC_Message($value[0], $value[1]));
+
+ $m = new XML_RPC_Message($value[0]);
+ $plist='';
+
+ for($i=0; $i < sizeof($value[1]); $i++)
+ {
+ $m->addParam(new XML_RPC_Values($value[1][$i], 'string'));
+ }
+
+ $attempt = $this->_execute($m);
+
+ if ($attempt->faultCode() != 0)
+ {
+ return $attempt;
+ }
+
+ $result[] = new XML_RPC_Values(array($attempt->value()), 'array');
+ }
+
+ return new XML_RPC_Response(new XML_RPC_Values($result, 'array'));
+ }
+
+
+ //-------------------------------------
+ // Multi-call Function: Error Handling
+ //-------------------------------------
+
+ function multicall_error($err)
+ {
+ $str = is_string($err) ? $this->xmlrpcstr["multicall_${err}"] : $err->faultString();
+ $code = is_string($err) ? $this->xmlrpcerr["multicall_${err}"] : $err->faultCode();
+
+ $struct['faultCode'] = new XML_RPC_Values($code, 'int');
+ $struct['faultString'] = new XML_RPC_Values($str, 'string');
+
+ return new XML_RPC_Values($struct, 'struct');
+ }
+
+
+ //-------------------------------------
+ // Multi-call Function: Processes method
+ //-------------------------------------
+
+ function do_multicall($call)
+ {
+ if ($call->kindOf() != 'struct')
+ return $this->multicall_error('notstruct');
+ elseif ( ! $methName = $call->me['struct']['methodName'])
+ return $this->multicall_error('nomethod');
+
+ list($scalar_type,$scalar_value)=each($methName->me);
+ $scalar_type = $scalar_type == $this->xmlrpcI4 ? $this->xmlrpcInt : $scalar_type;
+
+ if ($methName->kindOf() != 'scalar' OR $scalar_type != 'string')
+ return $this->multicall_error('notstring');
+ elseif ($scalar_value == 'system.multicall')
+ return $this->multicall_error('recursion');
+ elseif ( ! $params = $call->me['struct']['params'])
+ return $this->multicall_error('noparams');
+ elseif ($params->kindOf() != 'array')
+ return $this->multicall_error('notarray');
+
+ list($a,$b)=each($params->me);
+ $numParams = sizeof($b);
+
+ $msg = new XML_RPC_Message($scalar_value);
+ for ($i = 0; $i < $numParams; $i++)
+ {
+ $msg->params[] = $params->me['array'][$i];
+ }
+
+ $result = $this->_execute($msg);
+
+ if ($result->faultCode() != 0)
+ {
+ return $this->multicall_error($result);
+ }
+
+ return new XML_RPC_Values(array($result->value()), 'array');
+ }
+
+}
+// END XML_RPC_Server class
+
+
+/* End of file Xmlrpcs.php */
/* Location: ./system/libraries/Xmlrpcs.php */
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Zip Compression Class\r
- *\r
- * This class is based on a library I found at Zend:\r
- * http://www.zend.com/codex.php?id=696&single=1\r
- *\r
- * The original library is a little rough around the edges so I\r
- * refactored it and added several additional methods -- Rick Ellis\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Libraries\r
- * @category Encryption\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/libraries/zip.html\r
- */\r
-class CI_Zip {\r
-\r
- var $zipdata = '';\r
- var $directory = '';\r
- var $entries = 0;\r
- var $file_num = 0;\r
- var $offset = 0;\r
-\r
- function CI_Zip()\r
- {\r
- log_message('debug', "Zip Compression Class Initialized");\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Add Directory\r
- *\r
- * Lets you add a virtual directory into which you can place files.\r
- *\r
- * @access public\r
- * @param mixed the directory name. Can be string or array\r
- * @return void\r
- */\r
- function add_dir($directory)\r
- {\r
- foreach ((array)$directory as $dir)\r
- {\r
- if ( ! preg_match("|.+/$|", $dir))\r
- {\r
- $dir .= '/';\r
- }\r
-\r
- $this->_add_dir($dir);\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Add Directory\r
- *\r
- * @access private\r
- * @param string the directory name\r
- * @return void\r
- */\r
- function _add_dir($dir)\r
- {\r
- $dir = str_replace("\\", "/", $dir);\r
-\r
- $this->zipdata .=\r
- "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"\r
- .pack('V', 0) // crc32\r
- .pack('V', 0) // compressed filesize\r
- .pack('V', 0) // uncompressed filesize\r
- .pack('v', strlen($dir)) // length of pathname\r
- .pack('v', 0) // extra field length\r
- .$dir\r
- // below is "data descriptor" segment\r
- .pack('V', 0) // crc32\r
- .pack('V', 0) // compressed filesize\r
- .pack('V', 0); // uncompressed filesize\r
-\r
- $this->directory .=\r
- "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"\r
- .pack('V',0) // crc32\r
- .pack('V',0) // compressed filesize\r
- .pack('V',0) // uncompressed filesize\r
- .pack('v', strlen($dir)) // length of pathname\r
- .pack('v', 0) // extra field length\r
- .pack('v', 0) // file comment length\r
- .pack('v', 0) // disk number start\r
- .pack('v', 0) // internal file attributes\r
- .pack('V', 16) // external file attributes - 'directory' bit set\r
- .pack('V', $this->offset) // relative offset of local header\r
- .$dir;\r
-\r
- $this->offset = strlen($this->zipdata);\r
- $this->entries++;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Add Data to Zip\r
- *\r
- * Lets you add files to the archive. If the path is included\r
- * in the filename it will be placed within a directory. Make\r
- * sure you use add_dir() first to create the folder.\r
- *\r
- * @access public\r
- * @param mixed\r
- * @param string\r
- * @return void\r
- */ \r
- function add_data($filepath, $data = NULL)\r
- {\r
- if (is_array($filepath))\r
- {\r
- foreach ($filepath as $path => $data)\r
- {\r
- $this->_add_data($path, $data);\r
- }\r
- }\r
- else\r
- {\r
- $this->_add_data($filepath, $data);\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Add Data to Zip\r
- *\r
- * @access private\r
- * @param string the file name/path\r
- * @param string the data to be encoded\r
- * @return void\r
- */ \r
- function _add_data($filepath, $data)\r
- {\r
- $filepath = str_replace("\\", "/", $filepath);\r
-\r
- $uncompressed_size = strlen($data);\r
- $crc32 = crc32($data);\r
-\r
- $gzdata = gzcompress($data);\r
- $gzdata = substr($gzdata, 2, -4);\r
- $compressed_size = strlen($gzdata);\r
-\r
- $this->zipdata .=\r
- "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00\x00\x00\x00\x00"\r
- .pack('V', $crc32)\r
- .pack('V', $compressed_size)\r
- .pack('V', $uncompressed_size)\r
- .pack('v', strlen($filepath)) // length of filename\r
- .pack('v', 0) // extra field length\r
- .$filepath\r
- .$gzdata; // "file data" segment\r
-\r
- $this->directory .=\r
- "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00\x00\x00\x00\x00"\r
- .pack('V', $crc32)\r
- .pack('V', $compressed_size)\r
- .pack('V', $uncompressed_size)\r
- .pack('v', strlen($filepath)) // length of filename\r
- .pack('v', 0) // extra field length\r
- .pack('v', 0) // file comment length\r
- .pack('v', 0) // disk number start\r
- .pack('v', 0) // internal file attributes\r
- .pack('V', 32) // external file attributes - 'archive' bit set\r
- .pack('V', $this->offset) // relative offset of local header\r
- .$filepath;\r
-\r
- $this->offset = strlen($this->zipdata);\r
- $this->entries++;\r
- $this->file_num++;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Read the contents of a file and add it to the zip\r
- *\r
- * @access public\r
- * @return bool\r
- */ \r
- function read_file($path, $preserve_filepath = FALSE)\r
- {\r
- if ( ! file_exists($path))\r
- {\r
- return FALSE;\r
- }\r
-\r
- if (FALSE !== ($data = file_get_contents($path)))\r
- {\r
- $name = str_replace("\\", "/", $path);\r
- \r
- if ($preserve_filepath === FALSE)\r
- {\r
- $name = preg_replace("|.*/(.+)|", "\\1", $name);\r
- }\r
-\r
- $this->add_data($name, $data);\r
- return TRUE;\r
- }\r
- return FALSE;\r
- }\r
-\r
- // ------------------------------------------------------------------------\r
- \r
- /**\r
- * Read a directory and add it to the zip.\r
- *\r
- * This function recursively reads a folder and everything it contains (including\r
- * sub-folders) and creates a zip based on it. Whatever directory structure\r
- * is in the original file path will be recreated in the zip file.\r
- *\r
- * @access public\r
- * @param string path to source\r
- * @return bool\r
- */ \r
- function read_dir($path)\r
- { \r
- if ($fp = @opendir($path))\r
- {\r
- while (FALSE !== ($file = readdir($fp)))\r
- {\r
- if (@is_dir($path.$file) && substr($file, 0, 1) != '.')\r
- { \r
- $this->read_dir($path.$file."/");\r
- }\r
- elseif (substr($file, 0, 1) != ".")\r
- {\r
- if (FALSE !== ($data = file_get_contents($path.$file)))\r
- { \r
- $this->add_data(str_replace("\\", "/", $path).$file, $data);\r
- }\r
- }\r
- }\r
- return TRUE;\r
- }\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Get the Zip file\r
- *\r
- * @access public\r
- * @return binary string\r
- */ \r
- function get_zip()\r
- {\r
- // Is there any data to return?\r
- if ($this->entries == 0)\r
- {\r
- return FALSE;\r
- }\r
-\r
- $zip_data = $this->zipdata;\r
- $zip_data .= $this->directory."\x50\x4b\x05\x06\x00\x00\x00\x00";\r
- $zip_data .= pack('v', $this->entries); // total # of entries "on this disk"\r
- $zip_data .= pack('v', $this->entries); // total # of entries overall\r
- $zip_data .= pack('V', strlen($this->directory)); // size of central dir\r
- $zip_data .= pack('V', strlen($this->zipdata)); // offset to start of central dir\r
- $zip_data .= "\x00\x00"; // .zip file comment length\r
-\r
- return $zip_data;\r
- }\r
- \r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Write File to the specified directory\r
- *\r
- * Lets you write a file\r
- *\r
- * @access public\r
- * @param string the file name\r
- * @return bool\r
- */ \r
- function archive($filepath)\r
- {\r
- if ( ! ($fp = @fopen($filepath, FOPEN_WRITE_CREATE_DESTRUCTIVE)))\r
- {\r
- return FALSE;\r
- }\r
-\r
- flock($fp, LOCK_EX); \r
- fwrite($fp, $this->get_zip());\r
- flock($fp, LOCK_UN);\r
- fclose($fp);\r
-\r
- return TRUE; \r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Download\r
- *\r
- * @access public\r
- * @param string the file name\r
- * @param string the data to be encoded\r
- * @return bool\r
- */\r
- function download($filename = 'backup.zip')\r
- {\r
- if ( ! preg_match("|.+?\.zip$|", $filename))\r
- {\r
- $filename .= '.zip';\r
- }\r
-\r
- $zip_content =& $this->get_zip();\r
-\r
- $CI =& get_instance();\r
- $CI->load->helper('download');\r
-\r
- force_download($filename, $zip_content);\r
- }\r
-\r
- // --------------------------------------------------------------------\r
-\r
- /**\r
- * Initialize Data\r
- *\r
- * Lets you clear current zip data. Useful if you need to create\r
- * multiple zips with different data.\r
- *\r
- * @access public\r
- * @return void\r
- */ \r
- function clear_data()\r
- {\r
- $this->zipdata = '';\r
- $this->directory = '';\r
- $this->entries = 0;\r
- $this->file_num = 0;\r
- $this->offset = 0;\r
- }\r
- \r
-}\r
-\r
-/* End of file Zip.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Zip Compression Class
+ *
+ * This class is based on a library I found at Zend:
+ * http://www.zend.com/codex.php?id=696&single=1
+ *
+ * The original library is a little rough around the edges so I
+ * refactored it and added several additional methods -- Rick Ellis
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Encryption
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/libraries/zip.html
+ */
+class CI_Zip {
+
+ var $zipdata = '';
+ var $directory = '';
+ var $entries = 0;
+ var $file_num = 0;
+ var $offset = 0;
+
+ function CI_Zip()
+ {
+ log_message('debug', "Zip Compression Class Initialized");
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add Directory
+ *
+ * Lets you add a virtual directory into which you can place files.
+ *
+ * @access public
+ * @param mixed the directory name. Can be string or array
+ * @return void
+ */
+ function add_dir($directory)
+ {
+ foreach ((array)$directory as $dir)
+ {
+ if ( ! preg_match("|.+/$|", $dir))
+ {
+ $dir .= '/';
+ }
+
+ $this->_add_dir($dir);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add Directory
+ *
+ * @access private
+ * @param string the directory name
+ * @return void
+ */
+ function _add_dir($dir)
+ {
+ $dir = str_replace("\\", "/", $dir);
+
+ $this->zipdata .=
+ "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ .pack('V', 0) // crc32
+ .pack('V', 0) // compressed filesize
+ .pack('V', 0) // uncompressed filesize
+ .pack('v', strlen($dir)) // length of pathname
+ .pack('v', 0) // extra field length
+ .$dir
+ // below is "data descriptor" segment
+ .pack('V', 0) // crc32
+ .pack('V', 0) // compressed filesize
+ .pack('V', 0); // uncompressed filesize
+
+ $this->directory .=
+ "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ .pack('V',0) // crc32
+ .pack('V',0) // compressed filesize
+ .pack('V',0) // uncompressed filesize
+ .pack('v', strlen($dir)) // length of pathname
+ .pack('v', 0) // extra field length
+ .pack('v', 0) // file comment length
+ .pack('v', 0) // disk number start
+ .pack('v', 0) // internal file attributes
+ .pack('V', 16) // external file attributes - 'directory' bit set
+ .pack('V', $this->offset) // relative offset of local header
+ .$dir;
+
+ $this->offset = strlen($this->zipdata);
+ $this->entries++;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add Data to Zip
+ *
+ * Lets you add files to the archive. If the path is included
+ * in the filename it will be placed within a directory. Make
+ * sure you use add_dir() first to create the folder.
+ *
+ * @access public
+ * @param mixed
+ * @param string
+ * @return void
+ */
+ function add_data($filepath, $data = NULL)
+ {
+ if (is_array($filepath))
+ {
+ foreach ($filepath as $path => $data)
+ {
+ $this->_add_data($path, $data);
+ }
+ }
+ else
+ {
+ $this->_add_data($filepath, $data);
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Add Data to Zip
+ *
+ * @access private
+ * @param string the file name/path
+ * @param string the data to be encoded
+ * @return void
+ */
+ function _add_data($filepath, $data)
+ {
+ $filepath = str_replace("\\", "/", $filepath);
+
+ $uncompressed_size = strlen($data);
+ $crc32 = crc32($data);
+
+ $gzdata = gzcompress($data);
+ $gzdata = substr($gzdata, 2, -4);
+ $compressed_size = strlen($gzdata);
+
+ $this->zipdata .=
+ "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+ .pack('V', $crc32)
+ .pack('V', $compressed_size)
+ .pack('V', $uncompressed_size)
+ .pack('v', strlen($filepath)) // length of filename
+ .pack('v', 0) // extra field length
+ .$filepath
+ .$gzdata; // "file data" segment
+
+ $this->directory .=
+ "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+ .pack('V', $crc32)
+ .pack('V', $compressed_size)
+ .pack('V', $uncompressed_size)
+ .pack('v', strlen($filepath)) // length of filename
+ .pack('v', 0) // extra field length
+ .pack('v', 0) // file comment length
+ .pack('v', 0) // disk number start
+ .pack('v', 0) // internal file attributes
+ .pack('V', 32) // external file attributes - 'archive' bit set
+ .pack('V', $this->offset) // relative offset of local header
+ .$filepath;
+
+ $this->offset = strlen($this->zipdata);
+ $this->entries++;
+ $this->file_num++;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Read the contents of a file and add it to the zip
+ *
+ * @access public
+ * @return bool
+ */
+ function read_file($path, $preserve_filepath = FALSE)
+ {
+ if ( ! file_exists($path))
+ {
+ return FALSE;
+ }
+
+ if (FALSE !== ($data = file_get_contents($path)))
+ {
+ $name = str_replace("\\", "/", $path);
+
+ if ($preserve_filepath === FALSE)
+ {
+ $name = preg_replace("|.*/(.+)|", "\\1", $name);
+ }
+
+ $this->add_data($name, $data);
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Read a directory and add it to the zip.
+ *
+ * This function recursively reads a folder and everything it contains (including
+ * sub-folders) and creates a zip based on it. Whatever directory structure
+ * is in the original file path will be recreated in the zip file.
+ *
+ * @access public
+ * @param string path to source
+ * @return bool
+ */
+ function read_dir($path)
+ {
+ if ($fp = @opendir($path))
+ {
+ while (FALSE !== ($file = readdir($fp)))
+ {
+ if (@is_dir($path.$file) && substr($file, 0, 1) != '.')
+ {
+ $this->read_dir($path.$file."/");
+ }
+ elseif (substr($file, 0, 1) != ".")
+ {
+ if (FALSE !== ($data = file_get_contents($path.$file)))
+ {
+ $this->add_data(str_replace("\\", "/", $path).$file, $data);
+ }
+ }
+ }
+ return TRUE;
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Get the Zip file
+ *
+ * @access public
+ * @return binary string
+ */
+ function get_zip()
+ {
+ // Is there any data to return?
+ if ($this->entries == 0)
+ {
+ return FALSE;
+ }
+
+ $zip_data = $this->zipdata;
+ $zip_data .= $this->directory."\x50\x4b\x05\x06\x00\x00\x00\x00";
+ $zip_data .= pack('v', $this->entries); // total # of entries "on this disk"
+ $zip_data .= pack('v', $this->entries); // total # of entries overall
+ $zip_data .= pack('V', strlen($this->directory)); // size of central dir
+ $zip_data .= pack('V', strlen($this->zipdata)); // offset to start of central dir
+ $zip_data .= "\x00\x00"; // .zip file comment length
+
+ return $zip_data;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Write File to the specified directory
+ *
+ * Lets you write a file
+ *
+ * @access public
+ * @param string the file name
+ * @return bool
+ */
+ function archive($filepath)
+ {
+ if ( ! ($fp = @fopen($filepath, FOPEN_WRITE_CREATE_DESTRUCTIVE)))
+ {
+ return FALSE;
+ }
+
+ flock($fp, LOCK_EX);
+ fwrite($fp, $this->get_zip());
+ flock($fp, LOCK_UN);
+ fclose($fp);
+
+ return TRUE;
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Download
+ *
+ * @access public
+ * @param string the file name
+ * @param string the data to be encoded
+ * @return bool
+ */
+ function download($filename = 'backup.zip')
+ {
+ if ( ! preg_match("|.+?\.zip$|", $filename))
+ {
+ $filename .= '.zip';
+ }
+
+ $zip_content =& $this->get_zip();
+
+ $CI =& get_instance();
+ $CI->load->helper('download');
+
+ force_download($filename, $zip_content);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Initialize Data
+ *
+ * Lets you clear current zip data. Useful if you need to create
+ * multiple zips with different data.
+ *
+ * @access public
+ * @return void
+ */
+ function clear_data()
+ {
+ $this->zipdata = '';
+ $this->directory = '';
+ $this->entries = 0;
+ $this->file_num = 0;
+ $this->offset = 0;
+ }
+
+}
+
+/* End of file Zip.php */
/* Location: ./system/libraries/Zip.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/*\r
-Instructions:\r
-\r
-Load the plugin using:\r
-\r
- $this->load->plugin('captcha');\r
-\r
-Once loaded you can generate a captcha like this:\r
- \r
- $vals = array(\r
- 'word' => 'Random word',\r
- 'img_path' => './captcha/',\r
- 'img_url' => 'http://example.com/captcha/',\r
- 'font_path' => './system/fonts/texb.ttf',\r
- 'img_width' => '150',\r
- 'img_height' => 30,\r
- 'expiration' => 7200\r
- );\r
- \r
- $cap = create_captcha($vals);\r
- echo $cap['image'];\r
- \r
-\r
-NOTES:\r
- \r
- The captcha function requires the GD image library.\r
- \r
- Only the img_path and img_url are required.\r
- \r
- If a "word" is not supplied, the function will generate a random\r
- ASCII string. You might put together your own word library that\r
- you can draw randomly from.\r
- \r
- If you do not specify a path to a TRUE TYPE font, the native ugly GD\r
- font will be used.\r
- \r
- The "captcha" folder must be writable (666, or 777)\r
- \r
- The "expiration" (in seconds) signifies how long an image will\r
- remain in the captcha folder before it will be deleted. The default\r
- is two hours.\r
-\r
-RETURNED DATA\r
-\r
-The create_captcha() function returns an associative array with this data:\r
-\r
- [array]\r
- (\r
- 'image' => IMAGE TAG\r
- 'time' => TIMESTAMP (in microtime)\r
- 'word' => CAPTCHA WORD\r
- )\r
-\r
-The "image" is the actual image tag:\r
-<img src="http://example.com/captcha/12345.jpg" width="140" height="50" />\r
-\r
-The "time" is the micro timestamp used as the image name without the file\r
-extension. It will be a number like this: 1139612155.3422\r
-\r
-The "word" is the word that appears in the captcha image, which if not\r
-supplied to the function, will be a random string.\r
-\r
-\r
-ADDING A DATABASE\r
-\r
-In order for the captcha function to prevent someone from posting, you will need\r
-to add the information returned from create_captcha() function to your database.\r
-Then, when the data from the form is submitted by the user you will need to verify\r
-that the data exists in the database and has not expired.\r
-\r
-Here is a table prototype:\r
-\r
- CREATE TABLE captcha (\r
- captcha_id bigint(13) unsigned NOT NULL auto_increment,\r
- captcha_time int(10) unsigned NOT NULL,\r
- ip_address varchar(16) default '0' NOT NULL,\r
- word varchar(20) NOT NULL,\r
- PRIMARY KEY `captcha_id` (`captcha_id`),\r
- KEY `word` (`word`)\r
- )\r
-\r
-\r
-Here is an example of usage with a DB.\r
-\r
-On the page where the captcha will be shown you'll have something like this:\r
-\r
- $this->load->plugin('captcha');\r
- $vals = array(\r
- 'img_path' => './captcha/',\r
- 'img_url' => 'http://example.com/captcha/'\r
- );\r
- \r
- $cap = create_captcha($vals);\r
-\r
- $data = array(\r
- 'captcha_id' => '',\r
- 'captcha_time' => $cap['time'],\r
- 'ip_address' => $this->input->ip_address(),\r
- 'word' => $cap['word']\r
- );\r
-\r
- $query = $this->db->insert_string('captcha', $data);\r
- $this->db->query($query);\r
- \r
- echo 'Submit the word you see below:';\r
- echo $cap['image'];\r
- echo '<input type="text" name="captcha" value="" />';\r
-\r
-\r
-Then, on the page that accepts the submission you'll have something like this:\r
-\r
- // First, delete old captchas\r
- $expiration = time()-7200; // Two hour limit\r
- $DB->query("DELETE FROM captcha WHERE captcha_time < ".$expiration); \r
-\r
- // Then see if a captcha exists:\r
- $sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND date > ?";\r
- $binds = array($_POST['captcha'], $this->input->ip_address(), $expiration);\r
- $query = $this->db->query($sql, $binds);\r
- $row = $query->row();\r
-\r
- if ($row->count == 0)\r
- {\r
- echo "You must submit the word that appears in the image";\r
- }\r
-\r
-*/\r
-\r
-\r
- \r
-/**\r
-|==========================================================\r
-| Create Captcha\r
-|==========================================================\r
-|\r
-*/\r
-function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = '')\r
-{ \r
- $defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200); \r
- \r
- foreach ($defaults as $key => $val)\r
- {\r
- if ( ! is_array($data))\r
- {\r
- if ( ! isset($$key) OR $$key == '')\r
- {\r
- $$key = $val;\r
- }\r
- }\r
- else\r
- { \r
- $$key = ( ! isset($data[$key])) ? $val : $data[$key];\r
- }\r
- }\r
- \r
- if ($img_path == '' OR $img_url == '')\r
- {\r
- return FALSE;\r
- }\r
-\r
- if ( ! @is_dir($img_path))\r
- {\r
- return FALSE;\r
- }\r
- \r
- if ( ! is_really_writable($img_path))\r
- {\r
- return FALSE;\r
- }\r
- \r
- if ( ! extension_loaded('gd'))\r
- {\r
- return FALSE;\r
- } \r
- \r
- // -----------------------------------\r
- // Remove old images \r
- // -----------------------------------\r
- \r
- list($usec, $sec) = explode(" ", microtime());\r
- $now = ((float)$usec + (float)$sec);\r
- \r
- $current_dir = @opendir($img_path);\r
- \r
- while($filename = @readdir($current_dir))\r
- {\r
- if ($filename != "." and $filename != ".." and $filename != "index.html")\r
- {\r
- $name = str_replace(".jpg", "", $filename);\r
- \r
- if (($name + $expiration) < $now)\r
- {\r
- @unlink($img_path.$filename);\r
- }\r
- }\r
- }\r
- \r
- @closedir($current_dir);\r
-\r
- // -----------------------------------\r
- // Do we have a "word" yet?\r
- // -----------------------------------\r
- \r
- if ($word == '')\r
- {\r
- $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\r
-\r
- $str = '';\r
- for ($i = 0; $i < 8; $i++)\r
- {\r
- $str .= substr($pool, mt_rand(0, strlen($pool) -1), 1);\r
- }\r
- \r
- $word = $str;\r
- }\r
- \r
- // -----------------------------------\r
- // Determine angle and position \r
- // -----------------------------------\r
- \r
- $length = strlen($word);\r
- $angle = ($length >= 6) ? rand(-($length-6), ($length-6)) : 0;\r
- $x_axis = rand(6, (360/$length)-16); \r
- $y_axis = ($angle >= 0 ) ? rand($img_height, $img_width) : rand(6, $img_height);\r
- \r
- // -----------------------------------\r
- // Create image\r
- // -----------------------------------\r
- \r
- // PHP.net recommends imagecreatetruecolor(), but it isn't always available\r
- if (function_exists('imagecreatetruecolor'))\r
- {\r
- $im = imagecreatetruecolor($img_width, $img_height);\r
- }\r
- else\r
- {\r
- $im = imagecreate($img_width, $img_height);\r
- }\r
- \r
- // -----------------------------------\r
- // Assign colors\r
- // -----------------------------------\r
- \r
- $bg_color = imagecolorallocate ($im, 255, 255, 255);\r
- $border_color = imagecolorallocate ($im, 153, 102, 102);\r
- $text_color = imagecolorallocate ($im, 204, 153, 153);\r
- $grid_color = imagecolorallocate($im, 255, 182, 182);\r
- $shadow_color = imagecolorallocate($im, 255, 240, 240);\r
-\r
- // -----------------------------------\r
- // Create the rectangle\r
- // -----------------------------------\r
- \r
- ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $bg_color);\r
- \r
- // -----------------------------------\r
- // Create the spiral pattern\r
- // -----------------------------------\r
- \r
- $theta = 1;\r
- $thetac = 7;\r
- $radius = 16;\r
- $circles = 20;\r
- $points = 32;\r
-\r
- for ($i = 0; $i < ($circles * $points) - 1; $i++)\r
- {\r
- $theta = $theta + $thetac;\r
- $rad = $radius * ($i / $points );\r
- $x = ($rad * cos($theta)) + $x_axis;\r
- $y = ($rad * sin($theta)) + $y_axis;\r
- $theta = $theta + $thetac;\r
- $rad1 = $radius * (($i + 1) / $points);\r
- $x1 = ($rad1 * cos($theta)) + $x_axis;\r
- $y1 = ($rad1 * sin($theta )) + $y_axis;\r
- imageline($im, $x, $y, $x1, $y1, $grid_color);\r
- $theta = $theta - $thetac;\r
- }\r
-\r
- // -----------------------------------\r
- // Write the text\r
- // -----------------------------------\r
- \r
- $use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE;\r
- \r
- if ($use_font == FALSE)\r
- {\r
- $font_size = 5;\r
- $x = rand(0, $img_width/($length/3));\r
- $y = 0;\r
- }\r
- else\r
- {\r
- $font_size = 16;\r
- $x = rand(0, $img_width/($length/1.5));\r
- $y = $font_size+2;\r
- }\r
-\r
- for ($i = 0; $i < strlen($word); $i++)\r
- {\r
- if ($use_font == FALSE)\r
- {\r
- $y = rand(0 , $img_height/2);\r
- imagestring($im, $font_size, $x, $y, substr($word, $i, 1), $text_color);\r
- $x += ($font_size*2);\r
- }\r
- else\r
- { \r
- $y = rand($img_height/2, $img_height-3);\r
- imagettftext($im, $font_size, $angle, $x, $y, $text_color, $font_path, substr($word, $i, 1));\r
- $x += $font_size;\r
- }\r
- }\r
- \r
-\r
- // -----------------------------------\r
- // Create the border\r
- // -----------------------------------\r
-\r
- imagerectangle($im, 0, 0, $img_width-1, $img_height-1, $border_color); \r
-\r
- // -----------------------------------\r
- // Generate the image\r
- // -----------------------------------\r
- \r
- $img_name = $now.'.jpg';\r
-\r
- ImageJPEG($im, $img_path.$img_name);\r
- \r
- $img = "<img src=\"$img_url$img_name\" width=\"$img_width\" height=\"$img_height\" style=\"border:0;\" alt=\" \" />";\r
- \r
- ImageDestroy($im);\r
- \r
- return array('word' => $word, 'time' => $now, 'image' => $img);\r
-}\r
-\r
-\r
-/* End of file captcha_pi.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/*
+Instructions:
+
+Load the plugin using:
+
+ $this->load->plugin('captcha');
+
+Once loaded you can generate a captcha like this:
+
+ $vals = array(
+ 'word' => 'Random word',
+ 'img_path' => './captcha/',
+ 'img_url' => 'http://example.com/captcha/',
+ 'font_path' => './system/fonts/texb.ttf',
+ 'img_width' => '150',
+ 'img_height' => 30,
+ 'expiration' => 7200
+ );
+
+ $cap = create_captcha($vals);
+ echo $cap['image'];
+
+
+NOTES:
+
+ The captcha function requires the GD image library.
+
+ Only the img_path and img_url are required.
+
+ If a "word" is not supplied, the function will generate a random
+ ASCII string. You might put together your own word library that
+ you can draw randomly from.
+
+ If you do not specify a path to a TRUE TYPE font, the native ugly GD
+ font will be used.
+
+ The "captcha" folder must be writable (666, or 777)
+
+ The "expiration" (in seconds) signifies how long an image will
+ remain in the captcha folder before it will be deleted. The default
+ is two hours.
+
+RETURNED DATA
+
+The create_captcha() function returns an associative array with this data:
+
+ [array]
+ (
+ 'image' => IMAGE TAG
+ 'time' => TIMESTAMP (in microtime)
+ 'word' => CAPTCHA WORD
+ )
+
+The "image" is the actual image tag:
+<img src="http://example.com/captcha/12345.jpg" width="140" height="50" />
+
+The "time" is the micro timestamp used as the image name without the file
+extension. It will be a number like this: 1139612155.3422
+
+The "word" is the word that appears in the captcha image, which if not
+supplied to the function, will be a random string.
+
+
+ADDING A DATABASE
+
+In order for the captcha function to prevent someone from posting, you will need
+to add the information returned from create_captcha() function to your database.
+Then, when the data from the form is submitted by the user you will need to verify
+that the data exists in the database and has not expired.
+
+Here is a table prototype:
+
+ CREATE TABLE captcha (
+ captcha_id bigint(13) unsigned NOT NULL auto_increment,
+ captcha_time int(10) unsigned NOT NULL,
+ ip_address varchar(16) default '0' NOT NULL,
+ word varchar(20) NOT NULL,
+ PRIMARY KEY `captcha_id` (`captcha_id`),
+ KEY `word` (`word`)
+ )
+
+
+Here is an example of usage with a DB.
+
+On the page where the captcha will be shown you'll have something like this:
+
+ $this->load->plugin('captcha');
+ $vals = array(
+ 'img_path' => './captcha/',
+ 'img_url' => 'http://example.com/captcha/'
+ );
+
+ $cap = create_captcha($vals);
+
+ $data = array(
+ 'captcha_id' => '',
+ 'captcha_time' => $cap['time'],
+ 'ip_address' => $this->input->ip_address(),
+ 'word' => $cap['word']
+ );
+
+ $query = $this->db->insert_string('captcha', $data);
+ $this->db->query($query);
+
+ echo 'Submit the word you see below:';
+ echo $cap['image'];
+ echo '<input type="text" name="captcha" value="" />';
+
+
+Then, on the page that accepts the submission you'll have something like this:
+
+ // First, delete old captchas
+ $expiration = time()-7200; // Two hour limit
+ $DB->query("DELETE FROM captcha WHERE captcha_time < ".$expiration);
+
+ // Then see if a captcha exists:
+ $sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND date > ?";
+ $binds = array($_POST['captcha'], $this->input->ip_address(), $expiration);
+ $query = $this->db->query($sql, $binds);
+ $row = $query->row();
+
+ if ($row->count == 0)
+ {
+ echo "You must submit the word that appears in the image";
+ }
+
+*/
+
+
+
+/**
+|==========================================================
+| Create Captcha
+|==========================================================
+|
+*/
+function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = '')
+{
+ $defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200);
+
+ foreach ($defaults as $key => $val)
+ {
+ if ( ! is_array($data))
+ {
+ if ( ! isset($$key) OR $$key == '')
+ {
+ $$key = $val;
+ }
+ }
+ else
+ {
+ $$key = ( ! isset($data[$key])) ? $val : $data[$key];
+ }
+ }
+
+ if ($img_path == '' OR $img_url == '')
+ {
+ return FALSE;
+ }
+
+ if ( ! @is_dir($img_path))
+ {
+ return FALSE;
+ }
+
+ if ( ! is_really_writable($img_path))
+ {
+ return FALSE;
+ }
+
+ if ( ! extension_loaded('gd'))
+ {
+ return FALSE;
+ }
+
+ // -----------------------------------
+ // Remove old images
+ // -----------------------------------
+
+ list($usec, $sec) = explode(" ", microtime());
+ $now = ((float)$usec + (float)$sec);
+
+ $current_dir = @opendir($img_path);
+
+ while($filename = @readdir($current_dir))
+ {
+ if ($filename != "." and $filename != ".." and $filename != "index.html")
+ {
+ $name = str_replace(".jpg", "", $filename);
+
+ if (($name + $expiration) < $now)
+ {
+ @unlink($img_path.$filename);
+ }
+ }
+ }
+
+ @closedir($current_dir);
+
+ // -----------------------------------
+ // Do we have a "word" yet?
+ // -----------------------------------
+
+ if ($word == '')
+ {
+ $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+
+ $str = '';
+ for ($i = 0; $i < 8; $i++)
+ {
+ $str .= substr($pool, mt_rand(0, strlen($pool) -1), 1);
+ }
+
+ $word = $str;
+ }
+
+ // -----------------------------------
+ // Determine angle and position
+ // -----------------------------------
+
+ $length = strlen($word);
+ $angle = ($length >= 6) ? rand(-($length-6), ($length-6)) : 0;
+ $x_axis = rand(6, (360/$length)-16);
+ $y_axis = ($angle >= 0 ) ? rand($img_height, $img_width) : rand(6, $img_height);
+
+ // -----------------------------------
+ // Create image
+ // -----------------------------------
+
+ // PHP.net recommends imagecreatetruecolor(), but it isn't always available
+ if (function_exists('imagecreatetruecolor'))
+ {
+ $im = imagecreatetruecolor($img_width, $img_height);
+ }
+ else
+ {
+ $im = imagecreate($img_width, $img_height);
+ }
+
+ // -----------------------------------
+ // Assign colors
+ // -----------------------------------
+
+ $bg_color = imagecolorallocate ($im, 255, 255, 255);
+ $border_color = imagecolorallocate ($im, 153, 102, 102);
+ $text_color = imagecolorallocate ($im, 204, 153, 153);
+ $grid_color = imagecolorallocate($im, 255, 182, 182);
+ $shadow_color = imagecolorallocate($im, 255, 240, 240);
+
+ // -----------------------------------
+ // Create the rectangle
+ // -----------------------------------
+
+ ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $bg_color);
+
+ // -----------------------------------
+ // Create the spiral pattern
+ // -----------------------------------
+
+ $theta = 1;
+ $thetac = 7;
+ $radius = 16;
+ $circles = 20;
+ $points = 32;
+
+ for ($i = 0; $i < ($circles * $points) - 1; $i++)
+ {
+ $theta = $theta + $thetac;
+ $rad = $radius * ($i / $points );
+ $x = ($rad * cos($theta)) + $x_axis;
+ $y = ($rad * sin($theta)) + $y_axis;
+ $theta = $theta + $thetac;
+ $rad1 = $radius * (($i + 1) / $points);
+ $x1 = ($rad1 * cos($theta)) + $x_axis;
+ $y1 = ($rad1 * sin($theta )) + $y_axis;
+ imageline($im, $x, $y, $x1, $y1, $grid_color);
+ $theta = $theta - $thetac;
+ }
+
+ // -----------------------------------
+ // Write the text
+ // -----------------------------------
+
+ $use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE;
+
+ if ($use_font == FALSE)
+ {
+ $font_size = 5;
+ $x = rand(0, $img_width/($length/3));
+ $y = 0;
+ }
+ else
+ {
+ $font_size = 16;
+ $x = rand(0, $img_width/($length/1.5));
+ $y = $font_size+2;
+ }
+
+ for ($i = 0; $i < strlen($word); $i++)
+ {
+ if ($use_font == FALSE)
+ {
+ $y = rand(0 , $img_height/2);
+ imagestring($im, $font_size, $x, $y, substr($word, $i, 1), $text_color);
+ $x += ($font_size*2);
+ }
+ else
+ {
+ $y = rand($img_height/2, $img_height-3);
+ imagettftext($im, $font_size, $angle, $x, $y, $text_color, $font_path, substr($word, $i, 1));
+ $x += $font_size;
+ }
+ }
+
+
+ // -----------------------------------
+ // Create the border
+ // -----------------------------------
+
+ imagerectangle($im, 0, 0, $img_width-1, $img_height-1, $border_color);
+
+ // -----------------------------------
+ // Generate the image
+ // -----------------------------------
+
+ $img_name = $now.'.jpg';
+
+ ImageJPEG($im, $img_path.$img_name);
+
+ $img = "<img src=\"$img_url$img_name\" width=\"$img_width\" height=\"$img_height\" style=\"border:0;\" alt=\" \" />";
+
+ ImageDestroy($im);
+
+ return array('word' => $word, 'time' => $now, 'image' => $img);
+}
+
+
+/* End of file captcha_pi.php */
/* Location: ./system/plugins/captcha_pi.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/*\r
-Instructions:\r
-\r
-Load the plugin using:\r
-\r
- $this->load->plugin('js_calendar');\r
-\r
-Once loaded you'll add the calendar script to the <head> of your page like this:\r
-\r
-<?php echo js_calendar_script('my_form'); ?>\r
-\r
-The above function will be passed the name of your form.\r
-\r
-Then to show the actual calendar you'll do this:\r
-\r
-<?php echo js_calendar_write('entry_date', time(), true);?>\r
-<form name="my_form">\r
-<input type="text" name="entry_date" value="" onblur="update_calendar(this.name, this.value);" />\r
-<p><a href="javascript:void(0);" onClick="set_to_time('entry_date', '<?php echo time();?>')" >Today</a></p>\r
-</form>\r
-\r
-\r
-Note: The first parameter is the name of the field containing your date, the second parameter contains the "now" time,\r
-and the third tells the calendar whether to highlight the current day or not.\r
-\r
-Lastly, you'll need some CSS for your calendar:\r
-\r
-.calendar {\r
- border: 1px #6975A3 solid;\r
- background-color: transparent;\r
-}\r
-.calheading {\r
- background-color: #7C8BC0;\r
- color: #fff;\r
- font-family: Lucida Grande, Verdana, Geneva, Sans-serif;\r
- font-size: 11px;\r
- font-weight: bold;\r
- text-align: center;\r
-}\r
-.calnavleft {\r
- background-color: #7C8BC0;\r
- font-family: Lucida Grande, Verdana, Geneva, Sans-serif;\r
- font-size: 10px;\r
- font-weight: bold;\r
- color: #fff;\r
- padding: 4px;\r
- cursor: pointer;\r
-}\r
-.calnavright {\r
- background-color: #7C8BC0;\r
- font-family: Lucida Grande, Verdana, Geneva, Sans-serif;\r
- font-size: 10px;\r
- font-weight: bold;\r
- color: #fff;\r
- text-align: right;\r
- padding: 4px;\r
- cursor: pointer;\r
-}\r
-.caldayheading {\r
- background-color: #000;\r
- color: #fff;\r
- font-family: Lucida Grande, Verdana, Geneva, Sans-serif;\r
- font-size: 10px;\r
- text-align: center;\r
- padding: 6px 2px 6px 2px;\r
-}\r
-.caldaycells{\r
- color: #000;\r
- background-color: #D1D7E6;\r
- font-family: Lucida Grande, Verdana, Geneva, Sans-serif;\r
- font-size: 11px;\r
- text-align: center;\r
- padding: 4px;\r
- border: 1px #E0E5F1 solid;\r
- cursor: pointer;\r
-}\r
-.caldaycellhover{\r
- color: #fff;\r
- background-color: #B3BCD4;\r
- font-family: Lucida Grande, Verdana, Geneva, Sans-serif;\r
- font-size: 11px;\r
- text-align: center;\r
- padding: 4px;\r
- border: 1px #B3BCD4 solid;\r
- cursor: pointer;\r
-}\r
-.caldayselected{\r
- background-color: #737FAC;\r
- color: #fff;\r
- font-family: Lucida Grande, Verdana, Geneva, Sans-serif;\r
- font-size: 11px;\r
- font-weight: bold;\r
- text-align: center;\r
- border: 1px #566188 solid;\r
- padding: 3px;\r
- cursor: pointer;\r
-}\r
-.calblanktop {\r
- background-color: #fff;\r
- padding: 4px;\r
-}\r
-.calblankbot {\r
- background-color: #fff;\r
- padding: 4px;\r
-}\r
-\r
-\r
-*/\r
-\r
-function js_calendar_script($form_name = 'entryform')\r
-{ \r
-$CI =& get_instance();\r
-$CI->load->language('calendar');\r
-ob_start();\r
-?>\r
-<script type="text/javascript">\r
-<!--\r
-var form_name = "<?php echo $form_name; ?>";\r
-var format = 'us'; // eu or us\r
-var days = new Array(\r
- '<?php echo $CI->lang->line('cal_su');?>', // Sunday, short name\r
- '<?php echo $CI->lang->line('cal_mo');?>', // Monday, short name\r
- '<?php echo $CI->lang->line('cal_tu');?>', // Tuesday, short name\r
- '<?php echo $CI->lang->line('cal_wed');?>', // Wednesday, short name\r
- '<?php echo $CI->lang->line('cal_thu');?>', // Thursday, short name\r
- '<?php echo $CI->lang->line('cal_fri');?>', // Friday, short name\r
- '<?php echo $CI->lang->line('cal_sat');?>' // Saturday, short name\r
- );\r
-var months = new Array(\r
- '<?php echo $CI->lang->line('cal_january');?>',\r
- '<?php echo $CI->lang->line('cal_february');?>',\r
- '<?php echo $CI->lang->line('cal_march');?>',\r
- '<?php echo $CI->lang->line('cal_april');?>',\r
- '<?php echo $CI->lang->line('cal_mayl');?>',\r
- '<?php echo $CI->lang->line('cal_june');?>',\r
- '<?php echo $CI->lang->line('cal_july');?>',\r
- '<?php echo $CI->lang->line('cal_august');?>',\r
- '<?php echo $CI->lang->line('cal_september');?>',\r
- '<?php echo $CI->lang->line('cal_october');?>',\r
- '<?php echo $CI->lang->line('cal_november');?>',\r
- '<?php echo $CI->lang->line('cal_december');?>'\r
- );\r
-var last_click = new Array();\r
-var current_month = '';\r
-var current_year = '';\r
-var last_date = '';\r
- \r
-function calendar(id, d, highlight, adjusted)\r
-{ \r
- if (adjusted == undefined)\r
- { \r
- var d = new Date(d * 1000);\r
- }\r
-\r
- this.id = id;\r
- this.highlight = highlight;\r
- this.date_obj = d;\r
- this.write = build_calendar;\r
- this.total_days = total_days;\r
- this.month = d.getMonth();\r
- this.date = d.getDate();\r
- this.day = d.getDay();\r
- this.year = d.getFullYear();\r
- this.hours = d.getHours();\r
- this.minutes = d.getMinutes();\r
- this.seconds = d.getSeconds();\r
- this.date_str = date_str;\r
- \r
- if (highlight == false)\r
- {\r
- this.selected_date = '';\r
- }\r
- else\r
- {\r
- this.selected_date = this.year + '' + this.month + '' + this.date;\r
- }\r
- \r
- // Set the "selected date"\r
- d.setDate(1);\r
- this.firstDay = d.getDay();\r
- \r
- //then reset the date object to the correct date\r
- d.setDate(this.date);\r
-}\r
- \r
-// Build the body of the calendar\r
-function build_calendar()\r
-{\r
- var str = '';\r
- \r
- // Calendar Heading\r
- \r
- str += '<div id="cal' + this.id + '">';\r
- str += '<table class="calendar" cellspacing="0" cellpadding="0" border="0" >';\r
- str += '<tr>';\r
- str += '<td class="calnavleft" onClick="change_month(-1, \'' + this.id + '\')"><<<\/td>';\r
- str += '<td colspan="5" class="calheading">' + months[this.month] + ' ' + this.year + '<\/td>';\r
- str += '<td class="calnavright" onClick="change_month(1, \'' + this.id + '\')">>><\/td>';\r
- str += '<\/tr>';\r
- \r
- // Day Names\r
- \r
- str += '<tr>';\r
- \r
- for (i = 0; i < 7; i++)\r
- {\r
- str += '<td class="caldayheading">' + days[i] + '<\/td>';\r
- }\r
- \r
- str += '<\/tr>';\r
- \r
- // Day Cells\r
- \r
- str += '<tr>';\r
- \r
- selDate = (last_date != '') ? last_date : this.date;\r
- \r
- for (j = 0; j < 42; j++)\r
- {\r
- var displayNum = (j - this.firstDay + 1);\r
- \r
- if (j < this.firstDay) // leading empty cells\r
- {\r
- str += '<td class="calblanktop"> <\/td>';\r
- }\r
- else if (displayNum == selDate && this.highlight == true) // Selected date\r
- {\r
- str += '<td id="' + this.id +'selected" class="caldayselected" onClick="set_date(this,\'' + this.id + '\')">' + displayNum + '<\/td>';\r
- }\r
- else if (displayNum > this.total_days())\r
- {\r
- str += '<td class="calblankbot"> <\/td>'; // trailing empty cells\r
- }\r
- else // Unselected days\r
- {\r
- str += '<td id="" class="caldaycells" onClick="set_date(this,\'' + this.id + '\'); return false;" onMouseOver="javascript:cell_highlight(this,\'' + displayNum + '\',\'' + this.id + '\');" onMouseOut="javascript:cell_reset(this,\'' + displayNum + '\',\'' + this.id + '\');" >' + displayNum + '<\/td>';\r
- }\r
- \r
- if (j % 7 == 6)\r
- {\r
- str += '<\/tr><tr>';\r
- }\r
- }\r
-\r
- str += '<\/tr>'; \r
- str += '<\/table>';\r
- str += '<\/div>';\r
- \r
- return str;\r
-}\r
-\r
-// Total number of days in a month\r
-function total_days()\r
-{ \r
- switch(this.month)\r
- {\r
- case 1: // Check for leap year\r
- if (( this.date_obj.getFullYear() % 4 == 0\r
- && this.date_obj.getFullYear() % 100 != 0)\r
- || this.date_obj.getFullYear() % 400 == 0)\r
- return 29;\r
- else\r
- return 28;\r
- case 3:\r
- return 30;\r
- case 5:\r
- return 30;\r
- case 8:\r
- return 30;\r
- case 10:\r
- return 30\r
- default:\r
- return 31;\r
- }\r
-}\r
-\r
-// Highlight Cell on Mouseover\r
-function cell_highlight(td, num, cal)\r
-{\r
- cal = eval(cal);\r
-\r
- if (last_click[cal.id] != num)\r
- {\r
- td.className = "caldaycellhover";\r
- }\r
-} \r
-\r
-// Reset Cell on MouseOut\r
-function cell_reset(td, num, cal)\r
-{ \r
- cal = eval(cal);\r
-\r
- if (last_click[cal.id] == num)\r
- {\r
- td.className = "caldayselected";\r
- }\r
- else\r
- {\r
- td.className = "caldaycells";\r
- }\r
-} \r
-\r
-// Clear Field\r
-function clear_field(id)\r
-{ \r
- eval("document." + form_name + "." + id + ".value = ''");\r
- \r
- document.getElementById(id + "selected").className = "caldaycells";\r
- document.getElementById(id + "selected").id = ""; \r
- \r
- cal = eval(id);\r
- cal.selected_date = ''; \r
-} \r
-\r
-\r
-// Set date to specified time\r
-function set_to_time(id, raw)\r
-{ \r
- if (document.getElementById(id + "selected"))\r
- { \r
- document.getElementById(id + "selected").className = "caldaycells";\r
- document.getElementById(id + "selected").id = ""; \r
- }\r
- \r
- document.getElementById('cal' + id).innerHTML = '<div id="tempcal'+id+'"> <'+'/div>'; \r
- \r
- var nowDate = new Date();\r
- nowDate.setTime = raw * 1000;\r
- \r
- current_month = nowDate.getMonth();\r
- current_year = nowDate.getFullYear();\r
- current_date = nowDate.getDate();\r
- \r
- oldcal = eval(id);\r
- oldcal.selected_date = current_year + '' + current_month + '' + current_date; \r
-\r
- cal = new calendar(id, nowDate, true, true); \r
- cal.selected_date = current_year + '' + current_month + '' + current_date; \r
- \r
- last_date = cal.date;\r
- \r
- document.getElementById('tempcal'+id).innerHTML = cal.write(); \r
- \r
- insert_date(cal);\r
-}\r
-\r
-// Set date to what is in the field\r
-var lastDates = new Array();\r
-\r
-function update_calendar(id, dateValue)\r
-{\r
- if (lastDates[id] == dateValue) return;\r
- \r
- lastDates[id] = dateValue;\r
- \r
- var fieldString = dateValue.replace(/\s+/g, ' ');\r
- \r
- while (fieldString.substring(0,1) == ' ')\r
- {\r
- fieldString = fieldString.substring(1, fieldString.length);\r
- }\r
- \r
- var dateString = fieldString.split(' ');\r
- var dateParts = dateString[0].split('-')\r
-\r
- if (dateParts.length < 3) return;\r
- var newYear = dateParts[0];\r
- var newMonth = dateParts[1];\r
- var newDay = dateParts[2];\r
- \r
- if (isNaN(newDay) || newDay < 1 || (newDay.length != 1 && newDay.length != 2)) return;\r
- if (isNaN(newYear) || newYear < 1 || newYear.length != 4) return;\r
- if (isNaN(newMonth) || newMonth < 1 || (newMonth.length != 1 && newMonth.length != 2)) return;\r
- \r
- if (newMonth > 12) newMonth = 12;\r
- \r
- if (newDay > 28)\r
- {\r
- switch(newMonth - 1)\r
- {\r
- case 1: // Check for leap year\r
- if ((newYear % 4 == 0 && newYear % 100 != 0) || newYear % 400 == 0)\r
- {\r
- if (newDay > 29) newDay = 29;\r
- }\r
- else\r
- {\r
- if (newDay > 28) newDay = 28;\r
- }\r
- case 3:\r
- if (newDay > 30) newDay = 30;\r
- case 5:\r
- if (newDay > 30) newDay = 30;\r
- case 8:\r
- if (newDay > 30) newDay = 30;\r
- case 10:\r
- if (newDay > 30) newDay = 30;\r
- default:\r
- if (newDay > 31) newDay = 31;\r
- }\r
- }\r
- \r
- if (document.getElementById(id + "selected"))\r
- { \r
- document.getElementById(id + "selected").className = "caldaycells";\r
- document.getElementById(id + "selected").id = ""; \r
- }\r
- \r
- document.getElementById('cal' + id).innerHTML = '<div id="tempcal'+id+'"> <'+'/div>'; \r
- \r
- var nowDate = new Date();\r
- nowDate.setDate(newDay);\r
- nowDate.setMonth(newMonth - 1);\r
- nowDate.setYear(newYear);\r
- nowDate.setHours(12);\r
- \r
- current_month = nowDate.getMonth();\r
- current_year = nowDate.getFullYear();\r
-\r
- cal = new calendar(id, nowDate, true, true); \r
- document.getElementById('tempcal'+id).innerHTML = cal.write(); \r
-}\r
-\r
-// Set the date\r
-function set_date(td, cal)\r
-{ \r
-\r
- cal = eval(cal);\r
- \r
- // If the user is clicking a cell that is already\r
- // selected we'll de-select it and clear the form field\r
- \r
- if (last_click[cal.id] == td.firstChild.nodeValue)\r
- {\r
- td.className = "caldaycells";\r
- last_click[cal.id] = '';\r
- remove_date(cal);\r
- cal.selected_date = '';\r
- return;\r
- }\r
- \r
- // Onward!\r
- if (document.getElementById(cal.id + "selected"))\r
- {\r
- document.getElementById(cal.id + "selected").className = "caldaycells";\r
- document.getElementById(cal.id + "selected").id = "";\r
- }\r
- \r
- td.className = "caldayselected";\r
- td.id = cal.id + "selected";\r
-\r
- cal.selected_date = cal.date_obj.getFullYear() + '' + cal.date_obj.getMonth() + '' + cal.date; \r
- cal.date_obj.setDate(td.firstChild.nodeValue);\r
- cal = new calendar(cal.id, cal.date_obj, true, true);\r
- cal.selected_date = cal.date_obj.getFullYear() + '' + cal.date_obj.getMonth() + '' + cal.date; \r
- \r
- last_date = cal.date;\r
-\r
- //cal.date\r
- last_click[cal.id] = cal.date;\r
- \r
- // Insert the date into the form\r
- insert_date(cal);\r
-}\r
-/*\r
-// Insert the date into the form field\r
-function insert_date(cal)\r
-{\r
- cal = eval(cal);\r
- fval = eval("document." + form_name + "." + cal.id); \r
- \r
- if (fval.value == '')\r
- {\r
- fval.value = cal.date_str('y');\r
- }\r
- else\r
- {\r
- time = fval.value.substring(10);\r
- new_date = cal.date_str('n') + time;\r
- fval.value = new_date;\r
- } \r
-}\r
-*/ \r
-// Remove the date from the form field\r
-function remove_date(cal)\r
-{\r
- cal = eval(cal);\r
- fval = eval("document." + form_name + "." + cal.id); \r
- fval.value = '';\r
-}\r
-\r
-// Change to a new month\r
-function change_month(mo, cal)\r
-{ \r
- cal = eval(cal);\r
-\r
- if (current_month != '')\r
- {\r
- cal.date_obj.setMonth(current_month);\r
- cal.date_obj.setYear(current_year);\r
- \r
- current_month = '';\r
- current_year = '';\r
- }\r
- \r
- var newMonth = cal.date_obj.getMonth() + mo;\r
- var newDate = cal.date_obj.getDate();\r
- \r
- if (newMonth == 12)\r
- {\r
- cal.date_obj.setYear(cal.date_obj.getFullYear() + 1)\r
- newMonth = 0;\r
- }\r
- else if (newMonth == -1)\r
- {\r
- cal.date_obj.setYear(cal.date_obj.getFullYear() - 1)\r
- newMonth = 11;\r
- }\r
- \r
- if (newDate > 28)\r
- {\r
- var newYear = cal.date_obj.getFullYear();\r
- \r
- switch(newMonth)\r
- {\r
- case 1: // Check for leap year\r
- if ((newYear % 4 == 0 && newYear % 100 != 0) || newYear % 400 == 0)\r
- {\r
- if (newDate > 29) newDate = 29;\r
- }\r
- else\r
- {\r
- if (newDate > 28) newDate = 28;\r
- }\r
- case 3:\r
- if (newDate > 30) newDate = 30;\r
- case 5:\r
- if (newDate > 30) newDate = 30;\r
- case 8:\r
- if (newDate > 30) newDate = 30;\r
- case 10:\r
- if (newDate > 30) newDate = 30;\r
- default:\r
- if (newDate > 31) newDate = 31;\r
- }\r
- }\r
- \r
- cal.date_obj.setDate(newDate);\r
- cal.date_obj.setMonth(newMonth);\r
- new_mdy = cal.date_obj.getFullYear() + '' + cal.date_obj.getMonth() + '' + cal.date;\r
- \r
- highlight = (cal.selected_date == new_mdy) ? true : false; \r
- cal = new calendar(cal.id, cal.date_obj, highlight, true); \r
- document.getElementById('cal' + cal.id).innerHTML = cal.write(); \r
-}\r
-\r
-// Finalize the date string\r
-function date_str(time)\r
-{\r
- var month = this.month + 1;\r
- if (month < 10)\r
- month = '0' + month;\r
- \r
- var day = (this.date < 10) ? '0' + this.date : this.date;\r
- var minutes = (this.minutes < 10) ? '0' + this.minutes : this.minutes;\r
- \r
- if (format == 'us')\r
- {\r
- var hours = (this.hours > 12) ? this.hours - 12 : this.hours;\r
- var ampm = (this.hours > 11) ? 'PM' : 'AM'\r
- }\r
- else\r
- {\r
- var hours = this.hours;\r
- var ampm = '';\r
- }\r
- \r
- if (time == 'y')\r
- {\r
- return this.year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ' ' + ampm; \r
- }\r
- else\r
- {\r
- return this.year + '-' + month + '-' + day;\r
- }\r
-}\r
-\r
-//-->\r
-</script>\r
-<?php\r
-\r
-$r = ob_get_contents();\r
-ob_end_clean();\r
-return $r;\r
-}\r
-\r
-\r
-function js_calendar_write($field_id, $time = '', $highlight = TRUE)\r
-{\r
- if ($time == '')\r
- $time = time();\r
-\r
- return\r
- '<script type="text/javascript">\r
- var '.$field_id.' = new calendar("'.$field_id.'", '.$time.', '.(($highlight == TRUE) ? 'true' : 'false').');\r
- document.write('.$field_id.'.write());\r
- </script>'; \r
-} \r
-\r
-\r
-/* End of file js_calendar_pi.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/*
+Instructions:
+
+Load the plugin using:
+
+ $this->load->plugin('js_calendar');
+
+Once loaded you'll add the calendar script to the <head> of your page like this:
+
+<?php echo js_calendar_script('my_form'); ?>
+
+The above function will be passed the name of your form.
+
+Then to show the actual calendar you'll do this:
+
+<?php echo js_calendar_write('entry_date', time(), true);?>
+<form name="my_form">
+<input type="text" name="entry_date" value="" onblur="update_calendar(this.name, this.value);" />
+<p><a href="javascript:void(0);" onClick="set_to_time('entry_date', '<?php echo time();?>')" >Today</a></p>
+</form>
+
+
+Note: The first parameter is the name of the field containing your date, the second parameter contains the "now" time,
+and the third tells the calendar whether to highlight the current day or not.
+
+Lastly, you'll need some CSS for your calendar:
+
+.calendar {
+ border: 1px #6975A3 solid;
+ background-color: transparent;
+}
+.calheading {
+ background-color: #7C8BC0;
+ color: #fff;
+ font-family: Lucida Grande, Verdana, Geneva, Sans-serif;
+ font-size: 11px;
+ font-weight: bold;
+ text-align: center;
+}
+.calnavleft {
+ background-color: #7C8BC0;
+ font-family: Lucida Grande, Verdana, Geneva, Sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+ color: #fff;
+ padding: 4px;
+ cursor: pointer;
+}
+.calnavright {
+ background-color: #7C8BC0;
+ font-family: Lucida Grande, Verdana, Geneva, Sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+ color: #fff;
+ text-align: right;
+ padding: 4px;
+ cursor: pointer;
+}
+.caldayheading {
+ background-color: #000;
+ color: #fff;
+ font-family: Lucida Grande, Verdana, Geneva, Sans-serif;
+ font-size: 10px;
+ text-align: center;
+ padding: 6px 2px 6px 2px;
+}
+.caldaycells{
+ color: #000;
+ background-color: #D1D7E6;
+ font-family: Lucida Grande, Verdana, Geneva, Sans-serif;
+ font-size: 11px;
+ text-align: center;
+ padding: 4px;
+ border: 1px #E0E5F1 solid;
+ cursor: pointer;
+}
+.caldaycellhover{
+ color: #fff;
+ background-color: #B3BCD4;
+ font-family: Lucida Grande, Verdana, Geneva, Sans-serif;
+ font-size: 11px;
+ text-align: center;
+ padding: 4px;
+ border: 1px #B3BCD4 solid;
+ cursor: pointer;
+}
+.caldayselected{
+ background-color: #737FAC;
+ color: #fff;
+ font-family: Lucida Grande, Verdana, Geneva, Sans-serif;
+ font-size: 11px;
+ font-weight: bold;
+ text-align: center;
+ border: 1px #566188 solid;
+ padding: 3px;
+ cursor: pointer;
+}
+.calblanktop {
+ background-color: #fff;
+ padding: 4px;
+}
+.calblankbot {
+ background-color: #fff;
+ padding: 4px;
+}
+
+
+*/
+
+function js_calendar_script($form_name = 'entryform')
+{
+$CI =& get_instance();
+$CI->load->language('calendar');
+ob_start();
+?>
+<script type="text/javascript">
+<!--
+var form_name = "<?php echo $form_name; ?>";
+var format = 'us'; // eu or us
+var days = new Array(
+ '<?php echo $CI->lang->line('cal_su');?>', // Sunday, short name
+ '<?php echo $CI->lang->line('cal_mo');?>', // Monday, short name
+ '<?php echo $CI->lang->line('cal_tu');?>', // Tuesday, short name
+ '<?php echo $CI->lang->line('cal_wed');?>', // Wednesday, short name
+ '<?php echo $CI->lang->line('cal_thu');?>', // Thursday, short name
+ '<?php echo $CI->lang->line('cal_fri');?>', // Friday, short name
+ '<?php echo $CI->lang->line('cal_sat');?>' // Saturday, short name
+ );
+var months = new Array(
+ '<?php echo $CI->lang->line('cal_january');?>',
+ '<?php echo $CI->lang->line('cal_february');?>',
+ '<?php echo $CI->lang->line('cal_march');?>',
+ '<?php echo $CI->lang->line('cal_april');?>',
+ '<?php echo $CI->lang->line('cal_mayl');?>',
+ '<?php echo $CI->lang->line('cal_june');?>',
+ '<?php echo $CI->lang->line('cal_july');?>',
+ '<?php echo $CI->lang->line('cal_august');?>',
+ '<?php echo $CI->lang->line('cal_september');?>',
+ '<?php echo $CI->lang->line('cal_october');?>',
+ '<?php echo $CI->lang->line('cal_november');?>',
+ '<?php echo $CI->lang->line('cal_december');?>'
+ );
+var last_click = new Array();
+var current_month = '';
+var current_year = '';
+var last_date = '';
+
+function calendar(id, d, highlight, adjusted)
+{
+ if (adjusted == undefined)
+ {
+ var d = new Date(d * 1000);
+ }
+
+ this.id = id;
+ this.highlight = highlight;
+ this.date_obj = d;
+ this.write = build_calendar;
+ this.total_days = total_days;
+ this.month = d.getMonth();
+ this.date = d.getDate();
+ this.day = d.getDay();
+ this.year = d.getFullYear();
+ this.hours = d.getHours();
+ this.minutes = d.getMinutes();
+ this.seconds = d.getSeconds();
+ this.date_str = date_str;
+
+ if (highlight == false)
+ {
+ this.selected_date = '';
+ }
+ else
+ {
+ this.selected_date = this.year + '' + this.month + '' + this.date;
+ }
+
+ // Set the "selected date"
+ d.setDate(1);
+ this.firstDay = d.getDay();
+
+ //then reset the date object to the correct date
+ d.setDate(this.date);
+}
+
+// Build the body of the calendar
+function build_calendar()
+{
+ var str = '';
+
+ // Calendar Heading
+
+ str += '<div id="cal' + this.id + '">';
+ str += '<table class="calendar" cellspacing="0" cellpadding="0" border="0" >';
+ str += '<tr>';
+ str += '<td class="calnavleft" onClick="change_month(-1, \'' + this.id + '\')"><<<\/td>';
+ str += '<td colspan="5" class="calheading">' + months[this.month] + ' ' + this.year + '<\/td>';
+ str += '<td class="calnavright" onClick="change_month(1, \'' + this.id + '\')">>><\/td>';
+ str += '<\/tr>';
+
+ // Day Names
+
+ str += '<tr>';
+
+ for (i = 0; i < 7; i++)
+ {
+ str += '<td class="caldayheading">' + days[i] + '<\/td>';
+ }
+
+ str += '<\/tr>';
+
+ // Day Cells
+
+ str += '<tr>';
+
+ selDate = (last_date != '') ? last_date : this.date;
+
+ for (j = 0; j < 42; j++)
+ {
+ var displayNum = (j - this.firstDay + 1);
+
+ if (j < this.firstDay) // leading empty cells
+ {
+ str += '<td class="calblanktop"> <\/td>';
+ }
+ else if (displayNum == selDate && this.highlight == true) // Selected date
+ {
+ str += '<td id="' + this.id +'selected" class="caldayselected" onClick="set_date(this,\'' + this.id + '\')">' + displayNum + '<\/td>';
+ }
+ else if (displayNum > this.total_days())
+ {
+ str += '<td class="calblankbot"> <\/td>'; // trailing empty cells
+ }
+ else // Unselected days
+ {
+ str += '<td id="" class="caldaycells" onClick="set_date(this,\'' + this.id + '\'); return false;" onMouseOver="javascript:cell_highlight(this,\'' + displayNum + '\',\'' + this.id + '\');" onMouseOut="javascript:cell_reset(this,\'' + displayNum + '\',\'' + this.id + '\');" >' + displayNum + '<\/td>';
+ }
+
+ if (j % 7 == 6)
+ {
+ str += '<\/tr><tr>';
+ }
+ }
+
+ str += '<\/tr>';
+ str += '<\/table>';
+ str += '<\/div>';
+
+ return str;
+}
+
+// Total number of days in a month
+function total_days()
+{
+ switch(this.month)
+ {
+ case 1: // Check for leap year
+ if (( this.date_obj.getFullYear() % 4 == 0
+ && this.date_obj.getFullYear() % 100 != 0)
+ || this.date_obj.getFullYear() % 400 == 0)
+ return 29;
+ else
+ return 28;
+ case 3:
+ return 30;
+ case 5:
+ return 30;
+ case 8:
+ return 30;
+ case 10:
+ return 30
+ default:
+ return 31;
+ }
+}
+
+// Highlight Cell on Mouseover
+function cell_highlight(td, num, cal)
+{
+ cal = eval(cal);
+
+ if (last_click[cal.id] != num)
+ {
+ td.className = "caldaycellhover";
+ }
+}
+
+// Reset Cell on MouseOut
+function cell_reset(td, num, cal)
+{
+ cal = eval(cal);
+
+ if (last_click[cal.id] == num)
+ {
+ td.className = "caldayselected";
+ }
+ else
+ {
+ td.className = "caldaycells";
+ }
+}
+
+// Clear Field
+function clear_field(id)
+{
+ eval("document." + form_name + "." + id + ".value = ''");
+
+ document.getElementById(id + "selected").className = "caldaycells";
+ document.getElementById(id + "selected").id = "";
+
+ cal = eval(id);
+ cal.selected_date = '';
+}
+
+
+// Set date to specified time
+function set_to_time(id, raw)
+{
+ if (document.getElementById(id + "selected"))
+ {
+ document.getElementById(id + "selected").className = "caldaycells";
+ document.getElementById(id + "selected").id = "";
+ }
+
+ document.getElementById('cal' + id).innerHTML = '<div id="tempcal'+id+'"> <'+'/div>';
+
+ var nowDate = new Date();
+ nowDate.setTime = raw * 1000;
+
+ current_month = nowDate.getMonth();
+ current_year = nowDate.getFullYear();
+ current_date = nowDate.getDate();
+
+ oldcal = eval(id);
+ oldcal.selected_date = current_year + '' + current_month + '' + current_date;
+
+ cal = new calendar(id, nowDate, true, true);
+ cal.selected_date = current_year + '' + current_month + '' + current_date;
+
+ last_date = cal.date;
+
+ document.getElementById('tempcal'+id).innerHTML = cal.write();
+
+ insert_date(cal);
+}
+
+// Set date to what is in the field
+var lastDates = new Array();
+
+function update_calendar(id, dateValue)
+{
+ if (lastDates[id] == dateValue) return;
+
+ lastDates[id] = dateValue;
+
+ var fieldString = dateValue.replace(/\s+/g, ' ');
+
+ while (fieldString.substring(0,1) == ' ')
+ {
+ fieldString = fieldString.substring(1, fieldString.length);
+ }
+
+ var dateString = fieldString.split(' ');
+ var dateParts = dateString[0].split('-')
+
+ if (dateParts.length < 3) return;
+ var newYear = dateParts[0];
+ var newMonth = dateParts[1];
+ var newDay = dateParts[2];
+
+ if (isNaN(newDay) || newDay < 1 || (newDay.length != 1 && newDay.length != 2)) return;
+ if (isNaN(newYear) || newYear < 1 || newYear.length != 4) return;
+ if (isNaN(newMonth) || newMonth < 1 || (newMonth.length != 1 && newMonth.length != 2)) return;
+
+ if (newMonth > 12) newMonth = 12;
+
+ if (newDay > 28)
+ {
+ switch(newMonth - 1)
+ {
+ case 1: // Check for leap year
+ if ((newYear % 4 == 0 && newYear % 100 != 0) || newYear % 400 == 0)
+ {
+ if (newDay > 29) newDay = 29;
+ }
+ else
+ {
+ if (newDay > 28) newDay = 28;
+ }
+ case 3:
+ if (newDay > 30) newDay = 30;
+ case 5:
+ if (newDay > 30) newDay = 30;
+ case 8:
+ if (newDay > 30) newDay = 30;
+ case 10:
+ if (newDay > 30) newDay = 30;
+ default:
+ if (newDay > 31) newDay = 31;
+ }
+ }
+
+ if (document.getElementById(id + "selected"))
+ {
+ document.getElementById(id + "selected").className = "caldaycells";
+ document.getElementById(id + "selected").id = "";
+ }
+
+ document.getElementById('cal' + id).innerHTML = '<div id="tempcal'+id+'"> <'+'/div>';
+
+ var nowDate = new Date();
+ nowDate.setDate(newDay);
+ nowDate.setMonth(newMonth - 1);
+ nowDate.setYear(newYear);
+ nowDate.setHours(12);
+
+ current_month = nowDate.getMonth();
+ current_year = nowDate.getFullYear();
+
+ cal = new calendar(id, nowDate, true, true);
+ document.getElementById('tempcal'+id).innerHTML = cal.write();
+}
+
+// Set the date
+function set_date(td, cal)
+{
+
+ cal = eval(cal);
+
+ // If the user is clicking a cell that is already
+ // selected we'll de-select it and clear the form field
+
+ if (last_click[cal.id] == td.firstChild.nodeValue)
+ {
+ td.className = "caldaycells";
+ last_click[cal.id] = '';
+ remove_date(cal);
+ cal.selected_date = '';
+ return;
+ }
+
+ // Onward!
+ if (document.getElementById(cal.id + "selected"))
+ {
+ document.getElementById(cal.id + "selected").className = "caldaycells";
+ document.getElementById(cal.id + "selected").id = "";
+ }
+
+ td.className = "caldayselected";
+ td.id = cal.id + "selected";
+
+ cal.selected_date = cal.date_obj.getFullYear() + '' + cal.date_obj.getMonth() + '' + cal.date;
+ cal.date_obj.setDate(td.firstChild.nodeValue);
+ cal = new calendar(cal.id, cal.date_obj, true, true);
+ cal.selected_date = cal.date_obj.getFullYear() + '' + cal.date_obj.getMonth() + '' + cal.date;
+
+ last_date = cal.date;
+
+ //cal.date
+ last_click[cal.id] = cal.date;
+
+ // Insert the date into the form
+ insert_date(cal);
+}
+/*
+// Insert the date into the form field
+function insert_date(cal)
+{
+ cal = eval(cal);
+ fval = eval("document." + form_name + "." + cal.id);
+
+ if (fval.value == '')
+ {
+ fval.value = cal.date_str('y');
+ }
+ else
+ {
+ time = fval.value.substring(10);
+ new_date = cal.date_str('n') + time;
+ fval.value = new_date;
+ }
+}
+*/
+// Remove the date from the form field
+function remove_date(cal)
+{
+ cal = eval(cal);
+ fval = eval("document." + form_name + "." + cal.id);
+ fval.value = '';
+}
+
+// Change to a new month
+function change_month(mo, cal)
+{
+ cal = eval(cal);
+
+ if (current_month != '')
+ {
+ cal.date_obj.setMonth(current_month);
+ cal.date_obj.setYear(current_year);
+
+ current_month = '';
+ current_year = '';
+ }
+
+ var newMonth = cal.date_obj.getMonth() + mo;
+ var newDate = cal.date_obj.getDate();
+
+ if (newMonth == 12)
+ {
+ cal.date_obj.setYear(cal.date_obj.getFullYear() + 1)
+ newMonth = 0;
+ }
+ else if (newMonth == -1)
+ {
+ cal.date_obj.setYear(cal.date_obj.getFullYear() - 1)
+ newMonth = 11;
+ }
+
+ if (newDate > 28)
+ {
+ var newYear = cal.date_obj.getFullYear();
+
+ switch(newMonth)
+ {
+ case 1: // Check for leap year
+ if ((newYear % 4 == 0 && newYear % 100 != 0) || newYear % 400 == 0)
+ {
+ if (newDate > 29) newDate = 29;
+ }
+ else
+ {
+ if (newDate > 28) newDate = 28;
+ }
+ case 3:
+ if (newDate > 30) newDate = 30;
+ case 5:
+ if (newDate > 30) newDate = 30;
+ case 8:
+ if (newDate > 30) newDate = 30;
+ case 10:
+ if (newDate > 30) newDate = 30;
+ default:
+ if (newDate > 31) newDate = 31;
+ }
+ }
+
+ cal.date_obj.setDate(newDate);
+ cal.date_obj.setMonth(newMonth);
+ new_mdy = cal.date_obj.getFullYear() + '' + cal.date_obj.getMonth() + '' + cal.date;
+
+ highlight = (cal.selected_date == new_mdy) ? true : false;
+ cal = new calendar(cal.id, cal.date_obj, highlight, true);
+ document.getElementById('cal' + cal.id).innerHTML = cal.write();
+}
+
+// Finalize the date string
+function date_str(time)
+{
+ var month = this.month + 1;
+ if (month < 10)
+ month = '0' + month;
+
+ var day = (this.date < 10) ? '0' + this.date : this.date;
+ var minutes = (this.minutes < 10) ? '0' + this.minutes : this.minutes;
+
+ if (format == 'us')
+ {
+ var hours = (this.hours > 12) ? this.hours - 12 : this.hours;
+ var ampm = (this.hours > 11) ? 'PM' : 'AM'
+ }
+ else
+ {
+ var hours = this.hours;
+ var ampm = '';
+ }
+
+ if (time == 'y')
+ {
+ return this.year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ' ' + ampm;
+ }
+ else
+ {
+ return this.year + '-' + month + '-' + day;
+ }
+}
+
+//-->
+</script>
+<?php
+
+$r = ob_get_contents();
+ob_end_clean();
+return $r;
+}
+
+
+function js_calendar_write($field_id, $time = '', $highlight = TRUE)
+{
+ if ($time == '')
+ $time = time();
+
+ return
+ '<script type="text/javascript">
+ var '.$field_id.' = new calendar("'.$field_id.'", '.$time.', '.(($highlight == TRUE) ? 'true' : 'false').');
+ document.write('.$field_id.'.write());
+ </script>';
+}
+
+
+/* End of file js_calendar_pi.php */
/* Location: ./system/plugins/js_calendar_pi.php */
\ No newline at end of file
-// Contributors \r
-// Ilkka Huotari at http://www.editsite.net\r
-// Mathieu 'p01' HENRI at http://www.p01.org/\r
-// http://seky.nahory.net/2005/04/rounded-corners/\r
-// Steven Wittens at http://www.acko.net/anti-aliased-nifty-corners\r
-// Original Nifty Corners by Alessandro Fulciniti at http://pro.html.it/esempio/nifty/\r
-function NiftyCheck() {\r
- if(!document.getElementById || !document.createElement) {\r
- return false;\r
- }\r
- var b = navigator.userAgent.toLowerCase();\r
- if (b.indexOf("msie 5") > 0 && b.indexOf("opera") == -1) {\r
- return false;\r
- }\r
- return true;\r
-}\r
-\r
-function Rounded(className, sizex, sizey, sizex_b, sizey_b) {\r
- var bk;\r
- if (!NiftyCheck()) return;\r
- if (typeof(sizex_b) == 'undefined')\r
- sizex_b = sizex;\r
- if (typeof(sizey_b) == 'undefined')\r
- sizey_b = sizey;\r
- var v = getElements(className);\r
- var l = v.length;\r
- for (var i = 0; i < l; i++) {\r
- color = get_current_style(v[i],"background-color","transparent");\r
- bk = get_current_style(v[i].parentNode,"background-color","transparent");\r
- AddRounded(v[i], bk, color, sizex, sizey, true);\r
- AddRounded(v[i], bk, color, sizex_b, sizey_b, false);\r
- }\r
-}\r
-\r
-Math.sqr = function (x) {\r
- return x*x;\r
-};\r
-\r
-function Blend(a, b, alpha) {\r
-\r
- var ca = Array(\r
- parseInt('0x' + a.substring(1, 3)), \r
- parseInt('0x' + a.substring(3, 5)), \r
- parseInt('0x' + a.substring(5, 7))\r
- );\r
- var cb = Array(\r
- parseInt('0x' + b.substring(1, 3)), \r
- parseInt('0x' + b.substring(3, 5)), \r
- parseInt('0x' + b.substring(5, 7))\r
- );\r
- return '#' + ('0'+Math.round(ca[0] + (cb[0] - ca[0])*alpha).toString(16)).slice(-2).toString(16)\r
- + ('0'+Math.round(ca[1] + (cb[1] - ca[1])*alpha).toString(16)).slice(-2).toString(16)\r
- + ('0'+Math.round(ca[2] + (cb[2] - ca[2])*alpha).toString(16)).slice(-2).toString(16);\r
-\r
- return '#' + ('0'+Math.round(ca[0] + (cb[0] - ca[0])*alpha).toString(16)).slice(-2).toString(16)\r
- + ('0'+Math.round(ca[1] + (cb[1] - ca[1])*alpha).toString(16)).slice(-2).toString(16)\r
- + ('0'+Math.round(ca[2] + (cb[2] - ca[2])*alpha).toString(16)).slice(-2).toString(16);\r
-}\r
-\r
-function AddRounded(el, bk, color, sizex, sizey, top) {\r
- if (!sizex && !sizey)\r
- return;\r
- var i, j;\r
- var d = document.createElement("div");\r
- d.style.backgroundColor = bk;\r
- var lastarc = 0;\r
- for (i = 1; i <= sizey; i++) {\r
- var coverage, arc2, arc3;\r
- // Find intersection of arc with bottom of pixel row\r
- arc = Math.sqrt(1.0 - Math.sqr(1.0 - i / sizey)) * sizex;\r
- // Calculate how many pixels are bg, fg and blended.\r
- var n_bg = sizex - Math.ceil(arc);\r
- var n_fg = Math.floor(lastarc);\r
- var n_aa = sizex - n_bg - n_fg;\r
- // Create pixel row wrapper\r
- var x = document.createElement("div");\r
- var y = d;\r
- x.style.margin = "0px " + n_bg + "px";\r
- x.style.height='1px';\r
- x.style.overflow='hidden';\r
- // Make a wrapper per anti-aliased pixel (at least one)\r
- for (j = 1; j <= n_aa; j++) {\r
- // Calculate coverage per pixel\r
- // (approximates circle by a line within the pixel)\r
- if (j == 1) {\r
- if (j == n_aa) {\r
- // Single pixel\r
- coverage = ((arc + lastarc) * .5) - n_fg;\r
- }\r
- else {\r
- // First in a run\r
- arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;\r
- coverage = (arc2 - (sizey - i)) * (arc - n_fg - n_aa + 1) * .5;\r
- // Coverage is incorrect. Why?\r
- coverage = 0;\r
- }\r
- }\r
- else if (j == n_aa) {\r
- // Last in a run\r
- arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;\r
- coverage = 1.0 - (1.0 - (arc2 - (sizey - i))) * (1.0 - (lastarc - n_fg)) * .5;\r
- }\r
- else {\r
- // Middle of a run\r
- arc3 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j) / sizex)) * sizey;\r
- arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;\r
- coverage = ((arc2 + arc3) * .5) - (sizey - i);\r
- }\r
- \r
- x.style.backgroundColor = Blend(bk, color, coverage);\r
- if (top)\r
- y.appendChild(x);\r
- else\r
- y.insertBefore(x, y.firstChild);\r
- y = x;\r
- var x = document.createElement("div");\r
- x.style.height='1px';\r
- x.style.overflow='hidden';\r
- x.style.margin = "0px 1px";\r
- }\r
- x.style.backgroundColor = color;\r
- if (top)\r
- y.appendChild(x);\r
- else\r
- y.insertBefore(x, y.firstChild);\r
- lastarc = arc;\r
- }\r
- if (top)\r
- el.insertBefore(d, el.firstChild);\r
- else\r
- el.appendChild(d);\r
-}\r
-\r
-function getElements(className) {\r
- var elements = [];\r
- var el = document.getElementsByTagName('DIV'); \r
- var regexp=new RegExp("\\b"+className+"\\b");\r
- for (var i = 0; i < el.length; i++) \r
- {\r
- if (regexp.test(el[i].className)) \r
- elements.push(el[i]);\r
- }\r
- return elements;\r
-}\r
-\r
-function get_current_style(element,property,not_accepted)\r
-{\r
- var ee,i,val,apr;\r
- try\r
- {\r
- var cs=document.defaultView.getComputedStyle(element,'');\r
- val=cs.getPropertyValue(property);\r
- }\r
- catch(ee)\r
- {\r
- if(element.currentStyle)\r
- {\r
- apr=property.split("-");\r
- for(i=1;i<apr.length;i++) apr[i]=apr[i].toUpperCase();\r
- apr=apr.join("");\r
- val=element.currentStyle.getAttribute(apr);\r
- }\r
- }\r
- if((val.indexOf("rgba") > -1 || val==not_accepted) && element.parentNode)\r
- {\r
- if(element.parentNode != document) \r
- val=get_current_style(element.parentNode,property,not_accepted);\r
- else\r
- val = '#FFFFFF';\r
- }\r
- if (val.indexOf("rgb") > -1 && val.indexOf("rgba") == -1)\r
- val = rgb2hex(val);\r
- if (val.length == 4)\r
- val = '#'+val.substring(1,1)+val.substring(1,1)+val.substring(2,1)+val.substring(2,1)+val.substring(3,1)+val.substring(3,1);\r
- return val;\r
-}\r
-\r
-function rgb2hex(value)\r
-{\r
- var x = 255;\r
- var hex = '';\r
- var i;\r
- var regexp=/([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/;\r
- var array=regexp.exec(value);\r
- for(i=1;i<4;i++) hex += ('0'+parseInt(array[i]).toString(16)).slice(-2);\r
- return '#'+hex;\r
-}\r
+// Contributors
+// Ilkka Huotari at http://www.editsite.net
+// Mathieu 'p01' HENRI at http://www.p01.org/
+// http://seky.nahory.net/2005/04/rounded-corners/
+// Steven Wittens at http://www.acko.net/anti-aliased-nifty-corners
+// Original Nifty Corners by Alessandro Fulciniti at http://pro.html.it/esempio/nifty/
+function NiftyCheck() {
+ if(!document.getElementById || !document.createElement) {
+ return false;
+ }
+ var b = navigator.userAgent.toLowerCase();
+ if (b.indexOf("msie 5") > 0 && b.indexOf("opera") == -1) {
+ return false;
+ }
+ return true;
+}
+
+function Rounded(className, sizex, sizey, sizex_b, sizey_b) {
+ var bk;
+ if (!NiftyCheck()) return;
+ if (typeof(sizex_b) == 'undefined')
+ sizex_b = sizex;
+ if (typeof(sizey_b) == 'undefined')
+ sizey_b = sizey;
+ var v = getElements(className);
+ var l = v.length;
+ for (var i = 0; i < l; i++) {
+ color = get_current_style(v[i],"background-color","transparent");
+ bk = get_current_style(v[i].parentNode,"background-color","transparent");
+ AddRounded(v[i], bk, color, sizex, sizey, true);
+ AddRounded(v[i], bk, color, sizex_b, sizey_b, false);
+ }
+}
+
+Math.sqr = function (x) {
+ return x*x;
+};
+
+function Blend(a, b, alpha) {
+
+ var ca = Array(
+ parseInt('0x' + a.substring(1, 3)),
+ parseInt('0x' + a.substring(3, 5)),
+ parseInt('0x' + a.substring(5, 7))
+ );
+ var cb = Array(
+ parseInt('0x' + b.substring(1, 3)),
+ parseInt('0x' + b.substring(3, 5)),
+ parseInt('0x' + b.substring(5, 7))
+ );
+ return '#' + ('0'+Math.round(ca[0] + (cb[0] - ca[0])*alpha).toString(16)).slice(-2).toString(16)
+ + ('0'+Math.round(ca[1] + (cb[1] - ca[1])*alpha).toString(16)).slice(-2).toString(16)
+ + ('0'+Math.round(ca[2] + (cb[2] - ca[2])*alpha).toString(16)).slice(-2).toString(16);
+
+ return '#' + ('0'+Math.round(ca[0] + (cb[0] - ca[0])*alpha).toString(16)).slice(-2).toString(16)
+ + ('0'+Math.round(ca[1] + (cb[1] - ca[1])*alpha).toString(16)).slice(-2).toString(16)
+ + ('0'+Math.round(ca[2] + (cb[2] - ca[2])*alpha).toString(16)).slice(-2).toString(16);
+}
+
+function AddRounded(el, bk, color, sizex, sizey, top) {
+ if (!sizex && !sizey)
+ return;
+ var i, j;
+ var d = document.createElement("div");
+ d.style.backgroundColor = bk;
+ var lastarc = 0;
+ for (i = 1; i <= sizey; i++) {
+ var coverage, arc2, arc3;
+ // Find intersection of arc with bottom of pixel row
+ arc = Math.sqrt(1.0 - Math.sqr(1.0 - i / sizey)) * sizex;
+ // Calculate how many pixels are bg, fg and blended.
+ var n_bg = sizex - Math.ceil(arc);
+ var n_fg = Math.floor(lastarc);
+ var n_aa = sizex - n_bg - n_fg;
+ // Create pixel row wrapper
+ var x = document.createElement("div");
+ var y = d;
+ x.style.margin = "0px " + n_bg + "px";
+ x.style.height='1px';
+ x.style.overflow='hidden';
+ // Make a wrapper per anti-aliased pixel (at least one)
+ for (j = 1; j <= n_aa; j++) {
+ // Calculate coverage per pixel
+ // (approximates circle by a line within the pixel)
+ if (j == 1) {
+ if (j == n_aa) {
+ // Single pixel
+ coverage = ((arc + lastarc) * .5) - n_fg;
+ }
+ else {
+ // First in a run
+ arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;
+ coverage = (arc2 - (sizey - i)) * (arc - n_fg - n_aa + 1) * .5;
+ // Coverage is incorrect. Why?
+ coverage = 0;
+ }
+ }
+ else if (j == n_aa) {
+ // Last in a run
+ arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;
+ coverage = 1.0 - (1.0 - (arc2 - (sizey - i))) * (1.0 - (lastarc - n_fg)) * .5;
+ }
+ else {
+ // Middle of a run
+ arc3 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j) / sizex)) * sizey;
+ arc2 = Math.sqrt(1.0 - Math.sqr((sizex - n_bg - j + 1) / sizex)) * sizey;
+ coverage = ((arc2 + arc3) * .5) - (sizey - i);
+ }
+
+ x.style.backgroundColor = Blend(bk, color, coverage);
+ if (top)
+ y.appendChild(x);
+ else
+ y.insertBefore(x, y.firstChild);
+ y = x;
+ var x = document.createElement("div");
+ x.style.height='1px';
+ x.style.overflow='hidden';
+ x.style.margin = "0px 1px";
+ }
+ x.style.backgroundColor = color;
+ if (top)
+ y.appendChild(x);
+ else
+ y.insertBefore(x, y.firstChild);
+ lastarc = arc;
+ }
+ if (top)
+ el.insertBefore(d, el.firstChild);
+ else
+ el.appendChild(d);
+}
+
+function getElements(className) {
+ var elements = [];
+ var el = document.getElementsByTagName('DIV');
+ var regexp=new RegExp("\\b"+className+"\\b");
+ for (var i = 0; i < el.length; i++)
+ {
+ if (regexp.test(el[i].className))
+ elements.push(el[i]);
+ }
+ return elements;
+}
+
+function get_current_style(element,property,not_accepted)
+{
+ var ee,i,val,apr;
+ try
+ {
+ var cs=document.defaultView.getComputedStyle(element,'');
+ val=cs.getPropertyValue(property);
+ }
+ catch(ee)
+ {
+ if(element.currentStyle)
+ {
+ apr=property.split("-");
+ for(i=1;i<apr.length;i++) apr[i]=apr[i].toUpperCase();
+ apr=apr.join("");
+ val=element.currentStyle.getAttribute(apr);
+ }
+ }
+ if((val.indexOf("rgba") > -1 || val==not_accepted) && element.parentNode)
+ {
+ if(element.parentNode != document)
+ val=get_current_style(element.parentNode,property,not_accepted);
+ else
+ val = '#FFFFFF';
+ }
+ if (val.indexOf("rgb") > -1 && val.indexOf("rgba") == -1)
+ val = rgb2hex(val);
+ if (val.length == 4)
+ val = '#'+val.substring(1,1)+val.substring(1,1)+val.substring(2,1)+val.substring(2,1)+val.substring(3,1)+val.substring(3,1);
+ return val;
+}
+
+function rgb2hex(value)
+{
+ var x = 255;
+ var hex = '';
+ var i;
+ var regexp=/([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/;
+ var array=regexp.exec(value);
+ for(i=1;i<4;i++) hex += ('0'+parseInt(array[i]).toString(16)).slice(-2);
+ return '#'+hex;
+}
-<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package CodeIgniter\r
- * @author ExpressionEngine Dev Team\r
- * @copyright Copyright (c) 2008, EllisLab, Inc.\r
- * @license http://codeigniter.com/user_guide/license.html\r
- * @link http://codeigniter.com\r
- * @since Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Scaffolding Class\r
- *\r
- * Provides the Scaffolding framework\r
- *\r
- * @package CodeIgniter\r
- * @subpackage Scaffolding\r
- * @author ExpressionEngine Dev Team\r
- * @link http://codeigniter.com/user_guide/general/scaffolding.html\r
- */\r
-class Scaffolding {\r
-\r
- var $CI;\r
- var $current_table;\r
- var $base_url = '';\r
- var $lang = array();\r
-\r
- function Scaffolding($db_table)\r
- {\r
- $this->CI =& get_instance();\r
- \r
- $this->CI->load->database("", FALSE, TRUE); \r
- $this->CI->load->library('pagination');\r
- \r
- // Turn off caching\r
- $this->CI->db->cache_off();\r
- \r
- /**\r
- * Set the current table name\r
- * This is done when initializing scaffolding:\r
- * $this->load->scaffolding('table_name')\r
- *\r
- */\r
- $this->current_table = $db_table;\r
- \r
- /**\r
- * Set the path to the "view" files\r
- * We'll manually override the "view" path so that\r
- * the load->view function knows where to look.\r
- */\r
- \r
- $this->CI->load->_ci_view_path = BASEPATH.'scaffolding/views/';\r
-\r
- // Set the base URL\r
- $this->base_url = $this->CI->config->site_url().'/'.$this->CI->uri->segment(1).$this->CI->uri->slash_segment(2, 'both');\r
- $this->base_uri = $this->CI->uri->segment(1).$this->CI->uri->slash_segment(2, 'leading');\r
-\r
- // Set a few globals\r
- $data = array(\r
- 'image_url' => $this->CI->config->system_url().'scaffolding/images/',\r
- 'base_uri' => $this->base_uri,\r
- 'base_url' => $this->base_url,\r
- 'title' => $this->current_table\r
- );\r
- \r
- $this->CI->load->vars($data);\r
- \r
- // Load the language file and create variables\r
- $this->lang = $this->CI->load->scaffold_language('scaffolding', '', TRUE);\r
- $this->CI->load->vars($this->lang);\r
- \r
- // Load the helper files we plan to use\r
- $this->CI->load->helper(array('url', 'form'));\r
- \r
- \r
- log_message('debug', 'Scaffolding Class Initialized');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * "Add" Page\r
- *\r
- * Shows a form representing the currently selected DB\r
- * so that data can be inserted\r
- *\r
- * @access public\r
- * @return string the HTML "add" page\r
- */\r
- function add()\r
- { \r
- $data = array(\r
- 'title' => ( ! isset($this->lang['scaff_add'])) ? 'Add Data' : $this->lang['scaff_add'],\r
- 'fields' => $this->CI->db->field_data($this->current_table),\r
- 'action' => $this->base_uri.'/insert'\r
- );\r
- \r
- $this->CI->load->view('add', $data);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Insert the data\r
- *\r
- * @access public\r
- * @return void redirects to the view page\r
- */\r
- function insert()\r
- { \r
- if ($this->CI->db->insert($this->current_table, $_POST) === FALSE)\r
- {\r
- $this->add();\r
- }\r
- else\r
- {\r
- redirect($this->base_uri.'/view/');\r
- }\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * "View" Page\r
- *\r
- * Shows a table containing the data in the currently\r
- * selected DB\r
- *\r
- * @access public\r
- * @return string the HTML "view" page\r
- */\r
- function view()\r
- {\r
- // Fetch the total number of DB rows\r
- $total_rows = $this->CI->db->count_all($this->current_table);\r
- \r
- if ($total_rows < 1)\r
- {\r
- return $this->CI->load->view('no_data');\r
- }\r
- \r
- // Set the query limit/offset\r
- $per_page = 20;\r
- $offset = $this->CI->uri->segment(4, 0);\r
- \r
- // Run the query\r
- $query = $this->CI->db->get($this->current_table, $per_page, $offset);\r
-\r
- // Now let's get the field names \r
- $fields = $this->CI->db->list_fields($this->current_table);\r
- \r
- // We assume that the column in the first position is the primary field.\r
- $primary = current($fields);\r
-\r
- // Pagination!\r
- $this->CI->pagination->initialize(\r
- array(\r
- 'base_url' => $this->base_url.'/view',\r
- 'total_rows' => $total_rows,\r
- 'per_page' => $per_page,\r
- 'uri_segment' => 4,\r
- 'full_tag_open' => '<p>',\r
- 'full_tag_close' => '</p>'\r
- )\r
- ); \r
-\r
- $data = array(\r
- 'title' => ( ! isset($this->lang['scaff_view'])) ? 'View Data' : $this->lang['scaff_view'],\r
- 'query' => $query,\r
- 'fields' => $fields,\r
- 'primary' => $primary,\r
- 'paginate' => $this->CI->pagination->create_links()\r
- );\r
- \r
- $this->CI->load->view('view', $data);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * "Edit" Page\r
- *\r
- * Shows a form representing the currently selected DB\r
- * so that data can be edited\r
- *\r
- * @access public\r
- * @return string the HTML "edit" page\r
- */\r
- function edit()\r
- {\r
- if (FALSE === ($id = $this->CI->uri->segment(4)))\r
- {\r
- return $this->view();\r
- }\r
-\r
- // Fetch the primary field name\r
- $primary = $this->CI->db->primary($this->current_table); \r
-\r
- // Run the query\r
- $query = $this->CI->db->get_where($this->current_table, array($primary => $id));\r
-\r
- $data = array(\r
- 'title' => ( ! isset($this->lang['scaff_edit'])) ? 'Edit Data' : $this->lang['scaff_edit'],\r
- 'fields' => $query->field_data(),\r
- 'query' => $query->row(),\r
- 'action' => $this->base_uri.'/update/'.$this->CI->uri->segment(4)\r
- );\r
- \r
- $this->CI->load->view('edit', $data);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Update\r
- *\r
- * @access public\r
- * @return void redirects to the view page\r
- */\r
- function update()\r
- { \r
- // Fetch the primary key\r
- $primary = $this->CI->db->primary($this->current_table); \r
-\r
- // Now do the query\r
- $this->CI->db->update($this->current_table, $_POST, array($primary => $this->CI->uri->segment(4)));\r
- \r
- redirect($this->base_uri.'/view/');\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Delete Confirmation\r
- *\r
- * @access public\r
- * @return string the HTML "delete confirm" page\r
- */\r
- function delete()\r
- {\r
- if ( ! isset($this->lang['scaff_del_confirm']))\r
- {\r
- $message = 'Are you sure you want to delete the following row: '.$this->CI->uri->segment(4);\r
- }\r
- else\r
- {\r
- $message = $this->lang['scaff_del_confirm'].' '.$this->CI->uri->segment(4);\r
- }\r
- \r
- $data = array(\r
- 'title' => ( ! isset($this->lang['scaff_delete'])) ? 'Delete Data' : $this->lang['scaff_delete'],\r
- 'message' => $message,\r
- 'no' => anchor(array($this->base_uri, 'view'), ( ! isset($this->lang['scaff_no'])) ? 'No' : $this->lang['scaff_no']),\r
- 'yes' => anchor(array($this->base_uri, 'do_delete', $this->CI->uri->segment(4)), ( ! isset($this->lang['scaff_yes'])) ? 'Yes' : $this->lang['scaff_yes'])\r
- );\r
- \r
- $this->CI->load->view('delete', $data);\r
- }\r
- \r
- // --------------------------------------------------------------------\r
- \r
- /**\r
- * Delete\r
- *\r
- * @access public\r
- * @return void redirects to the view page\r
- */\r
- function do_delete()\r
- { \r
- // Fetch the primary key\r
- $primary = $this->CI->db->primary($this->current_table); \r
-\r
- // Now do the query\r
- $this->CI->db->where($primary, $this->CI->uri->segment(4));\r
- $this->CI->db->delete($this->current_table);\r
-\r
- header("Refresh:0;url=".site_url(array($this->base_uri, 'view')));\r
- exit;\r
- }\r
-\r
-}\r
-\r
-/* End of file Scaffolding.php */\r
+<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package CodeIgniter
+ * @author ExpressionEngine Dev Team
+ * @copyright Copyright (c) 2008, EllisLab, Inc.
+ * @license http://codeigniter.com/user_guide/license.html
+ * @link http://codeigniter.com
+ * @since Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Scaffolding Class
+ *
+ * Provides the Scaffolding framework
+ *
+ * @package CodeIgniter
+ * @subpackage Scaffolding
+ * @author ExpressionEngine Dev Team
+ * @link http://codeigniter.com/user_guide/general/scaffolding.html
+ */
+class Scaffolding {
+
+ var $CI;
+ var $current_table;
+ var $base_url = '';
+ var $lang = array();
+
+ function Scaffolding($db_table)
+ {
+ $this->CI =& get_instance();
+
+ $this->CI->load->database("", FALSE, TRUE);
+ $this->CI->load->library('pagination');
+
+ // Turn off caching
+ $this->CI->db->cache_off();
+
+ /**
+ * Set the current table name
+ * This is done when initializing scaffolding:
+ * $this->load->scaffolding('table_name')
+ *
+ */
+ $this->current_table = $db_table;
+
+ /**
+ * Set the path to the "view" files
+ * We'll manually override the "view" path so that
+ * the load->view function knows where to look.
+ */
+
+ $this->CI->load->_ci_view_path = BASEPATH.'scaffolding/views/';
+
+ // Set the base URL
+ $this->base_url = $this->CI->config->site_url().'/'.$this->CI->uri->segment(1).$this->CI->uri->slash_segment(2, 'both');
+ $this->base_uri = $this->CI->uri->segment(1).$this->CI->uri->slash_segment(2, 'leading');
+
+ // Set a few globals
+ $data = array(
+ 'image_url' => $this->CI->config->system_url().'scaffolding/images/',
+ 'base_uri' => $this->base_uri,
+ 'base_url' => $this->base_url,
+ 'title' => $this->current_table
+ );
+
+ $this->CI->load->vars($data);
+
+ // Load the language file and create variables
+ $this->lang = $this->CI->load->scaffold_language('scaffolding', '', TRUE);
+ $this->CI->load->vars($this->lang);
+
+ // Load the helper files we plan to use
+ $this->CI->load->helper(array('url', 'form'));
+
+
+ log_message('debug', 'Scaffolding Class Initialized');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * "Add" Page
+ *
+ * Shows a form representing the currently selected DB
+ * so that data can be inserted
+ *
+ * @access public
+ * @return string the HTML "add" page
+ */
+ function add()
+ {
+ $data = array(
+ 'title' => ( ! isset($this->lang['scaff_add'])) ? 'Add Data' : $this->lang['scaff_add'],
+ 'fields' => $this->CI->db->field_data($this->current_table),
+ 'action' => $this->base_uri.'/insert'
+ );
+
+ $this->CI->load->view('add', $data);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Insert the data
+ *
+ * @access public
+ * @return void redirects to the view page
+ */
+ function insert()
+ {
+ if ($this->CI->db->insert($this->current_table, $_POST) === FALSE)
+ {
+ $this->add();
+ }
+ else
+ {
+ redirect($this->base_uri.'/view/');
+ }
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * "View" Page
+ *
+ * Shows a table containing the data in the currently
+ * selected DB
+ *
+ * @access public
+ * @return string the HTML "view" page
+ */
+ function view()
+ {
+ // Fetch the total number of DB rows
+ $total_rows = $this->CI->db->count_all($this->current_table);
+
+ if ($total_rows < 1)
+ {
+ return $this->CI->load->view('no_data');
+ }
+
+ // Set the query limit/offset
+ $per_page = 20;
+ $offset = $this->CI->uri->segment(4, 0);
+
+ // Run the query
+ $query = $this->CI->db->get($this->current_table, $per_page, $offset);
+
+ // Now let's get the field names
+ $fields = $this->CI->db->list_fields($this->current_table);
+
+ // We assume that the column in the first position is the primary field.
+ $primary = current($fields);
+
+ // Pagination!
+ $this->CI->pagination->initialize(
+ array(
+ 'base_url' => $this->base_url.'/view',
+ 'total_rows' => $total_rows,
+ 'per_page' => $per_page,
+ 'uri_segment' => 4,
+ 'full_tag_open' => '<p>',
+ 'full_tag_close' => '</p>'
+ )
+ );
+
+ $data = array(
+ 'title' => ( ! isset($this->lang['scaff_view'])) ? 'View Data' : $this->lang['scaff_view'],
+ 'query' => $query,
+ 'fields' => $fields,
+ 'primary' => $primary,
+ 'paginate' => $this->CI->pagination->create_links()
+ );
+
+ $this->CI->load->view('view', $data);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * "Edit" Page
+ *
+ * Shows a form representing the currently selected DB
+ * so that data can be edited
+ *
+ * @access public
+ * @return string the HTML "edit" page
+ */
+ function edit()
+ {
+ if (FALSE === ($id = $this->CI->uri->segment(4)))
+ {
+ return $this->view();
+ }
+
+ // Fetch the primary field name
+ $primary = $this->CI->db->primary($this->current_table);
+
+ // Run the query
+ $query = $this->CI->db->get_where($this->current_table, array($primary => $id));
+
+ $data = array(
+ 'title' => ( ! isset($this->lang['scaff_edit'])) ? 'Edit Data' : $this->lang['scaff_edit'],
+ 'fields' => $query->field_data(),
+ 'query' => $query->row(),
+ 'action' => $this->base_uri.'/update/'.$this->CI->uri->segment(4)
+ );
+
+ $this->CI->load->view('edit', $data);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Update
+ *
+ * @access public
+ * @return void redirects to the view page
+ */
+ function update()
+ {
+ // Fetch the primary key
+ $primary = $this->CI->db->primary($this->current_table);
+
+ // Now do the query
+ $this->CI->db->update($this->current_table, $_POST, array($primary => $this->CI->uri->segment(4)));
+
+ redirect($this->base_uri.'/view/');
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete Confirmation
+ *
+ * @access public
+ * @return string the HTML "delete confirm" page
+ */
+ function delete()
+ {
+ if ( ! isset($this->lang['scaff_del_confirm']))
+ {
+ $message = 'Are you sure you want to delete the following row: '.$this->CI->uri->segment(4);
+ }
+ else
+ {
+ $message = $this->lang['scaff_del_confirm'].' '.$this->CI->uri->segment(4);
+ }
+
+ $data = array(
+ 'title' => ( ! isset($this->lang['scaff_delete'])) ? 'Delete Data' : $this->lang['scaff_delete'],
+ 'message' => $message,
+ 'no' => anchor(array($this->base_uri, 'view'), ( ! isset($this->lang['scaff_no'])) ? 'No' : $this->lang['scaff_no']),
+ 'yes' => anchor(array($this->base_uri, 'do_delete', $this->CI->uri->segment(4)), ( ! isset($this->lang['scaff_yes'])) ? 'Yes' : $this->lang['scaff_yes'])
+ );
+
+ $this->CI->load->view('delete', $data);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Delete
+ *
+ * @access public
+ * @return void redirects to the view page
+ */
+ function do_delete()
+ {
+ // Fetch the primary key
+ $primary = $this->CI->db->primary($this->current_table);
+
+ // Now do the query
+ $this->CI->db->where($primary, $this->CI->uri->segment(4));
+ $this->CI->db->delete($this->current_table);
+
+ header("Refresh:0;url=".site_url(array($this->base_uri, 'view')));
+ exit;
+ }
+
+}
+
+/* End of file Scaffolding.php */
/* Location: ./system/scaffolding/Scaffolding.php */
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-\r
-</div>\r
-\r
-<div id="footer">\r
-<p><a href="http://codeigniter.com/">CodeIgniter</a>, by <a href="http://www.EllisLab.com">EllisLab</a> - Version <?php echo CI_VERSION ?></p>\r
-<p>Page rendered in {elapsed_time}</p>\r
-</div>\r
-\r
-</body>\r
+
+</div>
+
+<div id="footer">
+<p><a href="http://codeigniter.com/">CodeIgniter</a>, by <a href="http://www.EllisLab.com">EllisLab</a> - Version <?php echo CI_VERSION ?></p>
+<p>Page rendered in {elapsed_time}</p>
+</div>
+
+</body>
</html>
\ No newline at end of file
-<html>\r
-<head>\r
- <title>403 Forbidden</title>\r
-</head>\r
-<body>\r
-\r
-<p>Directory access is forbidden.</p>\r
-\r
-</body>\r
+<html>
+<head>
+ <title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
</html>
\ No newline at end of file
-body {\r
- margin: 0;\r
- padding: 0;\r
- font-family: Lucida Grande, Verdana, Geneva, Sans-serif;\r
- font-size: 11px;\r
- color: #4F5155;\r
- background: #fff url(<?php echo $image_url; ?>background.jpg) repeat-x left top;\r
-}\r
-\r
-a {\r
- color: #8B0D00;\r
- background-color: transparent;\r
- text-decoration: none;\r
- font-weight: bold;\r
-}\r
-\r
-a:visited {\r
- color: #8B0D00;\r
- background-color: transparent;\r
- text-decoration: none;\r
-}\r
-\r
-a:hover {\r
- color: #000;\r
- text-decoration: none;\r
- background-color: transparent;\r
-}\r
-\r
-\r
-#header {\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-#header_left {\r
- background-color: transparent;\r
- float: left;\r
- padding: 21px 0 0 32px;\r
- margin: 0\r
-}\r
-\r
-#header_right {\r
- background-color: transparent;\r
- float: right;\r
- text-align: right;\r
- padding: 35px 50px 20px 0;\r
- margin: 0\r
-}\r
-\r
-#footer {\r
- margin: 20px 0 15px 0;\r
- padding: 0;\r
-}\r
-\r
-#footer p {\r
- font-size: 10px;\r
- color: #999;\r
- text-align: center;\r
-}\r
-\r
-#outer {\r
- margin: 30px 40px 0 40px;\r
-}\r
-\r
-img {\r
- padding:0;\r
- border: 0;\r
- margin: 0;\r
-}\r
-\r
-.nopad {\r
- padding:0;\r
- border: 0;\r
- margin: 0;\r
-}\r
-\r
-table {\r
- background-color: #efefef;\r
-}\r
-\r
-th {\r
- background-color: #eee;\r
- font-weight: bold;\r
- padding: 6px;\r
- text-align: left;\r
-}\r
-\r
-td {\r
- background-color: #fff;\r
- padding: 6px;\r
-}\r
-\r
-\r
-form {\r
- margin: 0;\r
- padding: 0;\r
-}\r
-\r
-.input {\r
- font-family: Lucida Grande, Verdana, Geneva, Sans-serif;\r
- font-size: 11px;\r
- width: 600px;\r
- color: #333;\r
- border: 1px solid #B3B4BD;\r
- font-size: 11px;\r
- height: 2em;\r
- padding: 0;\r
- margin: 0;\r
-}\r
-\r
-.textarea {\r
- font-family: Lucida Grande, Verdana, Geneva, Sans-serif;\r
- font-size: 12px;\r
- width: 600px;\r
- color: #333;\r
- border: 1px solid #B3B4BD;\r
- padding: 0;\r
- margin: 0;\r
-}\r
-\r
-.select {\r
- background-color: #fff;\r
- font-size: 11px;\r
- font-weight: normal;\r
- color: #333;\r
- padding: 0;\r
- margin: 0 0 3px 0;\r
-}\r
-\r
-.checkbox {\r
- background-color: transparent;\r
- padding: 0;\r
- border: 0;\r
-}\r
-\r
-.submit {\r
- background-color: #8B0D00;\r
- color: #FFF;\r
- font-weight: normal;\r
- border: 1px solid #000;\r
- margin: 6px 0 0 0;\r
- padding: 1px 5px 1px 5px;\r
-}\r
+body {
+ margin: 0;
+ padding: 0;
+ font-family: Lucida Grande, Verdana, Geneva, Sans-serif;
+ font-size: 11px;
+ color: #4F5155;
+ background: #fff url(<?php echo $image_url; ?>background.jpg) repeat-x left top;
+}
+
+a {
+ color: #8B0D00;
+ background-color: transparent;
+ text-decoration: none;
+ font-weight: bold;
+}
+
+a:visited {
+ color: #8B0D00;
+ background-color: transparent;
+ text-decoration: none;
+}
+
+a:hover {
+ color: #000;
+ text-decoration: none;
+ background-color: transparent;
+}
+
+
+#header {
+ margin: 0;
+ padding: 0;
+}
+
+#header_left {
+ background-color: transparent;
+ float: left;
+ padding: 21px 0 0 32px;
+ margin: 0
+}
+
+#header_right {
+ background-color: transparent;
+ float: right;
+ text-align: right;
+ padding: 35px 50px 20px 0;
+ margin: 0
+}
+
+#footer {
+ margin: 20px 0 15px 0;
+ padding: 0;
+}
+
+#footer p {
+ font-size: 10px;
+ color: #999;
+ text-align: center;
+}
+
+#outer {
+ margin: 30px 40px 0 40px;
+}
+
+img {
+ padding:0;
+ border: 0;
+ margin: 0;
+}
+
+.nopad {
+ padding:0;
+ border: 0;
+ margin: 0;
+}
+
+table {
+ background-color: #efefef;
+}
+
+th {
+ background-color: #eee;
+ font-weight: bold;
+ padding: 6px;
+ text-align: left;
+}
+
+td {
+ background-color: #fff;
+ padding: 6px;
+}
+
+
+form {
+ margin: 0;
+ padding: 0;
+}
+
+.input {
+ font-family: Lucida Grande, Verdana, Geneva, Sans-serif;
+ font-size: 11px;
+ width: 600px;
+ color: #333;
+ border: 1px solid #B3B4BD;
+ font-size: 11px;
+ height: 2em;
+ padding: 0;
+ margin: 0;
+}
+
+.textarea {
+ font-family: Lucida Grande, Verdana, Geneva, Sans-serif;
+ font-size: 12px;
+ width: 600px;
+ color: #333;
+ border: 1px solid #B3B4BD;
+ padding: 0;
+ margin: 0;
+}
+
+.select {
+ background-color: #fff;
+ font-size: 11px;
+ font-weight: normal;
+ color: #333;
+ padding: 0;
+ margin: 0 0 3px 0;
+}
+
+.checkbox {
+ background-color: transparent;
+ padding: 0;
+ border: 0;
+}
+
+.submit {
+ background-color: #8B0D00;
+ color: #FFF;
+ font-weight: normal;
+ border: 1px solid #000;
+ margin: 6px 0 0 0;
+ padding: 1px 5px 1px 5px;
+}