Subversion Repositories Applications.papyrus

Compare Revisions

No changes between revisions

Ignore whitespace Rev 2004 → Rev 2005

/trunk/papyrus/bibliotheque/fonctions/ci_initialisation.fonct.php
New file
0,0 → 1,42
<?php
function lancerCodeIgniter($nom_appli,$nom_fonction) {
$_GET['c'] = $nom_appli ;
$_GET['m'] = $nom_fonction ;
$GLOBALS['retour'] = '' ;
error_reporting(E_ALL);
$system_folder = PAP_CHEMIN_RACINE.'papyrus/bibliotheque/system';
 
$application_folder = GEN_CHEMIN_APPLICATION.$nom_appli;
 
if (strpos($system_folder, '/') === FALSE) {
if (function_exists('realpath') AND @realpath(dirname(__FILE__)) !== FALSE) {
$system_folder = realpath(dirname(__FILE__)).'/'.$system_folder;
}
} else {
// Swap directory separators to Unix style for consistency
$system_folder = str_replace("\\", "/", $system_folder);
}
define('EXT', '.'.pathinfo(__FILE__, PATHINFO_EXTENSION));
define('FCPATH', __FILE__);
define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
define('BASEPATH', $system_folder.'/');
if (is_dir($application_folder)) {
define('APPPATH', $application_folder.'/');
} else {
if ($application_folder == '') {
$application_folder = 'application';
}
define('APPPATH', BASEPATH.$application_folder.'/');
}
require_once BASEPATH.'codeigniter/CodeIgniter'.EXT;
return $GLOBALS['retour'] ;
}
?>
/trunk/papyrus/bibliotheque/system/codeigniter/Compat.php
New file
0,0 → 1,93
<?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 */
/trunk/papyrus/bibliotheque/system/codeigniter/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/codeigniter/Common.php
New file
0,0 → 1,307
<?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 */
/trunk/papyrus/bibliotheque/system/codeigniter/CodeIgniter.php
New file
0,0 → 1,276
<?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 */
/trunk/papyrus/bibliotheque/system/codeigniter/Base4.php
New file
0,0 → 1,69
<?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 */
/trunk/papyrus/bibliotheque/system/codeigniter/Base5.php
New file
0,0 → 1,56
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Output.php
New file
0,0 → 1,478
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Zip.php
New file
0,0 → 1,359
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Config.php
New file
0,0 → 1,244
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Loader.php
New file
0,0 → 1,1088
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Calendar.php
New file
0,0 → 1,477
<?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)."&nbsp;".$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}">&lt;&lt;</a></th>',
'heading_title_cell' => '<th colspan="{colspan}">{heading}</th>',
'heading_next_cell' => '<th><a href="{next_url}">&gt;&gt;</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' => '&nbsp;',
'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 */
/trunk/papyrus/bibliotheque/system/libraries/Unit_test.php
New file
0,0 → 1,347
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Profiler.php
New file
0,0 → 1,392
<?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;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_benchmarks').'&nbsp;&nbsp;</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."&nbsp;&nbsp;</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;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_queries').'&nbsp;&nbsp;</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&nbsp;JOIN', 'ORDER&nbsp;BY', 'GROUP&nbsp;BY', 'LIMIT', 'INSERT', 'INTO', 'VALUES', 'UPDATE', 'OR', 'HAVING', 'OFFSET', 'NOT&nbsp;IN', 'IN', 'LIKE', 'NOT&nbsp;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;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_database').':&nbsp; '.$db->database.'&nbsp;&nbsp;&nbsp;'.$this->CI->lang->line('profiler_queries').': '.count($this->CI->db->queries).'&nbsp;&nbsp;&nbsp;</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."&nbsp;&nbsp;</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;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_get_data').'&nbsp;&nbsp;</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;'>&#36;_GET[".$key."]&nbsp;&nbsp; </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;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_post_data').'&nbsp;&nbsp;</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;'>&#36;_POST[".$key."]&nbsp;&nbsp; </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;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_uri_string').'&nbsp;&nbsp;</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;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_controller_info').'&nbsp;&nbsp;</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;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_memory_usage').'&nbsp;&nbsp;</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 */
/trunk/papyrus/bibliotheque/system/libraries/Language.php
New file
0,0 → 1,124
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Controller.php
New file
0,0 → 1,127
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Encrypt.php
New file
0,0 → 1,484
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Upload.php
New file
0,0 → 1,931
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Email.php
New file
0,0 → 1,1953
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Xmlrpcs.php
New file
0,0 → 1,536
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Ftp.php
New file
0,0 → 1,618
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Validation.php
New file
0,0 → 1,875
<?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("&#39;", "&quot;", '&lt;', '&gt;'), 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('&lt;?php', '&lt;?PHP', '&lt;?', '?&gt;'), $str);
}
 
}
// END Validation Class
 
/* End of file Validation.php */
/* Location: ./system/libraries/Validation.php */
/trunk/papyrus/bibliotheque/system/libraries/Benchmark.php
New file
0,0 → 1,113
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Input.php
New file
0,0 → 1,1059
<?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]',
'<!--' => '&lt;!--',
'-->' => '--&gt;',
'<![CDATA[' => '&lt;![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('&lt;?php', '&lt;?PHP'), $str);
}
else
{
$str = str_replace(array('<?php', '<?PHP', '<?', '?'.'>'), array('&lt;?php', '&lt;?PHP', '&lt;?', '?&gt;'), $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: &lt;blink&gt;
*
*/
$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&#40;'some code'&#41;
*
*/
$str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2&#40;\\3&#41;", $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 = '&lt;'.$matches[1].$matches[2].$matches[3];
// encode captured opening or closing brace to prevent recursive vectors
$str .= str_replace(array('>', '<'), array('&gt;', '&lt;'), $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('&gt;', '&lt;'), $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 */
/trunk/papyrus/bibliotheque/system/libraries/URI.php
New file
0,0 → 1,584
<?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('&#36;', '&#40;', '&#41;', '&#40;', '&#41;');
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 */
/trunk/papyrus/bibliotheque/system/libraries/Model.php
New file
0,0 → 1,83
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Xmlrpc.php
New file
0,0 → 1,1421
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Typography.php
New file
0,0 → 1,342
<?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
*/
 
// ------------------------------------------------------------------------
 
/**
* Typography Class
*
*
* @access private
* @category Helpers
* @author ExpressionEngine Dev Team
* @link http://codeigniter.com/user_guide/helpers/
*/
class CI_Typography {
 
// Block level elements that should not be wrapped inside <p> tags
var $block_elements = 'address|blockquote|div|dl|fieldset|form|h\d|hr|noscript|object|ol|p|pre|script|table|ul';
// Elements that should not have <p> and <br /> tags within them.
var $skip_elements = 'p|pre|ol|ul|dl|object|table';
// Tags we want the parser to completely ignore when splitting the string.
var $inline_elements = 'a|abbr|acronym|b|bdo|br|button|cite|code|del|dfn|em|i|img|ins|input|label|map|kbd|samp|select|span|strong|sub|sup|textarea|var';
 
// whether or not to protect quotes within { curly braces }
var $protect_braced_quotes = FALSE;
/**
* Nothing to do here...
*
*/
function CI_Typography()
{
}
 
/**
* Auto Typography
*
* This function converts text, making it typographically correct:
* - Converts double spaces into paragraphs.
* - Converts single line breaks into <br /> tags
* - Converts single and double quotes into correctly facing curly quote entities.
* - Converts three dots into ellipsis.
* - Converts double dashes into em-dashes.
* - Converts two spaces into entities
*
* @access public
* @param string
* @param bool whether to strip javascript event handlers for security
* @param bool whether to reduce more then two consecutive newlines to two
* @return string
*/
function auto_typography($str, $strip_js_event_handlers = TRUE, $reduce_linebreaks = FALSE)
{
if ($str == '')
{
return '';
}
 
// Standardize Newlines to make matching easier
if (strpos($str, "\r") !== FALSE)
{
$str = str_replace(array("\r\n", "\r"), "\n", $str);
}
// Reduce line breaks. If there are more than two consecutive linebreaks
// we'll compress them down to a maximum of two since there's no benefit to more.
if ($reduce_linebreaks === TRUE)
{
$str = preg_replace("/\n\n+/", "\n\n", $str);
}
// Do we allow JavaScript event handlers? If not, we strip them from within all tags
if ($strip_js_event_handlers === TRUE)
{
$str = preg_replace("#<([^><]+?)([^a-z_\-]on\w*|xmlns)(\s*=\s*[^><]*)([><]*)#i", "<\\1\\4", $str);
}
 
// Convert quotes within tags to temporary markers. We don't want quotes converted
// within tags so we'll temporarily convert them to {@DQ} and {@SQ}
if (preg_match_all("#\<.+?>#si", $str, $matches))
{
for ($i = 0; $i < count($matches['0']); $i++)
{
$str = str_replace($matches['0'][$i],
str_replace(array("'",'"'), array('{@SQ}', '{@DQ}'), $matches['0'][$i]),
$str);
}
}
 
if ($this->protect_braced_quotes === TRUE)
{
if (preg_match_all("#\{.+?}#si", $str, $matches))
{
for ($i = 0; $i < count($matches['0']); $i++)
{
$str = str_replace($matches['0'][$i],
str_replace(array("'",'"'), array('{@SQ}', '{@DQ}'), $matches['0'][$i]),
$str);
}
}
}
// Convert "ignore" tags to temporary marker. The parser splits out the string at every tag
// it encounters. Certain inline tags, like image tags, links, span tags, etc. will be
// adversely affected if they are split out so we'll convert the opening bracket < temporarily to: {@TAG}
$str = preg_replace("#<(/*)(".$this->inline_elements.")([ >])#i", "{@TAG}\\1\\2\\3", $str);
 
// Split the string at every tag. This expression creates an array with this prototype:
//
// [array]
// {
// [0] = <opening tag>
// [1] = Content...
// [2] = <closing tag>
// Etc...
// }
$chunks = preg_split('/(<(?:[^<>]+(?:"[^"]*"|\'[^\']*\')?)+>)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
// Build our finalized string. We cycle through the array, skipping tags, and processing the contained text
$str = '';
$process = TRUE;
$paragraph = FALSE;
foreach ($chunks as $chunk)
{
// Are we dealing with a tag? If so, we'll skip the processing for this cycle.
// Well also set the "process" flag which allows us to skip <pre> tags and a few other things.
if (preg_match("#<(/*)(".$this->block_elements.").*?\>#", $chunk, $match))
{
if (preg_match("#".$this->skip_elements."#", $match[2]))
{
$process = ($match[1] == '/') ? TRUE : FALSE;
}
$str .= $chunk;
continue;
}
 
if ($process == FALSE)
{
$str .= $chunk;
continue;
}
// Convert Newlines into <p> and <br /> tags
$str .= $this->_format_newlines($chunk);
}
 
// is the whole of the content inside a block level element?
if ( ! preg_match("/^<(?:".$this->block_elements.")/i", $str, $match))
{
$str = "<p>{$str}</p>";
}
 
// Convert quotes, elipsis, and em-dashes
$str = $this->format_characters($str);
// Final clean up
$table = array(
// If the user submitted their own paragraph tags within the text
// we will retain them instead of using our tags.
'/(<p.*?>)<p>/' => '$1', // <?php BBEdit syntax coloring bug fix
// Reduce multiple instances of opening/closing paragraph tags to a single one
'#(</p>)+#' => '</p>',
'/(<p><p>)+/' => '<p>',
// Clean up stray paragraph tags that appear before block level elements
'#<p></p><('.$this->block_elements.')#' => '<$1',
// Replace the temporary markers we added earlier
'/\{@TAG\}/' => '<',
'/\{@DQ\}/' => '"',
'/\{@SQ\}/' => "'"
 
);
// Do we need to reduce empty lines?
if ($reduce_linebreaks === TRUE)
{
$table['#<p>\n*</p>#'] = '';
}
else
{
// If we have empty paragraph tags we add a non-breaking space
// otherwise most browsers won't treat them as true paragraphs
$table['#<p></p>#'] = '<p>&nbsp;</p>';
}
return preg_replace(array_keys($table), $table, $str);
 
}
// --------------------------------------------------------------------
 
/**
* Format Characters
*
* This function mainly converts double and single quotes
* to curly entities, but it also converts em-dashes,
* double spaces, and ampersands
*
* @access public
* @param string
* @return string
*/
function format_characters($str)
{
static $table;
if ( ! isset($table))
{
$table = array(
// nested smart quotes, opening and closing
// note that rules for grammar (English) allow only for two levels deep
// and that single quotes are _supposed_ to always be on the outside
// but we'll accommodate both
'/(^|\W|\s)\'"/' => '$1&#8216;&#8220;',
'/\'"(\s|\W|$)/' => '&#8217;&#8221;$1',
'/(^|\W|\s)"\'/' => '$1&#8220;&#8216;',
'/"\'(\s|\W|$)/' => '&#8221;&#8217;$1',
 
// single quote smart quotes
'/\'(\s|\W|$)/' => '&#8217;$1',
'/(^|\W|\s)\'/' => '$1&#8216;',
 
// double quote smart quotes
'/"(\s|\W|$)/' => '&#8221;$1',
'/(^|\W|\s)"/' => '$1&#8220;',
 
// apostrophes
"/(\w)'(\w)/" => '$1&#8217;$2',
 
// Em dash and ellipses dots
'/\s?\-\-\s?/' => '&#8212;',
'/(\w)\.{3}/' => '$1&#8230;',
 
// double space after sentences
'/(\W) /' => '$1&nbsp; ',
 
// ampersands, if not a character entity
'/&(?!#?[a-zA-Z0-9]{2,};)/' => '&amp;'
);
}
 
return preg_replace(array_keys($table), $table, $str);
}
// --------------------------------------------------------------------
 
/**
* Format Newlines
*
* Converts newline characters into either <p> tags or <br />
*
* @access public
* @param string
* @return string
*/
function _format_newlines($str)
{
if ($str == '')
{
return $str;
}
 
if (strpos($str, "\n") === FALSE)
{
return $str;
}
// Convert two consecutive newlines to paragraphs
$str = str_replace("\n\n", "</p>\n\n<p>", $str);
// Convert single spaces to <br /> tags
$str = preg_replace("/([^\n])(\n)([^\n])/", "\\1<br />\\2\\3", $str);
// Wrap the whole enchilada in enclosing paragraphs
if ($str != "\n")
{
$str = '<p>'.$str.'</p>';
}
 
// Remove empty paragraphs if they are on the first line, as this
// is a potential unintended consequence of the previous code
$str = preg_replace("/<p><\/p>(.*)/", "\\1", $str, 1);
return $str;
}
// ------------------------------------------------------------------------
/**
* Convert newlines to HTML line breaks except within PRE tags
*
* @access public
* @param string
* @return string
*/
function nl2br_except_pre($str)
{
$ex = explode("pre>",$str);
$ct = count($ex);
$newstr = "";
for ($i = 0; $i < $ct; $i++)
{
if (($i % 2) == 0)
{
$newstr .= nl2br($ex[$i]);
}
else
{
$newstr .= $ex[$i];
}
if ($ct - 1 != $i)
$newstr .= "pre>";
}
return $newstr;
}
}
// END Typography Class
 
/* End of file Typography.php */
/* Location: ./system/libraries/Typography.php */
/trunk/papyrus/bibliotheque/system/libraries/Image_lib.php
New file
0,0 → 1,1546
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Form_validation.php
New file
0,0 → 1,1280
<?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("&#39;", "&quot;", '&lt;', '&gt;'), 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('&lt;?php', '&lt;?PHP', '&lt;?', '?&gt;'), $str);
}
 
}
// END Form Validation Class
 
/* End of file Form_validation.php */
/* Location: ./system/libraries/Form_validation.php */
/trunk/papyrus/bibliotheque/system/libraries/Router.php
New file
0,0 → 1,385
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Log.php
New file
0,0 → 1,117
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Exceptions.php
New file
0,0 → 1,172
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Hooks.php
New file
0,0 → 1,226
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Session.php
New file
0,0 → 1,758
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/libraries/Trackback.php
New file
0,0 → 1,550
<?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('&#45;', '-', $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("&amp;", "&lt;", "&gt;", "&quot;", "&#39;", "&#45;"),
$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 = '&#8230;')
{
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 */
/trunk/papyrus/bibliotheque/system/libraries/Table.php
New file
0,0 → 1,440
<?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[] = '&nbsp;';
}
}
$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 */
/trunk/papyrus/bibliotheque/system/libraries/Pagination.php
New file
0,0 → 1,244
<?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 = '&lsaquo; First';
var $next_link = '&gt;';
var $prev_link = '&lt;';
var $last_link = 'Last &rsaquo;';
var $uri_segment = 3;
var $full_tag_open = '';
var $full_tag_close = '';
var $first_tag_open = '';
var $first_tag_close = '&nbsp;';
var $last_tag_open = '&nbsp;';
var $last_tag_close = '';
var $cur_tag_open = '&nbsp;<b>';
var $cur_tag_close = '</b>';
var $next_tag_open = '&nbsp;';
var $next_tag_close = '&nbsp;';
var $prev_tag_open = '&nbsp;';
var $prev_tag_close = '';
var $num_tag_open = '&nbsp;';
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).'&amp;'.$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 */
/trunk/papyrus/bibliotheque/system/libraries/Parser.php
New file
0,0 → 1,173
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/User_agent.php
New file
0,0 → 1,502
<?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 */
/trunk/papyrus/bibliotheque/system/libraries/Sha1.php
New file
0,0 → 1,251
<?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 */
/trunk/papyrus/bibliotheque/system/scaffolding/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/scaffolding/views/delete.php
New file
0,0 → 1,9
<?php $this->load->view('header'); ?>
 
<p><?php echo $message; ?></p>
 
<p><?php echo $no; ?>&nbsp;&nbsp;|&nbsp;&nbsp;<?php echo $yes; ?>
 
<?php $this->load->view('footer');
/* End of file delete.php */
/* Location: ./system/scaffolding/views/delete.php */
/trunk/papyrus/bibliotheque/system/scaffolding/views/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/scaffolding/views/edit.php
New file
0,0 → 1,33
<?php $this->load->view('header'); ?>
 
 
<p><?php echo anchor(array($base_uri, 'view'), '&lt; '.$scaff_view_all);?></p>
 
 
<?php echo form_open($action); ?>
 
<table border="0" cellpadding="3" cellspacing="1">
<?php foreach($fields as $field): ?>
 
<?php if ($field->primary_key == 1) continue; ?>
 
<tr>
<td><?php echo $field->name; ?></td>
<?php if ($field->type == 'blob'): ?>
<td><textarea class="textarea" name="<?php echo $field->name;?>" cols="60" rows="10" ><?php $f = $field->name; echo form_prep($query->$f); ?></textarea></td>
<?php else : ?>
<td><input class="input" value="<?php $f = $field->name; echo form_prep($query->$f); ?>" name="<?php echo $field->name; ?>" size="60" /></td>
<?php endif; ?>
</tr>
<?php endforeach; ?>
</table>
 
<input type="submit" class="submit" value="Update" />
 
</form>
 
<?php $this->load->view('footer');
/* End of file edit.php */
/* Location: ./system/scaffolding/views/edit.php */
/trunk/papyrus/bibliotheque/system/scaffolding/views/no_data.php
New file
0,0 → 1,8
<?php $this->load->view('header'); ?>
 
<p><?php echo $scaff_no_data; ?></p>
<p><?php echo anchor(array($base_uri, 'add'), $scaff_create_record); ?></p>
 
<?php $this->load->view('footer');
/* End of file no_data.php */
/* Location: ./system/scaffolding/views/no_data.php */
/trunk/papyrus/bibliotheque/system/scaffolding/views/add.php
New file
0,0 → 1,32
<?php $this->load->view('header'); ?>
 
<p><?php echo anchor(array($base_uri, 'view'), '&lt; '.$scaff_view_all); ?></p>
 
 
<?php echo form_open($action); ?>
 
<table border="0" cellpadding="3" cellspacing="1">
<?php foreach($fields as $field): ?>
 
<?php if ($field->primary_key == 1) continue; ?>
 
<tr>
<td><?php echo $field->name; echo ' '.$field->default; ?></td>
<?php if ($field->type == 'blob'): ?>
<td><textarea class="textarea" name="<?php echo $field->name; ?>" cols="60" rows="10" ><?php echo form_prep($field->default); ?></textarea></td>
<?php else : ?>
<td><input class="input" name="<?php echo $field->name; ?>" value="<?php echo form_prep($field->default); ?>" size="60" /></td>
<?php endif; ?>
</tr>
<?php endforeach; ?>
</table>
 
<input type="submit" class="submit" value="Insert" />
 
</form>
 
<?php $this->load->view('footer');
/* End of file add.php */
/* Location: ./system/scaffolding/views/add.php */
/trunk/papyrus/bibliotheque/system/scaffolding/views/header.php
New file
0,0 → 1,29
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
 
<title><?php echo $title; ?></title>
 
<style type='text/css'>
<?php $this->file(BASEPATH.'scaffolding/views/stylesheet.css'); ?>
</style>
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv='expires' content='-1' />
<meta http-equiv= 'pragma' content='no-cache' />
 
</head>
<body>
 
<div id="header">
<div id="header_left">
<h3>Scaffolding:&nbsp; <?php echo $title; ?></h3>
</div>
<div id="header_right">
<?php echo anchor(array($base_uri, 'view'), $scaff_view_records); ?> &nbsp;&nbsp;|&nbsp;&nbsp;
<?php echo anchor(array($base_uri, 'add'), $scaff_create_record); ?>
</div>
</div>
 
<br clear="all">
<div id="outer">
/trunk/papyrus/bibliotheque/system/scaffolding/views/stylesheet.css
New file
0,0 → 1,143
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;
}
/trunk/papyrus/bibliotheque/system/scaffolding/views/view.php
New file
0,0 → 1,27
<?php $this->load->view('header'); ?>
 
<table border="0" cellpadding="0" cellspacing="1" style="width:100%">
<tr>
<th>Edit</th>
<th>Delete</th>
<?php foreach($fields as $field): ?>
<th><?php echo $field; ?></th>
<?php endforeach; ?>
</tr>
 
<?php foreach($query->result() as $row): ?>
<tr>
<td>&nbsp;<?php echo anchor(array($base_uri, 'edit', $row->$primary), $scaff_edit); ?>&nbsp;</td>
<td><?php echo anchor(array($base_uri, 'delete', $row->$primary), $scaff_delete); ?></td>
<?php foreach($fields as $field): ?>
<td><?php echo form_prep($row->$field);?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</table>
 
<?php echo $paginate; ?>
 
<?php $this->load->view('footer');
/* End of file view.php */
/* Location: ./system/scaffolding/views/view.php */
/trunk/papyrus/bibliotheque/system/scaffolding/views/footer.php
New file
0,0 → 1,10
 
