/redbean/rb.php
PHP | 8325 lines | 3206 code | 220 blank | 4899 comment | 388 complexity | 54e32e252d292266a366dbd058c10e64 MD5 | raw file
Possible License(s): GPL-3.0, BSD-3-Clause, LGPL-2.1, BSD-2-Clause
Large files files are truncated, but you can click here to view the full file
- <?php /*
- .______.
- _______ ____ __| _/\_ |__ ____ _____ ____
- \_ __ \_/ __ \ / __ | | __ \_/ __ \\__ \ / \
- | | \/\ ___
- |__| \___ >____ | |___ /\___ >____ /___| /
- \/ \/ \/ \/ \/ \/
- RedBean Database Objects -
- Written by Gabor de Mooij (c) copyright 2010
- RedBean is DUAL Licensed BSD and GPLv2. You may choose the license that fits
- best for your project.
- BSD/GPLv2 License
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of RedBeanPHP nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY GABOR DE MOOIJ ''AS IS'' AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL GABOR DE MOOIJ BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- RedBeanPHP is Written by Gabor de Mooij (G.J.G.T de Mooij) Copyright (c) 2010.
- GPLv2 LICENSE
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
- Preamble
- The licenses for most software are designed to take away your
- freedom to share and change it. By contrast, the GNU General Public
- License is intended to guarantee your freedom to share and change free
- software--to make sure the software is free for all its users. This
- General Public License applies to most of the Free Software
- Foundation's software and to any other program whose authors commit to
- using it. (Some other Free Software Foundation software is covered by
- the GNU Lesser General Public License instead.) You can apply it to
- your programs, too.
- When we speak of free software, we are referring to freedom, not
- price. Our General Public Licenses are designed to make sure that you
- have the freedom to distribute copies of free software (and charge for
- this service if you wish), that you receive source code or can get it
- if you want it, that you can change the software or use pieces of it
- in new free programs; and that you know you can do these things.
- To protect your rights, we need to make restrictions that forbid
- anyone to deny you these rights or to ask you to surrender the rights.
- These restrictions translate to certain responsibilities for you if you
- distribute copies of the software, or if you modify it.
- For example, if you distribute copies of such a program, whether
- gratis or for a fee, you must give the recipients all the rights that
- you have. You must make sure that they, too, receive or can get the
- source code. And you must show them these terms so they know their
- rights.
- We protect your rights with two steps: (1) copyright the software, and
- (2) offer you this license which gives you legal permission to copy,
- distribute and/or modify the software.
- Also, for each author's protection and ours, we want to make certain
- that everyone understands that there is no warranty for this free
- software. If the software is modified by someone else and passed on, we
- want its recipients to know that what they have is not the original, so
- that any problems introduced by others will not reflect on the original
- authors' reputations.
- Finally, any free program is threatened constantly by software
- patents. We wish to avoid the danger that redistributors of a free
- program will individually obtain patent licenses, in effect making the
- program proprietary. To prevent this, we have made it clear that any
- patent must be licensed for everyone's free use or not licensed at all.
- The precise terms and conditions for copying, distribution and
- modification follow.
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- 0. This License applies to any program or other work which contains
- a notice placed by the copyright holder saying it may be distributed
- under the terms of this General Public License. The "Program", below,
- refers to any such program or work, and a "work based on the Program"
- means either the Program or any derivative work under copyright law:
- that is to say, a work containing the Program or a portion of it,
- either verbatim or with modifications and/or translated into another
- language. (Hereinafter, translation is included without limitation in
- the term "modification".) Each licensee is addressed as "you".
- Activities other than copying, distribution and modification are not
- covered by this License; they are outside its scope. The act of
- running the Program is not restricted, and the output from the Program
- is covered only if its contents constitute a work based on the
- Program (independent of having been made by running the Program).
- Whether that is true depends on what the Program does.
- 1. You may copy and distribute verbatim copies of the Program's
- source code as you receive it, in any medium, provided that you
- conspicuously and appropriately publish on each copy an appropriate
- copyright notice and disclaimer of warranty; keep intact all the
- notices that refer to this License and to the absence of any warranty;
- and give any other recipients of the Program a copy of this License
- along with the Program.
- You may charge a fee for the physical act of transferring a copy, and
- you may at your option offer warranty protection in exchange for a fee.
- 2. You may modify your copy or copies of the Program or any portion
- of it, thus forming a work based on the Program, and copy and
- distribute such modifications or work under the terms of Section 1
- above, provided that you also meet all of these conditions:
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
- These requirements apply to the modified work as a whole. If
- identifiable sections of that work are not derived from the Program,
- and can be reasonably considered independent and separate works in
- themselves, then this License, and its terms, do not apply to those
- sections when you distribute them as separate works. But when you
- distribute the same sections as part of a whole which is a work based
- on the Program, the distribution of the whole must be on the terms of
- this License, whose permissions for other licensees extend to the
- entire whole, and thus to each and every part regardless of who wrote it.
- Thus, it is not the intent of this section to claim rights or contest
- your rights to work written entirely by you; rather, the intent is to
- exercise the right to control the distribution of derivative or
- collective works based on the Program.
- In addition, mere aggregation of another work not based on the Program
- with the Program (or with a work based on the Program) on a volume of
- a storage or distribution medium does not bring the other work under
- the scope of this License.
- 3. You may copy and distribute the Program (or a work based on it,
- under Section 2) in object code or executable form under the terms of
- Sections 1 and 2 above provided that you also do one of the following:
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
- The source code for a work means the preferred form of the work for
- making modifications to it. For an executable work, complete source
- code means all the source code for all modules it contains, plus any
- associated interface definition files, plus the scripts used to
- control compilation and installation of the executable. However, as a
- special exception, the source code distributed need not include
- anything that is normally distributed (in either source or binary
- form) with the major components (compiler, kernel, and so on) of the
- operating system on which the executable runs, unless that component
- itself accompanies the executable.
- If distribution of executable or object code is made by offering
- access to copy from a designated place, then offering equivalent
- access to copy the source code from the same place counts as
- distribution of the source code, even though third parties are not
- compelled to copy the source along with the object code.
- 4. You may not copy, modify, sublicense, or distribute the Program
- except as expressly provided under this License. Any attempt
- otherwise to copy, modify, sublicense or distribute the Program is
- void, and will automatically terminate your rights under this License.
- However, parties who have received copies, or rights, from you under
- this License will not have their licenses terminated so long as such
- parties remain in full compliance.
- 5. You are not required to accept this License, since you have not
- signed it. However, nothing else grants you permission to modify or
- distribute the Program or its derivative works. These actions are
- prohibited by law if you do not accept this License. Therefore, by
- modifying or distributing the Program (or any work based on the
- Program), you indicate your acceptance of this License to do so, and
- all its terms and conditions for copying, distributing or modifying
- the Program or works based on it.
- 6. Each time you redistribute the Program (or any work based on the
- Program), the recipient automatically receives a license from the
- original licensor to copy, distribute or modify the Program subject to
- these terms and conditions. You may not impose any further
- restrictions on the recipients' exercise of the rights granted herein.
- You are not responsible for enforcing compliance by third parties to
- this License.
- 7. If, as a consequence of a court judgment or allegation of patent
- infringement or for any other reason (not limited to patent issues),
- conditions are imposed on you (whether by court order, agreement or
- otherwise) that contradict the conditions of this License, they do not
- excuse you from the conditions of this License. If you cannot
- distribute so as to satisfy simultaneously your obligations under this
- License and any other pertinent obligations, then as a consequence you
- may not distribute the Program at all. For example, if a patent
- license would not permit royalty-free redistribution of the Program by
- all those who receive copies directly or indirectly through you, then
- the only way you could satisfy both it and this License would be to
- refrain entirely from distribution of the Program.
- If any portion of this section is held invalid or unenforceable under
- any particular circumstance, the balance of the section is intended to
- apply and the section as a whole is intended to apply in other
- circumstances.
- It is not the purpose of this section to induce you to infringe any
- patents or other property right claims or to contest validity of any
- such claims; this section has the sole purpose of protecting the
- integrity of the free software distribution system, which is
- implemented by public license practices. Many people have made
- generous contributions to the wide range of software distributed
- through that system in reliance on consistent application of that
- system; it is up to the author/donor to decide if he or she is willing
- to distribute software through any other system and a licensee cannot
- impose that choice.
- This section is intended to make thoroughly clear what is believed to
- be a consequence of the rest of this License.
- 8. If the distribution and/or use of the Program is restricted in
- certain countries either by patents or by copyrighted interfaces, the
- original copyright holder who places the Program under this License
- may add an explicit geographical distribution limitation excluding
- those countries, so that distribution is permitted only in or among
- countries not thus excluded. In such case, this License incorporates
- the limitation as if written in the body of this License.
- 9. The Free Software Foundation may publish revised and/or new versions
- of the General Public License from time to time. Such new versions will
- be similar in spirit to the present version, but may differ in detail to
- address new problems or concerns.
- Each version is given a distinguishing version number. If the Program
- specifies a version number of this License which applies to it and "any
- later version", you have the option of following the terms and conditions
- either of that version or of any later version published by the Free
- Software Foundation. If the Program does not specify a version number of
- this License, you may choose any version ever published by the Free Software
- Foundation.
- 10. If you wish to incorporate parts of the Program into other free
- programs whose distribution conditions are different, write to the author
- to ask for permission. For software which is copyrighted by the Free
- Software Foundation, write to the Free Software Foundation; we sometimes
- make exceptions for this. Our decision will be guided by the two goals
- of preserving the free status of all derivatives of our free software and
- of promoting the sharing and reuse of software generally.
- NO WARRANTY
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
- FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
- OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
- PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
- OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
- TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
- PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
- REPAIR OR CORRECTION.
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
- REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
- INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
- OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
- TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
- YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
- PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGES.
- */
- /**
- * RedBean_ObjectDatabase
- * @file RedBean/RedBean_ObjectDatabase.php
- * @description RedBean simulates an object oriented database. This interface
- * describes the API for the object database. It is the
- * abstract core of RedBean describing its main functionality.
- * @author Gabor de Mooij
- * @license BSD
- *
- *
- * (c) G.J.G.T. (Gabor) de Mooij
- * This source file is subject to the BSD/GPLv2 License that is bundled
- * with this source code in the file license.txt.
- */
- interface RedBean_ObjectDatabase {
- /**
- * This interface describes how ANY Object Database should
- * behave.For detailed descriptions of RedBean specific implementation
- * see: RedBean_OODB.
- * An Object Database should be able to load a bean using a $type and $id.
- * The $type argument indicated what kind of bean you are looking for.
- * The $id argument specifies the primary key ID; which links the bean to
- * a (series) of record(s) in the database.
- *
- * @param string $type
- * @param integer $id
- *
- * @return RedBean_OODBBean $bean
- */
- public function load( $type, $id );
- /**
- * This interface describes how ANY Object Database should
- * behave.For detailed descriptions of RedBean specific implementation
- * see: RedBean_OODB.
- * An Object Database should be able to store a RedBean_OODBBean $bean.
- *
- * @param RedBean_OODBBean $bean
- *
- * @return integer $newid
- */
- public function store( RedBean_OODBBean $bean );
- /**
- * This interface describes how ANY Object Database should
- * behave.For detailed descriptions of RedBean specific implementation
- * see: RedBean_OODB.
- *
- * @param RedBean_OODBBean $bean
- */
- public function trash( RedBean_OODBBean $bean );
- /**
- * This interface describes how ANY Object Database should
- * behave.For detailed descriptions of RedBean specific implementation
- * see: RedBean_OODB.
- *
- * @param string $type
- * @param array $ids
- *
- * @return array $beans
- */
- public function batch( $type, $ids );
- /**
- * This interface describes how ANY Object Database should
- * behave.For detailed descriptions of RedBean specific implementation
- * see: RedBean_OODB.
- *
- * @param string $type
- *
- * @return RedBean_OODBBean $bean
- */
- public function dispense( $type );
- /**
- * This interface describes how ANY Object Database should
- * behave.For detailed descriptions of RedBean specific implementation
- * see: RedBean_OODB.
- *
- * @param string $type
- *
- * @return integer $numbeans
- */
- public function count( $type );
- /**
- * This interface describes how ANY Object Database should
- * behave.For detailed descriptions of RedBean specific implementation
- * see: RedBean_OODB.
- *
- * @param string $type
- *
- * @return mixed $undefined (impl. specific)
- */
- public function wipe( $type );
- /**
- * =====================================================
- * Note: that not all methods in OODB are mentioned here;
- * freeze(), isFrozen(), convertToBeans() etc. are extra
- * services provided by OODB but not required for the
- * Object Database interface to be implemented!
- *
- * If you are writing Hyper-portable code, please do
- * not rely on OODB specific methods...!
- * =====================================================
- *
- */
- }
- /**
- * RedBean Plugin
- * @file RedBean/Plugin.php
- * @description Marker interface for plugins.
- *
- * @author Gabor de Mooij
- * @license BSD
- *
- * (c) G.J.G.T. (Gabor) de Mooij
- * This source file is subject to the BSD/GPLv2 License that is bundled
- * with this source code in the file license.txt.
- */
- interface RedBean_Plugin {
- }
- /**
- * Interface for database drivers
- * @file RedBean/Driver.php
- * @description Describes the API for database classes
- * The Driver API conforms to the ADODB pseudo standard
- * for database drivers.
- * @author Gabor de Mooij
- * @license BSD
- *
- *
- * (c) G.J.G.T. (Gabor) de Mooij
- * This source file is subject to the BSD/GPLv2 License that is bundled
- * with this source code in the file license.txt.
- */
- interface RedBean_Driver {
- /**
- * Implements Singleton (or multiton)
- * Requests an instance of the database
- * Returns an instance of the driver Driver wrapper.
- *
- * @param string $dsn Database connection string
- * @param string $user DB account to be used
- * @param string $pass password
- * @param string $dbname name of the database you
- *
- * @return RedBean_Driver $driver driver wrapper instance
- */
- public static function getInstance( $host, $user, $pass, $dbname );
- /**
- * Runs a query and fetches results as a multi dimensional array.
- *
- * @param string $sql SQL to be executed
- *
- * @return array $results result
- */
- public function GetAll( $sql, $aValues=array() );
- /**
- * Runs a query and fetches results as a column.
- *
- * @param string $sql SQL Code to execute
- *
- * @return array $results Resultset
- */
- public function GetCol( $sql, $aValues=array() );
- /**
- * Runs a query an returns results as a single cell.
- *
- * @param string $sql SQL to execute
- *
- * @return mixed $cellvalue result cell
- */
- public function GetCell( $sql, $aValues=array() );
- /**
- * Runs a query and returns a flat array containing the values of
- * one row.
- *
- * @param string $sql SQL to execute
- *
- * @return array $row result row
- */
- public function GetRow( $sql, $aValues=array() );
- /**
- * Returns the error constant of the most
- * recent error.
- *
- * @return mixed $error error code
- */
- public function ErrorNo();
- /**
- * Returns the error message of the most recent
- * error.
- *
- * @return string $message error message
- */
- public function Errormsg();
- /**
- * Executes SQL code and allows key-value binding.
- * This function allows you to provide an array with values to bind
- * to query parameters. For instance you can bind values to question
- * marks in the query. Each value in the array corresponds to the
- * question mark in the query that matches the position of the value in the
- * array. You can also bind values using explicit keys, for instance
- * array(":key"=>123) will bind the integer 123 to the key :key in the
- * SQL. This method has no return value.
- *
- * @param string $sql SQL Code to execute
- * @param array $aValues Values to bind to SQL query
- *
- * @return void
- */
- public function Execute( $sql, $aValues=array() );
- /**
- * Escapes a string for use in SQL using the currently selected
- * driver driver.
- *
- * @param string $string string to be escaped
- *
- * @return string $string escaped string
- */
- public function Escape( $str );
- /**
- * Returns the latest insert ID if driver does support this
- * feature.
- *
- * @return integer $id primary key ID
- */
- public function GetInsertID();
- /**
- * Returns the number of rows affected by the most recent query
- * if the currently selected driver driver supports this feature.
- *
- * @return integer $numOfRows number of rows affected
- */
- public function Affected_Rows();
- /**
- * Toggles debug mode. In debug mode the driver will print all
- * SQL to the screen together with some information about the
- * results. All SQL code that passes through the driver will be
- * passes on to the screen for inspection.
- * This method has no return value.
- *
- * @param boolean $trueFalse turn on/off
- *
- * @return void
- */
- public function setDebugMode( $tf );
- /**
- * Returns a raw result resource from the underlying driver driver.
- *
- * @return Resource $driverResult driver result resource object
- */
- public function GetRaw();
- /**
- * Starts a transaction.
- * This method is part of the transaction mechanism of
- * RedBeanPHP. All queries in a transaction are executed together.
- * In case of an error all commands will be rolled back so none of the
- * SQL in the transaction will affect the DB. Using transactions is
- * considered best practice.
- * This method has no return value.
- *
- * @return void
- */
- public function CommitTrans();
- /**
- * Commits a transaction.
- * This method is part of the transaction mechanism of
- * RedBeanPHP. All queries in a transaction are executed together.
- * In case of an error all commands will be rolled back so none of the
- * SQL in the transaction will affect the DB. Using transactions is
- * considered best practice.
- * This method has no return value.
- *
- * @return void
- */
- public function StartTrans();
- /**
- * Rolls back a transaction.
- * This method is part of the transaction mechanism of
- * RedBeanPHP. All queries in a transaction are executed together.
- * In case of an error all commands will be rolled back so none of the
- * SQL in the transaction will affect the DB. Using transactions is
- * considered best practice.
- * This method has no return value.
- *
- * @return void
- */
- public function FailTrans();
- }
- /**
- * PDO Driver
- * @file RedBean/PDO.php
- * @description PDO Driver
- * This Driver implements the RedBean Driver API
- * @author Desfrenes
- * @license BSD
- *
- *
- * (c) Desfrenes & Gabor de Mooij
- * This source file is subject to the BSD/GPLv2 License that is bundled
- * with this source code in the file license.txt.
- *
- */
- class RedBean_Driver_PDO implements RedBean_Driver {
- /**
- * @var string
- * Contains database DSN for connecting to database.
- */
- private $dsn;
- /**
- * @var RedBean_Driver_PDO
- * Holds the instance of this class.
- */
- private static $instance;
- /**
- * @var boolean
- * Whether we are in debugging mode or not.
- */
- private $debug = false;
- /**
- * @var PDO
- * Holds the PDO instance.
- */
- private $pdo;
- /**
- * @var integer
- * Holds integer number of affected rows from latest query
- * if driver supports this feature.
- */
- private $affected_rows;
- /**
- * @var resource
- * Holds result resource.
- */
- private $rs;
- /**
- * @var boolean
- * Flag, indicates whether SQL execution has taken place.
- */
- private $exc =0;
- /**
- * @var array
- * Contains arbitrary connection data.
- *
- */
- private $connectInfo = array();
- /**
- * @var bool
- * Whether you want to use classic String Only binding -
- * backward compatibility.
- */
- public $flagUseStringOnlyBinding = false;
- /**
- *
- * @var boolean
- *
- * Whether we are currently connected or not.
- * This flag is being used to delay the connection until necessary.
- * Delaying connections is a good practice to speed up scripts that
- * don't need database connectivity but for some reason want to
- * init RedbeanPHP.
- */
- private $isConnected = false;
- /**
- * Returns an instance of the PDO Driver.
- *
- * @param string $dsn Database connection string
- * @param string $user DB account to be used
- * @param string $pass password
- * @param string $dbname name of the database you
- *
- * @return RedBean_Driver_PDO $pdo PDO wrapper instance
- */
- public static function getInstance($dsn, $user, $pass, $dbname) {
- if(is_null(self::$instance)) {
- self::$instance = new RedBean_Driver_PDO($dsn, $user, $pass);
- }
- return self::$instance;
- }
- /**
- * Constructor. You may either specify dsn, user and password or
- * just give an existing PDO connection.
- * Examples:
- * $driver = new RedBean_Driver_PDO($dsn, $user, $password);
- * $driver = new RedBean_Driver_PDO($existingConnection);
- *
- * @param string|PDO $dsn database connection string
- * @param string $user optional
- * @param string $pass optional
- *
- * @return void
- */
- public function __construct($dsn, $user = NULL, $pass = NULL) {
- if ($dsn instanceof PDO) {
- $this->pdo = $dsn;
- $this->isConnected = true;
- $this->pdo->setAttribute(1002, 'SET NAMES utf8');
- $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
-
-
-
- $this->dsn = $this->getDatabaseType();
- } else {
- $this->dsn = $dsn;
- $this->connectInfo = array( "pass"=>$pass, "user"=>$user );
- }
- }
- /**
- * Establishes a connection to the database using PHP PDO
- * functionality. If a connection has already been established this
- * method will simply return directly. This method also turns on
- * UTF8 for the database and PDO-ERRMODE-EXCEPTION as well as
- * PDO-FETCH-ASSOC.
- *
- * @return void
- */
- public function connect() {
- if ($this->isConnected) return;
- $user = $this->connectInfo["user"];
- $pass = $this->connectInfo["pass"];
-
- $this->pdo = new PDO(
- $this->dsn,
- $user,
- $pass,
- array(1002 => 'SET NAMES utf8',
- PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
- PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
- )
- );
- $this->pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, TRUE);
- $this->isConnected = true;
- }
- /**
- * Runs a query and fetches results as a multi dimensional array.
- *
- * @param string $sql SQL to be executed
- *
- * @return array $results result
- */
- public function GetAll( $sql, $aValues=array() ) {
- $this->connect();
- $this->exc = 0;
- if ($this->debug) {
- echo "<HR>" . $sql.print_r($aValues,1);
- }
- try {
- if (strpos("pgsql",$this->dsn)===0) {
- $s = $this->pdo->prepare($sql, array(PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT => true));
- }
- else {
- $s = $this->pdo->prepare($sql);
- }
- if ($this->flagUseStringOnlyBinding) {
- $s->execute($aValues);
- }
- else {
- foreach($aValues as $key=>&$value) {
- if (is_integer($key)) {
- if (ctype_digit(strval($value)) && $value < 2147483648) { $s->bindParam($key+1,$value,PDO::PARAM_INT); }
- else $s->bindParam($key+1,$value,PDO::PARAM_STR);
- }
- else {
- if (ctype_digit(strval($value)) && $value < 2147483648) $s->bindParam($key,$value,PDO::PARAM_INT);
- else $s->bindParam($key,$value,PDO::PARAM_STR);
- }
- }
- $s->execute();
- }
-
- if ($s->columnCount()) {
- $this->rs = $s->fetchAll();
-
-
- }
- else {
- $this->rs = null;
- }
-
- $rows = $this->rs;
- }catch(PDOException $e) {
-
-
- if (version_compare(PHP_VERSION, '5.3.0', '<')) {
- $x = new RedBean_Exception_SQL( $e->getMessage(), 0);
- }
- else {
- $x = new RedBean_Exception_SQL( $e->getMessage(), 0, $e );
- }
- $x->setSQLState( $e->getCode() );
- throw $x;
- }
- if(!$rows) {
- $rows = array();
- }
- if ($this->debug) {
- if (count($rows) > 0) {
- echo "<br><b style='color:green'>resultset: " . count($rows) . " rows</b>";
- }
- }
- return $rows;
- }
- /**
- * Runs a query and fetches results as a column.
- *
- * @param string $sql SQL Code to execute
- *
- * @return array $results Resultset
- */
- public function GetCol($sql, $aValues=array()) {
- $this->connect();
- $this->exc = 0;
- $rows = $this->GetAll($sql,$aValues);
- $cols = array();
- if ($rows && is_array($rows) && count($rows)>0) {
- foreach ($rows as $row) {
- $cols[] = array_shift($row);
- }
- }
- return $cols;
- }
- /**
- * Runs a query an returns results as a single cell.
- *
- * @param string $sql SQL to execute
- *
- * @return mixed $cellvalue result cell
- */
- public function GetCell($sql, $aValues=array()) {
- $this->connect();
- $this->exc = 0;
- $arr = $this->GetAll($sql,$aValues);
- $row1 = array_shift($arr);
- $col1 = array_shift($row1);
- return $col1;
- }
- /**
- * Runs a query and returns a flat array containing the values of
- * one row.
- *
- * @param string $sql SQL to execute
- *
- * @return array $row result row
- */
- public function GetRow($sql, $aValues=array()) {
- $this->connect();
- $this->exc = 0;
- $arr = $this->GetAll($sql, $aValues);
- return array_shift($arr);
- }
- /**
- * Returns the error constant of the most
- * recent error.
- *
- * @return mixed $error error code
- */
- public function ErrorNo() {
- $this->connect();
- if (!$this->exc) return 0;
- $infos = $this->pdo->errorInfo();
- return $infos[1];
- }
- /**
- * Returns the error message of the most recent
- * error.
- *
- * @return string $message error message
- */
- public function Errormsg() {
- $this->connect();
- if (!$this->exc) return "";
- $infos = $this->pdo->errorInfo();
- return $infos[2];
- }
- /**
- * Executes SQL code and allows key-value binding.
- * This function allows you to provide an array with values to bind
- * to query parameters. For instance you can bind values to question
- * marks in the query. Each value in the array corresponds to the
- * question mark in the query that matches the position of the value in the
- * array. You can also bind values using explicit keys, for instance
- * array(":key"=>123) will bind the integer 123 to the key :key in the
- * SQL. This method has no return value.
- *
- * @param string $sql SQL Code to execute
- * @param array $aValues Values to bind to SQL query
- *
- * @return void
- */
- public function Execute( $sql, $aValues=array() ) {
- $this->connect();
- $this->exc = 0;
- if ($this->debug) {
- echo "<HR>" . $sql.print_r($aValues,1);
- }
- try {
- if (strpos("pgsql",$this->dsn)===0) {
- $s = $this->pdo->prepare($sql, array(PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT => true));
- }
- else {
- $s = $this->pdo->prepare($sql);
- }
-
- if ($this->flagUseStringOnlyBinding) {
- $s->execute($aValues);
- }
- else {
-
- foreach($aValues as $key=>&$value) {
- if (is_integer($key)) {
- if (ctype_digit(strval($value)) && $value < 2147483648) { $s->bindParam($key+1,$value,PDO::PARAM_INT); }
- else $s->bindParam($key+1,$value,PDO::PARAM_STR);
- }
- else {
- if (ctype_digit(strval($value)) && $value < 2147483648) $s->bindParam($key,$value,PDO::PARAM_INT);
- else $s->bindParam($key,$value,PDO::PARAM_STR);
- }
- }
- $s->execute();
- }
- $this->affected_rows=$s->rowCount();
- return $this->affected_rows;
- }
- catch(PDOException $e) {
-
-
- if (version_compare(PHP_VERSION, '5.3.0', '<')) {
- $x = new RedBean_Exception_SQL( $e->getMessage(), 0);
- }
- else {
- $x = new RedBean_Exception_SQL( $e->getMessage(), 0, $e );
- }
- $x->setSQLState( $e->getCode() );
- throw $x;
- }
- }
- /**
- * Escapes a string for use in SQL using the currently selected
- * PDO driver.
- *
- * @param string $string string to be escaped
- *
- * @return string $string escaped string
- */
- public function Escape( $str ) {
- $this->connect();
- return substr(substr($this->pdo->quote($str), 1), 0, -1);
- }
- /**
- * Returns the latest insert ID if driver does support this
- * feature.
- *
- * @return integer $id primary key ID
- */
- public function GetInsertID() {
- $this->connect();
- return (int) $this->pdo->lastInsertId();
- }
- /**
- * Returns the number of rows affected by the most recent query
- * if the currently selected PDO driver supports this feature.
- *
- * @return integer $numOfRows number of rows affected
- */
- public function Affected_Rows() {
- $this->connect();
- return (int) $this->affected_rows;
- }
- /**
- * Toggles debug mode. In debug mode the driver will print all
- * SQL to the screen together with some information about the
- * results. All SQL code that passes through the driver will be
- * passes on to the screen for inspection.
- * This method has no return value.
- *
- * @param boolean $trueFalse turn on/off
- *
- * @return void
- */
- public function setDebugMode( $tf ) {
- $this->connect();
- $this->debug = (bool)$tf;
- }
- /**
- * Returns a raw result resource from the underlying PDO driver.
- *
- * @return Resource $PDOResult PDO result resource object
- */
- public function GetRaw() {
- $this->connect();
- return $this->rs;
- }
- /**
- * Starts a transaction.
- * This method is part of the transaction mechanism of
- * RedBeanPHP. All queries in a transaction are executed together.
- * In case of an error all commands will be rolled back so none of the
- * SQL in the transaction will affect the DB. Using transactions is
- * considered best practice.
- * This method has no return value.
- *
- * @return void
- */
- public function StartTrans() {
- $this->connect();
- $this->pdo->beginTransaction();
- }
- /**
- * Commits a transaction.
- * This method is part of the transaction mechanism of
- * RedBeanPHP. All queries in a transaction are executed together.
- * In case of an error all commands will be rolled back so none of the
- * SQL in the transaction will affect the DB. Using transactions is
- * considered best practice.
- * This method has no return value.
- *
- * @return void
- */
- public function CommitTrans() {
- $this->connect();
- $this->pdo->commit();
- }
- /**
- * Rolls back a transaction.
- * This method is part of the transaction mechanism of
- * RedBeanPHP. All queries in a transaction are executed together.
- * In case of an error all commands will be rolled back so none of the
- * SQL in the transaction will affect the DB. Using transactions is
- * considered best practice.
- * This method has no return value.
- *
- * @return void
- */
- public function FailTrans() {
- $this->connect();
- $this->pdo->rollback();
- }
- /**
- * Returns the name of the database type/brand: i.e. mysql, db2 etc.
- *
- * @return string $typeName database identification
- */
- public function getDatabaseType() {
- $this->connect();
- return $this->pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
- }
- /**
- * Returns the version number of the database.
- *
- * @return mixed $version version number of the database
- */
- public function getDatabaseVersion() {
- $this->connect();
- return $this->pdo->getAttribute(PDO::ATTR_CLIENT_VERSION);
- }
- /**
- * Returns the underlying PHP PDO instance.
- *
- * @return PDO $pdo PDO instance used by PDO wrapper
- */
- public function getPDO() {
- $this->connect();
- return $this->pdo;
- }
- }
- /**
- * RedBean_OODBBean (Object Oriented DataBase Bean)
- * @file RedBean/RedBean_OODBBean.php
- * @description The Bean class used for passing information
- * @author Gabor de Mooij
- * @license BSD
- *
- *
- * (c) G.J.G.T. (Gabor) de Mooij
- * This source file is subject to the BSD/GPLv2 License that is bundled
- * with this source code in the file license.txt.
- */
- class RedBean_OODBBean implements IteratorAggregate, ArrayAccess {
- private $properties = array();
- /**
- * Meta Data storage. This is the internal property where all
- * Meta information gets stored.
- * @var array
- */
- private $__info = NULL;
- public function getIterator() {
- return new ArrayIterator($this->properties);
- }
- /**
- * Imports all values in associative array $array. Every key is used
- * for a property and every value will be assigned to the property
- * identified by the key. So basically this method converts the
- * associative array to a bean by loading the array. You can filter
- * the values using the $selection parameter. If $selection is boolean
- * false, no filtering will be applied. If $selection is an array
- * only the properties specified (as values) in the $selection
- * array will be taken into account. To skip a property, omit it from
- * the $selection array. Also, instead of providing an array you may
- * pass a comma separated list of property names. This method is
- * chainable because it returns its own object.
- * Imports data into bean
- * @param array $array
- * @param mixed $selection
- * @param boolean $notrim
- * @return RedBean_OODBBean $this
- */
- public function import( $arr, $selection=false, $notrim=false ) {
- if (is_string($selection)) $selection = explode(",",$selection);
-
- if (!$notrim && is_array($selection)) foreach($selection as $k=>$s){ $selection[$k]=trim($s); }
- foreach($arr as $k=>$v) {
- if ($k != "__info") {
- if (!$selection || ($selection && in_array($k,$selection))) {
- $this->$k = $v;
- }
- }
- }
- return $this;
- }
- /**
- * Exports the bean as an array.
- * This function exports the contents of a bean to an array and returns
- * the resulting array. If $meta eq uals boolean TRUE, then the array will
- * also contain the __info section containing the meta data inside the
- * RedBean_OODBBean Bean object.
- * @param boolean $meta
- * @return array $arr
- */
- public function export($meta = false) {
- $arr = array();
- $arr = $this->properties;
- if ($meta) $arr["__info"] = $this->__info;
- return $arr;
- }
- /**
- * Implements isset() function for use as an array.
- * Returns whether bean has an element with key
- * named $property. Returns TRUE if such an element exists
- * and FALSE otherwise.
- * @param string $property
- * @return boolean $hasProperty
- */
- public function __isset( $property ) {
- return (isset($this->properties[$property]));
- }
- /**
- * Magic Getter. Gets the value for a specific property in the bean.
- * If the property does not exist this getter will make sure no error
- * occurs. This is because RedBean allows you to query (probe) for
- * properties. If the property can not be found this method will
- * return NULL instead.
- * @param string $property
- * @return mixed $value
- */
- public function __get( $property ) {
- if (!isset($this->properties[$property])) return NULL;
- return $this->properties[$property];
- }
- /**
- * Magic Setter. Sets the value for a specific property.
- * This setter acts as a hook for OODB to mark beans as tainted.
- * The tainted meta property can be retrieved using getMeta("tainted").
- * The tainted meta property indicates whether a bean has been modified and
- * can be used in various caching mechanisms.
- * @param string $property
- * @param mixed $value
- */
- public function __set( $property, $value ) {
- $this->setMeta("tainted",true);
- if ($value===false) {
- $value = "0";
- }
- if ($value===true) {
- $value = "1";
- }
- $this->properties[$property] = $value;
- }
- /**
- * Returns the value of a meta property. A meta property
- * contains extra information about the bean object that will not
- * get stored in the database. Meta information is used to instruct
- * RedBean as well as other systems how to deal with the bean.
- * For instance: $bean->setMeta("buildcommand.unique.0", array(
- * "column1", "column2", "column3") );
- * Will add a UNIQUE constaint for the bean on columns: column1, column2 and
- * column 3.
- * To access a Meta property we use a dot separated notation.
- * If the property cannot be found this getter will return NULL instead.
- * @param string $path
- * @param mixed $default
- * @return mixed $value
- */
- public function getMeta( $path, $default = NULL) {
- return (isset($this->__info[$path])) ? $this->__info[$path] : $default;
- }
- /**
- * Stores a value in the specified Meta information property. $value contains
- * the value you want to store in the Meta section of the bean and $path
- * specifies the dot separated path to the property. For instance "my.meta.property".
- * If "my" and "meta" do not exist they will be created automatically.
- * @param string $path
- * @param mixed $value
- */
- public function setMeta( $path, $value ) {
- $this->__info[$path] = $value;
- }
- /**
- * Copies the meta information of the specified bean
- * This is a convenience method to enable you to
- * exchange meta information easily.
- * @param RedBean_OODBBean $bean
- * @return RedBean_OODBBean
- */
- public function copyMetaFrom( RedBean_OODBBean $bean ) {
- $this->__info = $bean->__info;
- return $this;
- }
- /**
- * Sleep function fore serialize() call. This will be invoked if you
- * perform a serialize() operation.
- *
- * @return mixed $array
- */
- public function __sleep() {
-
- return array('properties','__info');
- }
- /**
- * Reroutes a call to Model if exists. (new fuse)
- * @param string $method
- * @param array $args
- * @return mixed $mixed
- */
- public function __call($method, $args) {
- return null;
- if (!isset($this->__info["model"])) {
-
- $modelName = RedBean_ModelHelper::getModelName( $this->getMeta("type") );
- if (!class_exists($modelName)) return null;
- $obj = new $modelName();
- $obj->loadBean($this);
- $this->__info["model"] = $obj;
- }
- if (!method_exists($this->__info["model"],$method)) return null;
- return call_user_func_array(array($this->__info["model"],$method), $args);
- }
- /**
- * Implementation of __toString Method
- * Routes call to Model.
- * @return string $string
- */
- public function __toString() {
- return $this->__call('__toString',array());
- }
- /**
- * Implementation of Array Access Interface, you can access bean objects
- * like an array.
- * Call gets routed to __set.
- *
- * @param mixed $offset offset string
- * @param mixed $value value
- *
- * @return void
- */
- public function offsetSet($offset, $value) {
- $this->__set($offset, $value);
- }
- /**
- * Implementation of Array Access Interface, you can access bean objects
- * like an array.
- *
- * @param mixed $offset property
- *
- * @return
- */
- public function offsetExists($offset) {
- return isset($this->properties[$offset]);
- }
- /**
- * Implementation of Array Access Interface, you can access bean objects
- * like an array.
- * Unsets a value from the array/bean.
- *
- * @param mixed $offset property
- *
- * @return
- */
- public function offsetUnset($offset) {
- unset($this->properties[$offset]);
- }
- /**
- * Implementation of Array Access Interface, you can access bean objects
- * like an array.
- * Returns value of a property.
- *
- * @param mixed $offset property
- *
- * @return
- */
- public function offsetGet($offset) {
- return $this->__get($offset);
- }
- }
- /**
- * Observable
- * Base class for Observables
- * @file RedBean/Observable.php
- * @description Part of the observer pattern in RedBean
- * @author Gabor de Mooij
- * @license BSD
- *
- *
- * (c) G.J.G.T. (Gabor) de Mooij
- * This source file is subject to the BSD/GPLv2 License that is bundled
- * with this source code in the file license.txt.
- */
- abstract class RedBean_Observable {
- /**
- *
- * @var array
- */
- private $observers = array();
- /**
- * Adds a listener to this instance
- * @param $eventname
- * @param $observer
- * @return unknown_type
- */
- public function addEventListener( $eventname, RedBean_Observer $observer ) {
- if (!isset($this->observers[ $eventname ])) {
- $this->observers[ $eventname ] = array();
- }
-
- foreach($this->observers[$eventname] as $o) if ($o==$observer) return;
- $this->observers[ $eventname ][] = $observer;
- }
- /**
- * Sends an event (signal) to the registered listeners
- * @param $eventname
- * @return unknown_type
- */
- public function signal( $eventname, $info ) {
- if (!isset($this->observers[ $eventname ])) {
- $this->observers[ $eventname ] = array();
- }
- foreach($this->observers[$eventname] as $observer) {
- $observer->onEvent( $eventname, $info );
- }
- }
- }
- /**
- * Observer
- * @file RedBean/Observer.php
- * @description Part of the observer pattern in RedBean
- * @author Gabor de Mooij
- * @license BSD
- *
- *
- * (c) G.J.G.T. (Gabor) de Mooij
- * This source file is subject to the BSD/GPLv2 License that is bundled
- * with this source code in the file license.txt.
- */
- interface RedBean_Observer {
- /**
- * Part of the RedBean Observer Infrastructure.
- * @param string $eventname
- * @param RedBean_OODBBean $bean
- */
- public function onEvent( $eventname, $bean );
- }
- /**
- * Adapter Interface
- * @file RedBean/Adapter.php
- * @description Describes the API for a RedBean Database Adapter.
- * @author Gabor de Mooij
- * @license BSD
- *
- * (c) G.J.G.T. (Gabor) de Mooij
- * This source file is subject to the BSD/GPLv2 License that is bundled
- * with this source code in the file license.txt.
- *
- */
- interface RedBean_Adapter {
- /**
- * Returns the latest SQL statement
- *
- * @return string $SQLString SQLString
- */
- public function getSQL();
- /**
- * Escapes a value for usage in an SQL statement
- *
- * @param string $sqlvalue value
- */
- public function escape( $sqlvalue );
- /**
- * Executes an SQL Statement using an array of values to bind
- * If $noevent is TRUE then this function will not signal its
- * observers to notify about the SQL execution; this to prevent
- * infinite recursion when using observers.
- *
- * @param string $sql SQL
- * @param array $aValues values
- * @param boolean $noevent no event firing
- */
- public function exec( $sql , $aValues=array(), $noevent=false);
- /**
- * Executes an SQL Query and returns a resultset.
- * This method returns a multi dimensional resultset similar to getAll
- * The values array can be used to bind values to the place holders in the
- * SQL query.
- *
- * @param string $sql SQL
- * @param array $aValues values
- */
- public function get( $sql, $aValues = array() );
- /**
- * Executes an SQL Query and returns a resultset.
- * This method returns a single row (one array) resultset.
- * The values array can be used to bind values to the place holders in the
- * SQL query.
- *
- * @param string $sql SQL
- * @param array $aValues values to bind
- *
- * @return array $aMultiDimArray row
- */
- public function getRow( $sql, $aValues = array() );
- /**
- * Executes an SQL Query and returns a resultset.
- * This method returns a single column (one array) resultset.
- * The values array can be used to bind values to the place holders in the
- * SQL query.
- *
- * @param string $sql SQL
- * @param array $aValues values to bind
- *
- * @return array $aSingleDimArray column
- */
- …
Large files files are truncated, but you can click here to view the full file