📄 sqlstore.php
字号:
<?php/** * SQL-backed OpenID stores. * * PHP versions 4 and 5 * * LICENSE: See the COPYING file included in this distribution. * * @package OpenID * @author JanRain, Inc. <openid@janrain.com> * @copyright 2005 Janrain, Inc. * @license http://www.gnu.org/copyleft/lesser.html LGPL *//** * Require the PEAR DB module because we'll need it for the SQL-based * stores implemented here. We silence any errors from the inclusion * because it might not be present, and a user of the SQL stores may * supply an Auth_OpenID_DatabaseConnection instance that implements * its own storage. */global $__Auth_OpenID_PEAR_AVAILABLE;$__Auth_OpenID_PEAR_AVAILABLE = @include_once 'DB.php';/** * @access private */require_once 'Auth/OpenID/Interface.php';require_once 'Auth/OpenID/Nonce.php';/** * @access private */require_once 'Auth/OpenID.php';/** * @access private */require_once 'Auth/OpenID/Nonce.php';/** * This is the parent class for the SQL stores, which contains the * logic common to all of the SQL stores. * * The table names used are determined by the class variables * associations_table_name and nonces_table_name. To change the name * of the tables used, pass new table names into the constructor. * * To create the tables with the proper schema, see the createTables * method. * * This class shouldn't be used directly. Use one of its subclasses * instead, as those contain the code necessary to use a specific * database. If you're an OpenID integrator and you'd like to create * an SQL-driven store that wraps an application's database * abstraction, be sure to create a subclass of * {@link Auth_OpenID_DatabaseConnection} that calls the application's * database abstraction calls. Then, pass an instance of your new * database connection class to your SQLStore subclass constructor. * * All methods other than the constructor and createTables should be * considered implementation details. * * @package OpenID */class Auth_OpenID_SQLStore extends Auth_OpenID_OpenIDStore { /** * This creates a new SQLStore instance. It requires an * established database connection be given to it, and it allows * overriding the default table names. * * @param connection $connection This must be an established * connection to a database of the correct type for the SQLStore * subclass you're using. This must either be an PEAR DB * connection handle or an instance of a subclass of * Auth_OpenID_DatabaseConnection. * * @param associations_table: This is an optional parameter to * specify the name of the table used for storing associations. * The default value is 'oid_associations'. * * @param nonces_table: This is an optional parameter to specify * the name of the table used for storing nonces. The default * value is 'oid_nonces'. */ function Auth_OpenID_SQLStore($connection, $associations_table = null, $nonces_table = null) { global $__Auth_OpenID_PEAR_AVAILABLE; $this->associations_table_name = "oid_associations"; $this->nonces_table_name = "oid_nonces"; // Check the connection object type to be sure it's a PEAR // database connection. if (!(is_object($connection) && (is_subclass_of($connection, 'db_common') || is_subclass_of($connection, 'auth_openid_databaseconnection')))) { trigger_error("Auth_OpenID_SQLStore expected PEAR connection " . "object (got ".get_class($connection).")", E_USER_ERROR); return; } $this->connection = $connection; // Be sure to set the fetch mode so the results are keyed on // column name instead of column index. This is a PEAR // constant, so only try to use it if PEAR is present. Note // that Auth_Openid_Databaseconnection instances need not // implement ::setFetchMode for this reason. if ($__Auth_OpenID_PEAR_AVAILABLE) { $this->connection->setFetchMode(DB_FETCHMODE_ASSOC); } if ($associations_table) { $this->associations_table_name = $associations_table; } if ($nonces_table) { $this->nonces_table_name = $nonces_table; } $this->max_nonce_age = 6 * 60 * 60; // Be sure to run the database queries with auto-commit mode // turned OFF, because we want every function to run in a // transaction, implicitly. As a rule, methods named with a // leading underscore will NOT control transaction behavior. // Callers of these methods will worry about transactions. $this->connection->autoCommit(false); // Create an empty SQL strings array. $this->sql = array(); // Call this method (which should be overridden by subclasses) // to populate the $this->sql array with SQL strings. $this->setSQL(); // Verify that all required SQL statements have been set, and // raise an error if any expected SQL strings were either // absent or empty. list($missing, $empty) = $this->_verifySQL(); if ($missing) { trigger_error("Expected keys in SQL query list: " . implode(", ", $missing), E_USER_ERROR); return; } if ($empty) { trigger_error("SQL list keys have no SQL strings: " . implode(", ", $empty), E_USER_ERROR); return; } // Add table names to queries. $this->_fixSQL(); } function tableExists($table_name) { return !$this->isError( $this->connection->query( sprintf("SELECT * FROM %s LIMIT 0", $table_name))); } /** * Returns true if $value constitutes a database error; returns * false otherwise. */ function isError($value) { return PEAR::isError($value); } /** * Converts a query result to a boolean. If the result is a * database error according to $this->isError(), this returns * false; otherwise, this returns true. */ function resultToBool($obj) { if ($this->isError($obj)) { return false; } else { return true; } } /** * This method should be overridden by subclasses. This method is * called by the constructor to set values in $this->sql, which is * an array keyed on sql name. */ function setSQL() { } /** * Resets the store by removing all records from the store's * tables. */ function reset() { $this->connection->query(sprintf("DELETE FROM %s", $this->associations_table_name)); $this->connection->query(sprintf("DELETE FROM %s", $this->nonces_table_name)); } /** * @access private */ function _verifySQL() { $missing = array(); $empty = array(); $required_sql_keys = array( 'nonce_table', 'assoc_table', 'set_assoc', 'get_assoc', 'get_assocs', 'remove_assoc' ); foreach ($required_sql_keys as $key) { if (!array_key_exists($key, $this->sql)) { $missing[] = $key; } else if (!$this->sql[$key]) { $empty[] = $key; } } return array($missing, $empty); } /** * @access private */ function _fixSQL() { $replacements = array( array( 'value' => $this->nonces_table_name, 'keys' => array('nonce_table', 'add_nonce', 'clean_nonce') ), array( 'value' => $this->associations_table_name, 'keys' => array('assoc_table', 'set_assoc', 'get_assoc', 'get_assocs', 'remove_assoc', 'clean_assoc') ) ); foreach ($replacements as $item) { $value = $item['value']; $keys = $item['keys']; foreach ($keys as $k) { if (is_array($this->sql[$k])) { foreach ($this->sql[$k] as $part_key => $part_value) { $this->sql[$k][$part_key] = sprintf($part_value, $value); } } else { $this->sql[$k] = sprintf($this->sql[$k], $value); } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -