OSDN Git Service

Merge branch 'skinnable-master'
[nucleus-jp/nucleus-next.git] / nucleus / libs / sql / MYSQLPDO.php
index da9e3ed..65bcb48 100644 (file)
@@ -1,3 +1,667 @@
+<<<<<<< HEAD
+<?php\r
+/*\r
+ * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
+ * Copyright (C) 2012 The Nucleus Group\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ * (see nucleus/documentation/index.html#license for more info)\r
+ */\r
+/**\r
+ * @license http://nucleuscms.org/license.txt GNU General Public License\r
+ * @copyright Copyright (C) 2012 The Nucleus Group\r
+ * @version $Id$\r
+ */\r
+\r
+if ( !class_exists('PDO') )\r
+{\r
+\r
+       /**\r
+        * Dummy constant of the PDO class\r
+        */\r
+       class PDO\r
+       {\r
+               /* constant values */\r
+               const PARAM_NULL = 0;\r
+               const PARAM_INT = 1;\r
+               const PARAM_STR = 2;\r
+               const PARAM_LOB = 3;\r
+               const PARAM_STMT = 4;\r
+               const PARAM_BOOL = 5;\r
+               const PARAM_INPUT_OUTPUT = 128; // orignal is undefined.\r
+               const FETCH_LAZY = 1;\r
+               const FETCH_ASSOC = 2;\r
+               const FETCH_NUM = 3;\r
+               const FETCH_BOTH = 4;\r
+               const FETCH_OBJ = 5;\r
+               const FETCH_BOUND = 6;\r
+               const FETCH_COLUMN = 7;\r
+               const FETCH_CLASS = 8;\r
+               const FETCH_INTO = 9;\r
+               const FETCH_FUNC = 10;\r
+               const FETCH_NAMED = 11;\r
+               const FETCH_KEY_PAIR = 12;\r
+               const FETCH_GROUP = 65536;\r
+               const FETCH_UNIQUE = 196608;\r
+               const FETCH_CLASSTYPE = 262144;\r
+               const FETCH_SERIALIZE = 524288;\r
+               const FETCH_PROPS_LATE = 1048576;\r
+               const ATTR_AUTOCOMMIT = 0;\r
+               const ATTR_PREFETCH = 1;\r
+               const ATTR_TIMEOUT = 2;\r
+               const ATTR_ERRMODE = 3;\r
+               const ATTR_SERVER_VERSION = 4;\r
+               const ATTR_CLIENT_VERSION = 5;\r
+               const ATTR_SERVER_INFO = 6;\r
+               const ATTR_CONNECTION_STATUS = 7;\r
+               const ATTR_CASE = 8;\r
+               const ATTR_CURSOR_NAME = 9;\r
+               const ATTR_CURSOR = 10;\r
+               const ATTR_ORACLE_NULLS = 11;\r
+               const ATTR_PERSISTENT = 12;\r
+               const ATTR_STATEMENT_CLASS = 13;\r
+               const ATTR_FETCH_TABLE_NAMES = 14;\r
+               const ATTR_FETCH_CATALOG_NAMES = 15;\r
+               const ATTR_DRIVER_NAME = 16;\r
+               const ATTR_STRINGIFY_FETCHES = 17;\r
+               const ATTR_MAX_COLUMN_LEN = 18;\r
+               const ATTR_DEFAULT_FETCH_MODE = 19;\r
+               const ATTR_EMULATE_PREPARES = 20;\r
+               const ERRMODE_SILENT = 0;\r
+               const ERRMODE_WARNING = 1;\r
+               const ERRMODE_EXCEPTION = 2;\r
+               const CASE_NATURAL = 0;\r
+               const CASE_UPPER = 1;\r
+               const CASE_LOWER = 2;\r
+               const NULL_NATURAL = 0;\r
+               const NULL_EMPTY_STRING = 1;\r
+               const NULL_TO_STRING = 2;\r
+               const FETCH_ORI_NEXT = 0;\r
+               const FETCH_ORI_PRIOR = 1;\r
+               const FETCH_ORI_FIRST = 2;\r
+               const FETCH_ORI_LAST = 3;\r
+               const FETCH_ORI_ABS = 4;\r
+               const FETCH_ORI_REL = 5;\r
+               const CURSOR_FWDONLY = 0;\r
+               const CURSOR_SCROLL = 1;\r
+               // from here orignal is undefined.\r
+               const ERR_CANT_MAP = 0;\r
+               const ERR_SYNTAX = 0;\r
+               const ERR_CONSTRAINT = 0;\r
+               const ERR_NOT_FOUND = 0;\r
+               const ERR_ALREADY_EXISTS = 0;\r
+               const ERR_NOT_IMPLEMENTED = 0;\r
+               const ERR_MISMATCH = 0;\r
+               const ERR_TRUNCATED = 0;\r
+               const ERR_DISCONNECTED = 0;\r
+               const ERR_NO_PERM = 0;\r
+               // so far\r
+               const ERR_NONE = '00000';\r
+               const PARAM_EVT_ALLOC = 0;\r
+               const PARAM_EVT_FREE = 1;\r
+               const PARAM_EVT_EXEC_PRE = 2;\r
+               const PARAM_EVT_EXEC_POST = 3;\r
+               const PARAM_EVT_FETCH_PRE = 4;\r
+               const PARAM_EVT_FETCH_POST = 5;\r
+               const PARAM_EVT_NORMALIZE = 6;\r
+\r
+               const MYSQL_ATTR_INIT_COMMAND = 1002;\r
+       }\r
+\r
+       /**\r
+        * PDOException class of dummy\r
+        */\r
+       class PDOException extends Exception\r
+       {}\r
+}\r
+\r
+/**\r
+ * MysqlPDO class that wraps the mysql_ or mysqli_ function like PDO class\r
+ */\r
+class MysqlPDO\r
+{\r
+       // Prefix function name\r
+       public static $handler;\r
+\r
+       private $dbcon;\r
+\r
+       /**\r
+        * Creates a PDO instance representing a connection to a MySQL database.\r
+        * @param string $dsn DSN\r
+        * @param string $username UserName\r
+        * @param string $password Password\r
+        * @param mixed $driver_options Options[optional]\r
+        * @throws PDOException Thrown when failed to connect to the database.\r
+        */\r
+       public function __construct($dsn, $username, $password, $driver_options = '')\r
+       {\r
+               // select use function\r
+               if ( function_exists('mysql_query') )\r
+               {\r
+                       MysqlPDO::$handler = 'mysql_';\r
+               }\r
+               else if ( function_exists('mysqli_query') )\r
+               {\r
+                       MysqlPDO::$handler = 'mysqli_';\r
+               }\r
+               else\r
+               {\r
+                       throw new PDOException('Can not be found mysql_ or mysqli_ functions.', 'IM000');\r
+               }\r
+\r
+               if ( preg_match('/host=([^;]+)/', $dsn, $matches) )\r
+               {\r
+                       $host = $matches[1];\r
+               }\r
+               else\r
+               {\r
+                       throw new PDOException('Host has not been set.', '01000');\r
+               }\r
+               if ( preg_match('/port=([^;]+)/', $dsn, $matches) )\r
+               {\r
+                       $host .= ':' . $matches[1];\r
+               }\r
+\r
+               // mysql connect\r
+               $this->dbcon = @call_user_func(MysqlPDO::$handler . 'connect', $host, $username, $password);\r
+\r
+               if ( $this->dbcon == FALSE )\r
+               {\r
+                       throw new PDOException('Failed to connect to the server.', '01000');\r
+               }\r
+\r
+               // select database\r
+               if ( preg_match('/dbname=([^;]+)/', $dsn, $matches) )\r
+               {\r
+                       $dbname = $matches[1];\r
+                       if ( $dbname )\r
+                       {\r
+                               if ( MysqlPDO::$handler == 'mysql_' )\r
+                               {\r
+                                       call_user_func(MysqlPDO::$handler . 'select_db', $dbname, $this->dbcon);\r
+                               }\r
+                               else\r
+                               {\r
+                                       call_user_func(MysqlPDO::$handler . 'select_db', $this->dbcon, $dbname);\r
+                               }\r
+\r
+                               // set use character\r
+                               $charset = 'utf8';\r
+                               if ( is_array($driver_options) && array_key_exists(PDO::MYSQL_ATTR_INIT_COMMAND, $driver_options) )\r
+                               {\r
+                                       if ( preg_match('/SET\s+CHARACTER\s+SET\s+\'?([a-z0-9_-]+)\'?/', $driver_options[PDO::MYSQL_ATTR_INIT_COMMAND], $matches) )\r
+                                       {\r
+                                               $charset = $matches[1];\r
+                                       }\r
+                               }\r
+                               $server_info = call_user_func(MysqlPDO::$handler . 'get_server_info', $this->dbcon);\r
+                               $mysql_version = preg_replace('/^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{1,2})(.*)$/', '$1.$2.$3', $server_info);\r
+\r
+                               if ( version_compare($mysql_version, '5.0.7', '>=') && function_exists(MysqlPDO::$handler . 'set_charset') )\r
+                               {\r
+                                       call_user_func(MysqlPDO::$handler . 'set_charset', $charset);\r
+                               }\r
+                               else if ( version_compare($mysql_version, '5.0.7', '<') )\r
+                               {\r
+                                       $this->exec("SET CHARACTER SET '{$charset}';");\r
+                               }\r
+                               else\r
+                               {\r
+                                       $this->exec("SET NAMES '{$charset}';");\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       /**\r
+        * Close the connection to the MySQL server.\r
+        */\r
+       public function __destruct()\r
+       {\r
+               if ( $this->dbcon )\r
+               {\r
+                       @call_user_func(MysqlPDO::$handler . 'close', $this->dbcon);\r
+               }\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function beginTransaction()\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function commit()\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       /**\r
+        * Fetch the SQLSTATE associated with the last operation.\r
+        * However, if successful '00000' Otherwise, the return to '01000'.\r
+        * @return string Error code\r
+        */\r
+       public function errorCode()\r
+       {\r
+               $errno = call_user_func(MysqlPDO::$handler . 'errno', $this->dbcon);\r
+               return $errno === 0 ? '00000' : '01000';\r
+       }\r
+\r
+       /**\r
+        * To get extended error information associated with the last operation.\r
+        * Element 0: if successful '00000' Otherwise, the return to '01000'\r
+        * Element 1: The return value of mysql_errno()\r
+        * Element 2: The return value of mysql_error()\r
+        * @return array Array of error information\r
+        */\r
+       public function errorInfo()\r
+       {\r
+               $errno = call_user_func(MysqlPDO::$handler . 'errno', $this->dbcon);\r
+               $error = call_user_func(MysqlPDO::$handler . 'error', $this->dbcon);\r
+               return array($errno === 0 ? '00000' : '01000', $errno, $error);\r
+       }\r
+\r
+       public function exec($statement)\r
+       {\r
+               $result = @call_user_func(MysqlPDO::$handler . 'query', $statement, $this->dbcon);\r
+               if ( $result === TRUE )\r
+               {\r
+                       return @call_user_func(MysqlPDO::$handler . 'affected_rows', $this->dbcon);\r
+               }\r
+               else if ( is_resource($result) )\r
+               {\r
+                       return;\r
+               }\r
+               return FALSE;\r
+       }\r
+\r
+       public function getAttribute($attribute)\r
+       {\r
+               switch ( $attribute )\r
+               {\r
+                       case PDO::ATTR_SERVER_VERSION:\r
+                               return call_user_func(MysqlPDO::$handler . 'get_server_info', $this->dbcon);\r
+                               break;\r
+                       case PDO::ATTR_CLIENT_VERSION:\r
+                               return call_user_func(MysqlPDO::$handler . 'get_client_info');\r
+                               break;\r
+                       default:\r
+                               return FALSE;\r
+               }\r
+       }\r
+\r
+       public static function getAvailableDrivers()\r
+       {\r
+               return array('mysql');\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function inTransaction()\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       public function lastInsertId($name = null)\r
+       {\r
+               return call_user_func(MysqlPDO::$handler . 'insert_id', $this->dbcon);\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function prepare($statement, $driver_options = array())\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       public function query($statement)\r
+       {\r
+               $result = @call_user_func(MysqlPDO::$handler . 'query', $statement, $this->dbcon);\r
+               return ($result == FALSE) ? FALSE : new MysqlPDOStatement($statement, $result, $this->dbcon);\r
+       }\r
+\r
+       public function quote($string, $parameter_type = PDO::PARAM_STR)\r
+       {\r
+               switch ( $parameter_type )\r
+               {\r
+                       case PDO::PARAM_NULL:\r
+                               return 'null';\r
+                       case PDO::PARAM_BOOL:\r
+                               return $string ? '1' : '0';\r
+                       default:\r
+                               if ( $parameter_type == PDO::PARAM_INT && is_numeric($string) )\r
+                               {\r
+                                       return $string;\r
+                               }\r
+                               else\r
+                               {\r
+                                       return '\'' . call_user_func(MysqlPDO::$handler . 'real_escape_string', $string) . '\'';\r
+                               }\r
+               }\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function rollBack()\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function setAttribute($attribute, $value)\r
+       {\r
+               return FALSE;\r
+       }\r
+}\r
+\r
+/**\r
+ * MysqlPDOStatement class PDOStatement class like.\r
+ */\r
+class MysqlPDOStatement implements Iterator\r
+{\r
+       private $result;\r
+       private $dbcon;\r
+       private $_queryString = '';\r
+\r
+       private $def_fetch_mode = PDO::FETCH_BOTH;\r
+       private $def_col_num = 0;\r
+       private $def_class_name = 'stdClass';\r
+       private $def_ctorargs = null;\r
+       private $bind_object = null;\r
+\r
+       public function __get($name)\r
+       {\r
+               if ( $name == 'queryString' )\r
+               {\r
+                       return $this->_queryString;\r
+               }\r
+       }\r
+\r
+       public function __construct($query, $result, $dbconnect = null)\r
+       {\r
+               $this->dbcon = $dbconnect;\r
+               $this->_queryString = $query;\r
+               $this->result = $result;\r
+       }\r
+\r
+       public function __destruct()\r
+       {\r
+               $this->result = null;\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function bindColumn($column, &$param, $type, $maxlen, $driverdata)\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function bindParam($parameter, &$variable, $data_type = PDO::PARAM_STR, $length, $driver_options)\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function bindValue($parameter, $value, $data_type = PDO::PARAM_STR)\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       public function closeCursor()\r
+       {\r
+               return call_user_func(MysqlPDO::$handler . 'free_result', $this->result);\r
+       }\r
+\r
+       public function columnCount()\r
+       {\r
+               return call_user_func(MysqlPDO::$handler . 'num_fields', $this->result);\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function debugDumpParams()\r
+       {\r
+               return;\r
+       }\r
+\r
+       public function errorCode()\r
+       {\r
+               $errno = call_user_func(MysqlPDO::$handler . 'errno', $this->dbcon);\r
+               return $errno === 0 ? '00000' : '01000';\r
+       }\r
+\r
+       public function errorInfo()\r
+       {\r
+               $errno = call_user_func(MysqlPDO::$handler . 'errno', $this->dbcon);\r
+               $error = call_user_func(MysqlPDO::$handler . 'error', $this->dbcon);\r
+               return array($errno === 0 ? '00000' : '01000', $errno, $error);\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function execute($input_parameters)\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       public function fetch($fetch_style = PDO::ATTR_DEFAULT_FETCH_MODE, $cursor_orientation = PDO::FETCH_ORI_NEXT, $cursor_offset = 0)\r
+       {\r
+               if ( !is_resource($this->result) || $cursor_orientation != PDO::FETCH_ORI_NEXT )\r
+               {\r
+                       return FALSE;\r
+               }\r
+               \r
+               if ( $fetch_style == PDO::ATTR_DEFAULT_FETCH_MODE )\r
+               {\r
+                       $fetch_style = $this->def_fetch_mode;\r
+               }\r
+\r
+               switch ( $fetch_style )\r
+               {\r
+                       case PDO::FETCH_ASSOC:\r
+                               return @call_user_func(MysqlPDO::$handler . 'fetch_array', $this->result, MYSQL_ASSOC);\r
+                       case PDO::FETCH_BOTH:\r
+                               return @call_user_func(MysqlPDO::$handler . 'fetch_array', $this->result, MYSQL_BOTH);\r
+                       case PDO::FETCH_NUM:\r
+                               return @call_user_func(MysqlPDO::$handler . 'fetch_array', $this->result, MYSQL_NUM);\r
+                       case PDO::FETCH_OBJ:\r
+                               return $this->fetchObject();\r
+                       case PDO::FETCH_CLASS:\r
+                               return $this->fetchObject($this->def_class_name, $this->def_ctorargs);\r
+                       case PDO::FETCH_COLUMN:\r
+                               return $this->fetchColumn($this->def_col_num);\r
+                       case PDO::FETCH_BOUND:\r
+                               return FALSE; // Not supported\r
+                       case PDO::FETCH_INTO:\r
+                               return FALSE; // Not supported\r
+                       case PDO::FETCH_LAZY:\r
+                               return FALSE; // Not supported\r
+                       default:\r
+                               return FALSE;\r
+               }\r
+       }\r
+\r
+       public function fetchAll($fetch_style = PDO::ATTR_DEFAULT_FETCH_MODE, $fetch_argument = null, $ctor_args = array())\r
+       {\r
+               if ( $fetch_style == PDO::ATTR_DEFAULT_FETCH_MODE )\r
+               {\r
+                       $fetch_style = PDO::FETCH_BOTH;\r
+               }\r
+               \r
+               $ret = array();\r
+               if ( ($fetch_style & PDO::FETCH_COLUMN) != 0 )\r
+               {\r
+                       if ( $fetch_style == PDO::FETCH_COLUMN )\r
+                       {\r
+                               $column = $fetch_argument == null ? 0 : intval($fetch_argument);\r
+                               while ( $row = $this->fetchColumn($column) )\r
+                               {\r
+                                       $ret[] = $row;\r
+                               }\r
+                       }\r
+                       elseif ( ($fetch_style & PDO::FETCH_UNIQUE) != 0 )\r
+                       {\r
+                               return FALSE;\r
+                       }\r
+                       elseif ( ($fetch_style & PDO::FETCH_GROUP) != 0 )\r
+                       {\r
+                               return FALSE;\r
+                       }\r
+               }\r
+               elseif ( $fetch_style == PDO::FETCH_CLASS )\r
+               {\r
+                       while ( $row = $this->fetchObject($fetch_argument, $ctor_args) )\r
+                       {\r
+                               $ret[] = $row;\r
+                       }\r
+               }\r
+               elseif ( $fetch_style == PDO::FETCH_FUNC )\r
+               {\r
+                       while ( $row = $this->fetch(PDO::FETCH_ASSOC) )\r
+                       {\r
+                               $ret[] = call_user_func_array($fetch_argument, array_values($row));\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       while ( $row = $this->fetch($fetch_style) )\r
+                       {\r
+                               $ret[] = $row;\r
+                       }\r
+               }\r
+               return $ret;\r
+       }\r
+\r
+       public function fetchColumn($column_number = 0)\r
+       {\r
+               if ( $ret = $this->fetch(PDO::FETCH_NUM) )\r
+               {\r
+                       return $ret[$column_number];\r
+               }\r
+               return FALSE;\r
+       }\r
+\r
+       public function fetchObject($class_name = 'stdClass', $ctor_args = null)\r
+       {\r
+               if ( is_array($ctor_args) && !empty($ctor_args) )\r
+               {\r
+                       return @call_user_func(MysqlPDO::$handler . 'fetch_object', $this->result, $class_name, $ctor_args);\r
+               }\r
+               else\r
+               {\r
+                       return @call_user_func(MysqlPDO::$handler . 'fetch_object', $this->result, $class_name);\r
+               }\r
+       }\r
+\r
+       public function getAttribute($attribute)\r
+       {\r
+               switch ( $attribute )\r
+               {\r
+                       default:\r
+                               return FALSE;\r
+               }\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function getColumnMeta($column)\r
+       {\r
+               $result = array();\r
+               if ( MysqlPDO::$handler == 'mysql_' )\r
+               {\r
+                       $result['name'] = @call_user_func(MysqlPDO::$handler . 'field_name', $this->result, $column);\r
+               }\r
+               return $result;\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function nextRowset()\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       public function rowCount()\r
+       {\r
+               return @call_user_func(MysqlPDO::$handler . 'affected_rows', $this->dbcon);\r
+       }\r
+\r
+       /**\r
+        * Not supported\r
+        */\r
+       public function setAttribute($attribute, $value)\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       public function setFetchMode($mode, &$mode_argument, $ctorargs)\r
+       {\r
+               switch ( $mode )\r
+               {\r
+                       case PDO::FETCH_COLUMN:\r
+                               $this->def_col_num = $mode_argument;\r
+                               break;\r
+                       case PDO::FETCH_CLASS:\r
+                               $this->def_class_name = $mode_argument;\r
+                               $this->def_ctorargs = $ctorargs;\r
+                               break;\r
+                       case PDO::FETCH_INTO:\r
+                               $this->bind_object = &$mode_argument;\r
+                               return FALSE; // Not supported\r
+                       default:\r
+                               $this->def_fetch_mode = $mode;\r
+                               break;\r
+               }\r
+               return 1;\r
+       }\r
+\r
+       // Iterator\r
+       private $iterator_value;\r
+\r
+       function rewind()\r
+       {}\r
+\r
+       function next()\r
+       {}\r
+\r
+       function valid()\r
+       {\r
+               return ($this->iterator_value = $this->fetch());\r
+       }\r
+\r
+       function current()\r
+       {\r
+               return $this->iterator_value;\r
+       }\r
+\r
+       function key()\r
+       {\r
+               return null;\r
+       }\r
+}\r
+=======
 <?php
 /*
  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
@@ -659,3 +1323,4 @@ class MysqlPDOStatement implements Iterator
                return null;
        }
 }
+>>>>>>> skinnable-master