</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>
/trunk/papyrus/bibliotheque/system/scaffolding/Scaffolding.php
New file
0,0 → 1,291
<?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 */
/trunk/papyrus/bibliotheque/system/scaffolding/images/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/scaffolding/images/background.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/papyrus/bibliotheque/system/scaffolding/images/background.jpg
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/papyrus/bibliotheque/system/scaffolding/images/logo.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/papyrus/bibliotheque/system/scaffolding/images/logo.jpg
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/papyrus/bibliotheque/system/plugins/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/plugins/captcha_pi.php
New file
0,0 → 1,356
<?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 */
/trunk/papyrus/bibliotheque/system/plugins/js_calendar_pi.php
New file
0,0 → 1,629
<?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 + '\')">&lt;&lt;<\/td>';
str += '<td colspan="5" class="calheading">' + months[this.month] + ' ' + this.year + '<\/td>';
str += '<td class="calnavright" onClick="change_month(1, \'' + this.id + '\')">&gt;&gt;<\/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">&nbsp;<\/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">&nbsp;<\/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+'">&nbsp;<'+'/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+'">&nbsp;<'+'/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 */
/trunk/papyrus/bibliotheque/system/helpers/language_helper.php
New file
0,0 → 1,58
<?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 Language Helpers
*
* @package CodeIgniter
* @subpackage Helpers
* @category Helpers
* @author ExpressionEngine Dev Team
* @link http://codeigniter.com/user_guide/helpers/language_helper.html
*/
 
// ------------------------------------------------------------------------
 
/**
* Lang
*
* Fetches a language variable and optionally outputs a form label
*
* @access public
* @param string the language line
* @param string the id of the form element
* @return string
*/
if ( ! function_exists('lang'))
{
function lang($line, $id = '')
{
$CI =& get_instance();
$line = $CI->lang->line($line);
 
if ($id != '')
{
$line = '<label for="'.$id.'">'.$line."</label>";
}
 
return $line;
}
}
 
// ------------------------------------------------------------------------
/* End of file language_helper.php */
/* Location: ./system/helpers/language_helper.php */
/trunk/papyrus/bibliotheque/system/helpers/text_helper.php
New file
0,0 → 1,443
<?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 = '&#8230;')
{
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 = '&#8230;')
{
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("&amp;", "&lt;", "&gt;", "&quot;", "&apos;", "&#45;"),
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('&lt;', '&gt;'), 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]+)">&lt;\?php(&nbsp;| )/i', '<span style="color: #$1">', $str);
$str = preg_replace('/(<span style="color: #[A-Z0-9]+">.*?)\?&gt;<\/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('&lt;?', '?&gt;', '&lt;%', '%&gt;', '\\', '&lt;/script&gt;'), $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 */
/trunk/papyrus/bibliotheque/system/helpers/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/helpers/inflector_helper.php
New file
0,0 → 1,169
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/email_helper.php
New file
0,0 → 1,62
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/number_helper.php
New file
0,0 → 1,75
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/path_helper.php
New file
0,0 → 1,72
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/xml_helper.php
New file
0,0 → 1,62
<?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("&amp;", "&lt;", "&gt;", "&quot;", "&#39;", "&#45;"),
$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 */
/trunk/papyrus/bibliotheque/system/helpers/url_helper.php
New file
0,0 → 1,582
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/smiley_helper.php
New file
0,0 → 1,175
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/form_helper.php
New file
0,0 → 1,963
<?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("&#39;", "&quot;"), $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 */
/trunk/papyrus/bibliotheque/system/helpers/directory_helper.php
New file
0,0 → 1,80
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/html_helper.php
New file
0,0 → 1,376
<?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("&nbsp;", $num);
}
}
 
 
/* End of file html_helper.php */
/* Location: ./system/helpers/html_helper.php */
/trunk/papyrus/bibliotheque/system/helpers/string_helper.php
New file
0,0 → 1,273
<?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("&#39;","&quot;","&#39;","&quot;"), $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 */
/trunk/papyrus/bibliotheque/system/helpers/typography_helper.php
New file
0,0 → 1,72
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/security_helper.php
New file
0,0 → 1,126
<?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('&lt;?php', '&lt;?PHP', '&lt;?', '?&gt;'), $str);
}
}
 
 
/* End of file security_helper.php */
/* Location: ./system/helpers/security_helper.php */
/trunk/papyrus/bibliotheque/system/helpers/download_helper.php
New file
0,0 → 1,100
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/cookie_helper.php
New file
0,0 → 1,136
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/compatibility_helper.php
New file
0,0 → 1,498
<?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 Compatibility Helpers
*
* This helper contains some functions based on the PEAR PHP_Compat library
* http://pear.php.net/package/PHP_Compat
*
* The PEAR compat library is a little bloated and the code doesn't harmonize
* well with CodeIgniter, so those functions have been refactored.
* We cheat a little and use CI's _exception_handler() to output our own PHP errors
* so that the behavior fully mimicks the PHP 5 counterparts. -- Derek Jones
*
* @package CodeIgniter
* @subpackage Helpers
* @category Helpers
* @author ExpressionEngine Dev Team
* @link http://codeigniter.com/user_guide/helpers/compatibility_helper.html
*/
 
// ------------------------------------------------------------------------
 
if ( ! defined('PHP_EOL'))
{
define('PHP_EOL', (DIRECTORY_SEPARATOR == '/') ? "\n" : "\r\n");
}
 
// ------------------------------------------------------------------------
 
/**
* file_put_contents()
*
* Writes a string to a file
* http://us.php.net/manual/en/function.file_put_contents.php
* argument 4, $context, not supported
*
* @access public
* @param string file name
* @param mixed data to be written
* @param int flags
* @return int length of written string
*/
if ( ! function_exists('file_put_contents'))
{
function file_put_contents($filename, $data, $flags = NULL)
{
if (is_scalar($data))
{
settype($data, 'STRING');
}
 
if ( ! is_string($data) && ! is_array($data) && ! is_resource($data))
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'file_put_contents(): the 2nd parameter should be either a string or an array', $backtrace[0]['file'], $backtrace[0]['line']);
return FALSE;
}
 
// read stream if given a stream resource
if (is_resource($data))
{
if (get_resource_type($data) !== 'stream')
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'file_put_contents(): supplied resource is not a valid stream resource', $backtrace[0]['file'], $backtrace[0]['line']);
return FALSE;
}
 
$text = '';
while ( ! feof($data))
{
$text .= fread($data, 4096);
}
$data = $text;
unset($text);
}
// strings only please!
if (is_array($data))
{
$data = implode('', $data);
}
 
// Set the appropriate mode
if (($flags & 8) > 0) // 8 = FILE_APPEND flag
{
$mode = FOPEN_WRITE_CREATE;
}
else
{
$mode = FOPEN_WRITE_CREATE_DESTRUCTIVE;
}
// Check if we're using the include path
if (($flags & 1) > 0) // 1 = FILE_USE_INCLUDE_PATH flag
{
$use_include_path = TRUE;
}
else
{
$use_include_path = FALSE;
}
$fp = @fopen($filename, $mode, $use_include_path);
if ($fp === FALSE)
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'file_put_contents('.htmlentities($filename).') failed to open stream', $backtrace[0]['file'], $backtrace[0]['line']);
return FALSE;
}
if (($flags & LOCK_EX) > 0)
{
if ( ! flock($fp, LOCK_EX))
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'file_put_contents('.htmlentities($filename).') unable to acquire an exclusive lock on file', $backtrace[0]['file'], $backtrace[0]['line']);
return FALSE;
}
}
// write it
if (($written = @fwrite($fp, $data)) === FALSE)
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'file_put_contents('.htmlentities($filename).') failed to write to '.htmlentities($filename), $backtrace[0]['file'], $backtrace[0]['line']);
}
// Close the handle
@fclose($fp);
// Return length
return $written;
}
}
 
// ------------------------------------------------------------------------
 
/**
* fputcsv()
*
* Format line as CSV and write to file pointer
* http://us.php.net/manual/en/function.fputcsv.php
*
* @access public
* @param resource file pointer
* @param array data to be written
* @param string delimiter
* @param string enclosure
* @return int length of written string
*/
if ( ! function_exists('fputcsv'))
{
function fputcsv($handle, $fields, $delimiter = ',', $enclosure = '"')
{
// Checking for a handle resource
if ( ! is_resource($handle))
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'fputcsv() expects parameter 1 to be stream resource, '.gettype($handle).' given', $backtrace[0]['file'], $backtrace[0]['line']);
return FALSE;
}
// OK, it is a resource, but is it a stream?
if (get_resource_type($handle) !== 'stream')
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'fputcsv() expects parameter 1 to be stream resource, '.get_resource_type($handle).' given', $backtrace[0]['file'], $backtrace[0]['line']);
return FALSE;
}
// Checking for an array of fields
if ( ! is_array($fields))
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'fputcsv() expects parameter 2 to be array, '.gettype($fields).' given', $backtrace[0]['file'], $backtrace[0]['line']);
return FALSE;
}
// validate delimiter
if (strlen($delimiter) > 1)
{
$delimiter = substr($delimiter, 0, 1);
$backtrace = debug_backtrace();
_exception_handler(E_NOTICE, 'fputcsv() delimiter must be one character long, "'.htmlentities($delimiter).'" used', $backtrace[0]['file'], $backtrace[0]['line']);
}
// validate enclosure
if (strlen($enclosure) > 1)
{
$enclosure = substr($enclosure, 0, 1);
$backtrace = debug_backtrace();
_exception_handler(E_NOTICE, 'fputcsv() enclosure must be one character long, "'.htmlentities($enclosure).'" used', $backtrace[0]['file'], $backtrace[0]['line']);
 
}
$out = '';
foreach ($fields as $cell)
{
$cell = str_replace($enclosure, $enclosure.$enclosure, $cell);
 
if (strpos($cell, $delimiter) !== FALSE OR strpos($cell, $enclosure) !== FALSE OR strpos($cell, "\n") !== FALSE)
{
$out .= $enclosure.$cell.$enclosure.$delimiter;
}
else
{
$out .= $cell.$delimiter;
}
}
$length = @fwrite($handle, substr($out, 0, -1)."\n");
return $length;
}
}
 
// ------------------------------------------------------------------------
 
/**
* stripos()
*
* Find position of first occurrence of a case-insensitive string
* http://us.php.net/manual/en/function.stripos.php
*
* @access public
* @param string haystack
* @param string needle
* @param int offset
* @return int numeric position of the first occurrence of needle in the haystack
*/
if ( ! function_exists('stripos'))
{
function stripos($haystack, $needle, $offset = NULL)
{
// Cast non string scalar values
if (is_scalar($haystack))
{
settype($haystack, 'STRING');
}
if ( ! is_string($haystack))
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'stripos() expects parameter 1 to be string, '.gettype($haystack).' given', $backtrace[0]['file'], $backtrace[0]['line']);
return FALSE;
}
if ( ! is_scalar($needle))
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'stripos() needle is not a string or an integer in '.$backtrace[0]['file'], $backtrace[0]['line']);
return FALSE;
}
if (is_float($offset))
{
$offset = (int)$offset;
}
if ( ! is_int($offset) && ! is_bool($offset) && ! is_null($offset))
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'stripos() expects parameter 3 to be long, '.gettype($offset).' given', $backtrace[0]['file'], $backtrace[0]['line']);
return NULL;
}
return strpos(strtolower($haystack), strtolower($needle), $offset);
}
}
 
// ------------------------------------------------------------------------
 
/**
* str_ireplace()
*
* Find position of first occurrence of a case-insensitive string
* http://us.php.net/manual/en/function.str-ireplace.php
* (parameter 4, $count, is not supported as to do so in PHP 4 would make
* it a required parameter)
*
* @access public
* @param mixed search
* @param mixed replace
* @param mixed subject
* @return int numeric position of the first occurrence of needle in the haystack
*/
if ( ! function_exists('str_ireplace'))
{
function str_ireplace($search, $replace, $subject)
{
// Nothing to do here
if ($search === NULL OR $subject === NULL)
{
return $subject;
}
// Crazy arguments
if (is_scalar($search) && is_array($replace))
{
$backtrace = debug_backtrace();
 
if (is_object($replace))
{
show_error('Object of class '.get_class($replace).' could not be converted to string in '.$backtrace[0]['file'].' on line '.$backtrace[0]['line']);
}
else
{
_exception_handler(E_USER_NOTICE, 'Array to string conversion in '.$backtrace[0]['file'], $backtrace[0]['line']);
}
}
// Searching for an array
if (is_array($search))
{
// Replacing with an array
if (is_array($replace))
{
$search = array_values($search);
$replace = array_values($replace);
 
if (count($search) >= count($replace))
{
$replace = array_pad($replace, count($search), '');
}
else
{
$replace = array_slice($replace, 0, count($search));
}
}
else
{
// Replacing with a string all positions
$replace = array_fill(0, count($search), $replace);
}
}
else
{
//Searching for a string and replacing with a string.
$search = array((string)$search);
$replace = array((string)$replace);
}
// Prepare the search array
foreach ($search as $search_key => $search_value)
{
$search[$search_key] = '/'.preg_quote($search_value, '/').'/i';
}
// Prepare the replace array (escape backreferences)
foreach ($replace as $k => $v)
{
$replace[$k] = str_replace(array(chr(92), '$'), array(chr(92).chr(92), '\$'), $v);
}
// do the replacement
$result = preg_replace($search, $replace, (array)$subject);
// Check if subject was initially a string and return it as a string
if ( ! is_array($subject))
{
return current($result);
}
// Otherwise, just return the array
return $result;
}
}
 
// ------------------------------------------------------------------------
 
/**
* http_build_query()
*
* Generate URL-encoded query string
* http://us.php.net/manual/en/function.http-build-query.php
*
* @access public
* @param array form data
* @param string numeric prefix
* @param string argument separator
* @return string URL-encoded string
*/
if ( ! function_exists('http_build_query'))
{
function http_build_query($formdata, $numeric_prefix = NULL, $separator = NULL)
{
// Check the data
if ( ! is_array($formdata) && ! is_object($formdata))
{
$backtrace = debug_backtrace();
_exception_handler(E_USER_WARNING, 'http_build_query() Parameter 1 expected to be Array or Object. Incorrect value given', $backtrace[0]['file'], $backtrace[0]['line']);
return FALSE;
}
// Cast it as array
if (is_object($formdata))
{
$formdata = get_object_vars($formdata);
}
// If the array is empty, return NULL
if (empty($formdata))
{
return NULL;
}
// Argument separator
if ($separator === NULL)
{
$separator = ini_get('arg_separator.output');
 
if (strlen($separator) == 0)
{
$separator = '&';
}
}
// Start building the query
$tmp = array();
 
foreach ($formdata as $key => $val)
{
if ($val === NULL)
{
continue;
}
if (is_integer($key) && $numeric_prefix != NULL)
{
$key = $numeric_prefix.$key;
}
if (is_resource($val))
{
return NULL;
}
// hand it off to a recursive parser
$tmp[] = _http_build_query_helper($key, $val, $separator);
}
return implode($separator, $tmp);
}
// Helper helper. Remind anyone of college?
// Required to handle recursion in nested arrays.
//
// You could shave fractions of fractions of a second by moving where
// the urlencoding takes place, but it's much less intuitive, and if
// your application has 10,000 form fields, well, you have other problems ;)
function _http_build_query_helper($key, $val, $separator = '&')
{
if (is_scalar($val))
{
return urlencode($key).'='.urlencode($val);
}
else
{
// arrays please
if (is_object($val))
{
$val = get_object_vars($val);
}
foreach ($val as $k => $v)
{
$tmp[] = _http_build_query_helper($key.'['.$k.']', $v, $separator);
}
}
return implode($separator, $tmp);
}
}
 
 
/* End of file compatibility_helper.php */
/* Location: ./system/helpers/compatibility_helper.php */
/trunk/papyrus/bibliotheque/system/helpers/date_helper.php
New file
0,0 → 1,611
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/array_helper.php
New file
0,0 → 1,78
<?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 */
/trunk/papyrus/bibliotheque/system/helpers/file_helper.php
New file
0,0 → 1,465
<?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 */
/trunk/papyrus/bibliotheque/system/cache/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/language/english/profiler_lang.php
New file
0,0 → 1,19
<?php
 
$lang['profiler_database'] = 'DATABASE';
$lang['profiler_controller_info'] = 'CLASS/METHOD';
$lang['profiler_benchmarks'] = 'BENCHMARKS';
$lang['profiler_queries'] = 'QUERIES';
$lang['profiler_get_data'] = 'GET DATA';
$lang['profiler_post_data'] = 'POST DATA';
$lang['profiler_uri_string'] = 'URI STRING';
$lang['profiler_memory_usage'] = 'MEMORY USAGE';
$lang['profiler_no_db'] = 'Database driver is not currently loaded';
$lang['profiler_no_queries'] = 'No queries were run';
$lang['profiler_no_post'] = 'No POST data exists';
$lang['profiler_no_get'] = 'No GET data exists';
$lang['profiler_no_uri'] = 'No URI data exists';
$lang['profiler_no_memory'] = 'Memory Usage Unavailable';
 
/* End of file profiler_lang.php */
/* Location: ./system/language/english/profiler_lang.php */
/trunk/papyrus/bibliotheque/system/language/english/imglib_lang.php
New file
0,0 → 1,23
<?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 */
/trunk/papyrus/bibliotheque/system/language/english/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/language/english/upload_lang.php
New file
0,0 → 1,22
<?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 */
/trunk/papyrus/bibliotheque/system/language/english/db_lang.php
New file
0,0 → 1,28
<?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 */
/trunk/papyrus/bibliotheque/system/language/english/email_lang.php
New file
0,0 → 1,23
<?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 */
/trunk/papyrus/bibliotheque/system/language/english/number_lang.php
New file
0,0 → 1,10
<?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 */
/trunk/papyrus/bibliotheque/system/language/english/calendar_lang.php
New file
0,0 → 1,51
<?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 */
/trunk/papyrus/bibliotheque/system/language/english/ftp_lang.php
New file
0,0 → 1,17
<?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 */
/trunk/papyrus/bibliotheque/system/language/english/validation_lang.php
New file
0,0 → 1,24
<?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 */
/trunk/papyrus/bibliotheque/system/language/english/date_lang.php
New file
0,0 → 1,60
<?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 */
/trunk/papyrus/bibliotheque/system/language/english/form_validation_lang.php
New file
0,0 → 1,24
<?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 */
/trunk/papyrus/bibliotheque/system/language/english/unit_test_lang.php
New file
0,0 → 1,24
<?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 */
/trunk/papyrus/bibliotheque/system/language/english/scaffolding_lang.php
New file
0,0 → 1,17
<?php
 
$lang['scaff_view_records'] = 'View Records';
$lang['scaff_create_record'] = 'Create New Record';
$lang['scaff_add'] = 'Add Data';
$lang['scaff_view'] = 'View Data';
$lang['scaff_edit'] = 'Edit';
$lang['scaff_delete'] = 'Delete';
$lang['scaff_view_all'] = 'View All';
$lang['scaff_yes'] = 'Yes';
$lang['scaff_no'] = 'No';
$lang['scaff_no_data'] = 'No data exists for this table yet.';
$lang['scaff_del_confirm'] = 'Are you sure you want to delete the following row:';
 
 
/* End of file scaffolding_lang.php */
/* Location: ./system/language/english/scaffolding_lang.php */
/trunk/papyrus/bibliotheque/system/language/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/database/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/database/DB.php
New file
0,0 → 1,146
<?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 */
/trunk/papyrus/bibliotheque/system/database/DB_forge.php
New file
0,0 → 1,355
<?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 */
/trunk/papyrus/bibliotheque/system/database/DB_cache.php
New file
0,0 → 1,195
<?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 */
/trunk/papyrus/bibliotheque/system/database/DB_utility.php
New file
0,0 → 1,389
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mysqli/mysqli_forge.php
New file
0,0 → 1,254
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mysqli/mysqli_utility.php
New file
0,0 → 1,123
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mysqli/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/database/drivers/mysqli/mysqli_driver.php
New file
0,0 → 1,606
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mysqli/mysqli_result.php
New file
0,0 → 1,169
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mssql/mssql_forge.php
New file
0,0 → 1,248
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mssql/mssql_utility.php
New file
0,0 → 1,123
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mssql/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/database/drivers/mssql/mssql_driver.php
New file
0,0 → 1,611
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mssql/mssql_result.php
New file
0,0 → 1,169
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/sqlite/sqlite_driver.php
New file
0,0 → 1,601
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/sqlite/sqlite_result.php
New file
0,0 → 1,179
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/sqlite/sqlite_forge.php
New file
0,0 → 1,265
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/sqlite/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/database/drivers/sqlite/sqlite_utility.php
New file
0,0 → 1,141
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/oci8/oci8_driver.php
New file
0,0 → 1,726
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/oci8/oci8_result.php
New file
0,0 → 1,249
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/oci8/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/database/drivers/oci8/oci8_forge.php
New file
0,0 → 1,248
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/oci8/oci8_utility.php
New file
0,0 → 1,122
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/postgre/postgre_result.php
New file
0,0 → 1,169
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/postgre/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/database/drivers/postgre/postgre_forge.php
New file
0,0 → 1,248
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/postgre/postgre_utility.php
New file
0,0 → 1,124
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/postgre/postgre_driver.php
New file
0,0 → 1,625
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mysql/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/database/drivers/mysql/mysql_forge.php
New file
0,0 → 1,254
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mysql/mysql_utility.php
New file
0,0 → 1,245
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mysql/mysql_driver.php
New file
0,0 → 1,623
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/mysql/mysql_result.php
New file
0,0 → 1,169
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/odbc/odbc_forge.php
New file
0,0 → 1,266
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/odbc/odbc_utility.php
New file
0,0 → 1,148
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/odbc/odbc_driver.php
New file
0,0 → 1,583
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/odbc/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/database/drivers/odbc/odbc_result.php
New file
0,0 → 1,228
<?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 */
/trunk/papyrus/bibliotheque/system/database/drivers/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/database/DB_active_rec.php
New file
0,0 → 1,1770
<?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 */
/trunk/papyrus/bibliotheque/system/database/DB_driver.php
New file
0,0 → 1,1319
<?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 */
/trunk/papyrus/bibliotheque/system/database/DB_result.php
New file
0,0 → 1,342
<?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 */
/trunk/papyrus/bibliotheque/system/logs/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>
/trunk/papyrus/bibliotheque/system/fonts/texb.ttf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/papyrus/bibliotheque/system/fonts/texb.ttf
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/papyrus/bibliotheque/system/fonts/index.html
New file
0,0 → 1,10
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
 
<p>Directory access is forbidden.</p>
 
</body>
</html>