2009-06-12 08:14:29 +00:00
< ? php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Experimental pdo database class
*
2012-06-05 10:31:03 +02:00
* @ package core_dml
2009-06-12 08:14:29 +00:00
* @ copyright 2008 Andrei Bautu
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
*/
2008-05-15 21:40:00 +00:00
2010-07-25 12:57:24 +00:00
defined ( 'MOODLE_INTERNAL' ) || die ();
2012-06-05 10:31:03 +02:00
require_once ( __DIR__ . '/moodle_database.php' );
require_once ( __DIR__ . '/pdo_moodle_recordset.php' );
2008-05-15 21:40:00 +00:00
/**
* Experimental pdo database class
2012-01-20 14:39:49 +08:00
*
2012-06-05 10:31:03 +02:00
* @ package core_dml
2012-01-20 14:39:49 +08:00
* @ copyright 2008 Andrei Bautu
* @ license http :// www . gnu . org / copyleft / gpl . html GNU GPL v3 or later
2008-05-15 21:40:00 +00:00
*/
abstract class pdo_moodle_database extends moodle_database {
protected $pdb ;
2008-06-22 21:35:07 +00:00
protected $lastError = null ;
2008-05-15 21:40:00 +00:00
2008-06-22 21:35:07 +00:00
/**
2010-05-21 18:32:44 +00:00
* Constructor - instantiates the database , specifying if it ' s external ( connect to other systems ) or no ( Moodle DB )
* note this has effect to decide if prefix checks must be performed or no
2008-06-22 21:35:07 +00:00
* @ param bool true means external database used
*/
public function __construct ( $external = false ) {
parent :: __construct ( $external );
2008-05-15 21:40:00 +00:00
}
2008-06-22 21:35:07 +00:00
/**
* Connect to db
* Must be called before other methods .
2012-01-19 10:15:11 +08:00
* @ param string $dbhost The database host .
* @ param string $dbuser The database username .
* @ param string $dbpass The database username ' s password .
* @ param string $dbname The name of the database being connected to .
2008-06-22 21:35:07 +00:00
* @ param mixed $prefix string means moodle db prefix , false used for external databases where prefix not used
* @ param array $dboptions driver specific options
* @ return bool success
*/
2008-10-27 22:21:34 +00:00
public function connect ( $dbhost , $dbuser , $dbpass , $dbname , $prefix , array $dboptions = null ) {
2009-06-27 21:22:27 +00:00
$driverstatus = $this -> driver_installed ();
if ( $driverstatus !== true ) {
throw new dml_exception ( 'dbdriverproblem' , $driverstatus );
}
2008-10-27 22:21:34 +00:00
$this -> store_settings ( $dbhost , $dbuser , $dbpass , $dbname , $prefix , $dboptions );
2008-06-22 21:35:07 +00:00
2009-06-27 21:22:27 +00:00
try {
2008-06-22 21:35:07 +00:00
$this -> pdb = new PDO ( $this -> get_dsn (), $this -> dbuser , $this -> dbpass , $this -> get_pdooptions ());
// generic PDO settings to match adodb's default; subclasses can change this in configure_dbconnection
$this -> pdb -> setAttribute ( PDO :: ATTR_CASE , PDO :: CASE_LOWER );
$this -> pdb -> setAttribute ( PDO :: ATTR_ERRMODE , PDO :: ERRMODE_EXCEPTION );
2008-05-15 21:40:00 +00:00
$this -> configure_dbconnection ();
return true ;
} catch ( PDOException $ex ) {
2009-06-27 21:22:27 +00:00
throw new dml_connection_exception ( $ex -> getMessage ());
2008-05-15 21:40:00 +00:00
return false ;
}
}
2008-06-22 21:35:07 +00:00
/**
* Returns the driver - dependent DSN for PDO based on members stored by connect .
* Must be called after connect ( or after $dbname , $dbhost , etc . members have been set ) .
* @ return string driver - dependent DSN
*/
2009-06-27 21:22:50 +00:00
abstract protected function get_dsn ();
2008-08-25 21:00:47 +00:00
2008-06-22 21:35:07 +00:00
/**
* Returns the driver - dependent connection attributes for PDO based on members stored by connect .
* Must be called after $dbname , $dbhost , etc . members have been set .
* @ return array A key => value array of PDO driver - specific connection options
*/
protected function get_pdooptions () {
2008-10-27 22:21:34 +00:00
return array ( PDO :: ATTR_PERSISTENT => ! empty ( $this -> dboptions [ 'dbpersist' ]));
2008-06-22 21:35:07 +00:00
}
2008-08-25 21:00:47 +00:00
2008-05-15 21:40:00 +00:00
protected function configure_dbconnection () {
2012-06-05 10:31:03 +02:00
//TODO: not needed preconfigure_dbconnection() stuff for PDO drivers?
2008-05-15 21:40:00 +00:00
}
2008-06-22 22:53:40 +00:00
/**
* Returns general database library name
* Note : can be used before connect ()
2009-10-08 22:34:34 +00:00
* @ return string db type pdo , native
2008-06-22 22:53:40 +00:00
*/
protected function get_dblibrary () {
return 'pdo' ;
}
2008-06-22 21:35:07 +00:00
/**
* Returns localised database type name
* Note : can be used before connect ()
* @ return string
*/
public function get_name () {
2009-02-07 10:20:33 +00:00
return get_string ( 'pdo' . $this -> get_dbtype (), 'install' );
}
/**
* Returns localised database configuration help .
* Note : can be used before connect ()
* @ return string
*/
public function get_configuration_help () {
return get_string ( 'pdo' . $this -> get_dbtype () . 'help' , 'install' );
2008-06-22 21:35:07 +00:00
}
2008-05-15 21:40:00 +00:00
2008-06-22 21:35:07 +00:00
/**
* Returns localised database description
* Note : can be used before connect ()
* @ return string
*/
public function get_configuration_hints () {
return get_string ( 'databasesettingssub_' . $this -> get_dbtype () . '_pdo' , 'install' );
}
2008-05-15 21:40:00 +00:00
2008-06-22 21:35:07 +00:00
/**
* Returns database server info array
2012-01-19 10:15:11 +08:00
* @ return array Array containing 'description' and 'version' info
2008-06-22 21:35:07 +00:00
*/
public function get_server_info () {
$result = array ();
try {
$result [ 'description' ] = $this -> pdb -> getAttribute ( PDO :: ATTR_SERVER_INFO );
} catch ( PDOException $ex ) {}
try {
$result [ 'version' ] = $this -> pdb -> getAttribute ( PDO :: ATTR_SERVER_VERSION );
} catch ( PDOException $ex ) {}
return $result ;
}
2008-08-25 21:00:47 +00:00
2008-06-22 21:35:07 +00:00
/**
* Returns supported query parameter types
2012-01-19 10:15:11 +08:00
* @ return int bitmask of accepted SQL_PARAMS_ *
2008-06-22 21:35:07 +00:00
*/
protected function allowed_param_types () {
return SQL_PARAMS_QM | SQL_PARAMS_NAMED ;
}
2008-08-25 21:00:47 +00:00
2008-06-22 21:35:07 +00:00
/**
* Returns last error reported by database engine .
2010-08-22 19:06:06 +00:00
* @ return string error message
2008-06-22 21:35:07 +00:00
*/
public function get_last_error () {
return $this -> lastError ;
}
/**
2010-05-21 18:32:44 +00:00
* Function to print / save / ignore debugging messages related to SQL queries .
2008-06-22 21:35:07 +00:00
*/
protected function debug_query ( $sql , $params = null ) {
2012-12-09 18:21:38 +01:00
echo '<hr /> (' , $this -> get_dbtype (), '): ' , htmlentities ( $sql , ENT_QUOTES , 'UTF-8' );
2008-06-22 21:35:07 +00:00
if ( $params ) {
echo ' (parameters ' ;
print_r ( $params );
echo ')' ;
2008-05-15 21:40:00 +00:00
}
2008-06-22 21:35:07 +00:00
echo '<hr />' ;
}
2008-08-25 21:00:47 +00:00
2008-06-22 21:35:07 +00:00
/**
* Do NOT use in code , to be used by database_manager only !
* @ param string $sql query
* @ return bool success
*/
public function change_database_structure ( $sql ) {
2009-06-27 21:22:50 +00:00
$result = true ;
$this -> query_start ( $sql , null , SQL_QUERY_STRUCTURE );
2008-07-13 20:28:08 +00:00
try {
$this -> pdb -> exec ( $sql );
2009-01-12 18:10:50 +00:00
$this -> reset_caches ();
2008-07-13 20:28:08 +00:00
} catch ( PDOException $ex ) {
$this -> lastError = $ex -> getMessage ();
2009-06-27 21:22:50 +00:00
$result = false ;
2008-07-13 20:28:08 +00:00
}
2009-06-27 21:22:50 +00:00
$this -> query_end ( $result );
return $result ;
2008-05-15 21:40:00 +00:00
}
public function delete_records_select ( $table , $select , array $params = null ) {
2008-06-22 21:35:07 +00:00
$sql = " DELETE FROM { { $table } } " ;
if ( $select ) {
$sql .= " WHERE $select " ;
}
return $this -> execute ( $sql , $params );
}
/**
2008-08-25 21:00:47 +00:00
* Factory method that creates a recordset for return by a query . The generic pdo_moodle_recordset
2010-05-21 18:32:44 +00:00
* class should fit most cases , but pdo_moodle_database subclasses can override this method to return
2008-06-22 21:35:07 +00:00
* a subclass of pdo_moodle_recordset .
2008-08-25 21:00:47 +00:00
* @ param object $sth instance of PDOStatement
2008-06-22 21:35:07 +00:00
* @ return object instance of pdo_moodle_recordset
*/
protected function create_recordset ( $sth ) {
return new pdo_moodle_recordset ( $sth );
}
/**
* Execute general sql query . Should be used only when no other method suitable .
2012-02-27 12:30:11 +01:00
* Do NOT use this to make changes in db structure , use database_manager methods instead !
2008-06-22 21:35:07 +00:00
* @ param string $sql query
* @ param array $params query parameters
* @ return bool success
*/
public function execute ( $sql , array $params = null ) {
2009-06-27 21:22:50 +00:00
list ( $sql , $params , $type ) = $this -> fix_sql_params ( $sql , $params );
$result = true ;
$this -> query_start ( $sql , $params , SQL_QUERY_UPDATE );
2008-05-15 21:40:00 +00:00
try {
2008-06-22 21:35:07 +00:00
$sth = $this -> pdb -> prepare ( $sql );
$sth -> execute ( $params );
2008-05-15 21:40:00 +00:00
} catch ( PDOException $ex ) {
2008-06-22 21:35:07 +00:00
$this -> lastError = $ex -> getMessage ();
2009-06-27 21:22:50 +00:00
$result = false ;
2008-05-15 21:40:00 +00:00
}
2009-06-27 21:22:50 +00:00
$this -> query_end ( $result );
return $result ;
2008-05-15 21:40:00 +00:00
}
2008-06-22 21:35:07 +00:00
/**
* Get a number of records as an moodle_recordset . $sql must be a complete SQL query .
* Since this method is a little less readable , use of it should be restricted to
* code where it ' s possible there might be large datasets being returned . For known
* small datasets use get_records_sql - it leads to simpler code .
*
2012-02-16 10:29:45 +08:00
* The return type is like :
* @ see function get_recordset .
2008-06-22 21:35:07 +00:00
*
* @ param string $sql the SQL select query to execute .
* @ param array $params array of sql parameters
* @ param int $limitfrom return a subset of records , starting at this point ( optional , required if $limitnum is set ) .
* @ param int $limitnum return a subset comprising this many records ( optional , required if $limitfrom is set ) .
2010-08-22 18:55:29 +00:00
* @ return moodle_recordset instance
2008-06-22 21:35:07 +00:00
*/
2008-05-15 21:40:00 +00:00
public function get_recordset_sql ( $sql , array $params = null , $limitfrom = 0 , $limitnum = 0 ) {
2009-06-27 21:22:50 +00:00
$result = true ;
list ( $sql , $params , $type ) = $this -> fix_sql_params ( $sql , $params );
$sql = $this -> get_limit_clauses ( $sql , $limitfrom , $limitnum );
$this -> query_start ( $sql , $params , SQL_QUERY_SELECT );
2008-05-15 21:40:00 +00:00
try {
2008-06-22 21:35:07 +00:00
$sth = $this -> pdb -> prepare ( $sql );
$sth -> execute ( $params );
2009-06-27 21:22:50 +00:00
$result = $this -> create_recordset ( $sth );
2008-05-15 21:40:00 +00:00
} catch ( PDOException $ex ) {
2008-06-22 21:35:07 +00:00
$this -> lastError = $ex -> getMessage ();
2009-06-27 21:22:50 +00:00
$result = false ;
2008-05-15 21:40:00 +00:00
}
2008-08-25 21:00:47 +00:00
2009-06-27 21:22:50 +00:00
$this -> query_end ( $result );
return $result ;
2008-06-22 21:35:07 +00:00
}
2008-05-15 21:40:00 +00:00
2008-06-22 21:35:07 +00:00
/**
* Selects rows and return values of first column as array .
*
* @ param string $sql The SQL query
* @ param array $params array of sql parameters
2010-08-22 19:00:28 +00:00
* @ return array of values
2008-06-22 21:35:07 +00:00
*/
public function get_fieldset_sql ( $sql , array $params = null ) {
2011-01-02 17:12:17 +01:00
$rs = $this -> get_recordset_sql ( $sql , $params );
if ( ! $rs -> valid ()) {
$rs -> close (); // Not going to iterate (but exit), close rs
2008-06-22 21:35:07 +00:00
return false ;
}
$result = array ();
foreach ( $rs as $value ) {
$result [] = reset ( $value );
}
$rs -> close ();
return $result ;
2008-05-15 21:40:00 +00:00
}
2008-06-22 21:35:07 +00:00
/**
* Get a number of records as an array of objects .
*
2012-02-16 10:29:45 +08:00
* Return value is like :
* @ see function get_records .
2008-06-22 21:35:07 +00:00
*
* @ param string $sql the SQL select query to execute . The first column of this SELECT statement
* must be a unique value ( usually the 'id' field ), as it will be used as the key of the
* returned array .
* @ param array $params array of sql parameters
* @ param int $limitfrom return a subset of records , starting at this point ( optional , required if $limitnum is set ) .
* @ param int $limitnum return a subset comprising this many records ( optional , required if $limitfrom is set ) .
2010-08-22 19:00:28 +00:00
* @ return array of objects , or empty array if no records were found , or false if an error occurred .
2008-06-22 21:35:07 +00:00
*/
2008-05-15 21:40:00 +00:00
public function get_records_sql ( $sql , array $params = null , $limitfrom = 0 , $limitnum = 0 ) {
2011-01-02 17:12:17 +01:00
$rs = $this -> get_recordset_sql ( $sql , $params , $limitfrom , $limitnum );
if ( ! $rs -> valid ()) {
$rs -> close (); // Not going to iterate (but exit), close rs
2008-06-22 21:35:07 +00:00
return false ;
}
$objects = array ();
$debugging = debugging ( '' , DEBUG_DEVELOPER );
foreach ( $rs as $value ) {
$key = reset ( $value );
if ( $debugging && array_key_exists ( $key , $objects )) {
debugging ( " Did you remember to make the first column something unique in your call to get_records? Duplicate value ' $key ' found in column first column of ' $sql '. " , DEBUG_DEVELOPER );
}
$objects [ $key ] = ( object ) $value ;
}
$rs -> close ();
return $objects ;
}
2008-05-15 21:40:00 +00:00
2008-06-22 21:35:07 +00:00
/**
* Insert new record into database , as fast as possible , no safety checks , lobs not supported .
* @ param string $table name
* @ param mixed $params data record as object or array
* @ param bool $returnit return it of inserted record
* @ param bool $bulk true means repeated inserts expected
2008-08-25 21:00:47 +00:00
* @ param bool $customsequence true if 'id' included in $params , disables $returnid
2010-08-22 19:00:28 +00:00
* @ return bool | int true or new id
2008-06-22 21:35:07 +00:00
*/
2008-08-25 21:00:47 +00:00
public function insert_record_raw ( $table , $params , $returnid = true , $bulk = false , $customsequence = false ) {
2008-06-22 21:35:07 +00:00
if ( ! is_array ( $params )) {
$params = ( array ) $params ;
}
2008-08-25 21:00:47 +00:00
if ( $customsequence ) {
if ( ! isset ( $params [ 'id' ])) {
2009-06-27 21:22:50 +00:00
throw new coding_exception ( 'moodle_database::insert_record_raw() id field must be specified if custom sequences used.' );
2008-08-25 21:00:47 +00:00
}
$returnid = false ;
} else {
unset ( $params [ 'id' ]);
}
2008-06-22 21:35:07 +00:00
if ( empty ( $params )) {
2009-06-27 21:22:50 +00:00
throw new coding_exception ( 'moodle_database::insert_record_raw() no fields found.' );
2008-06-22 21:35:07 +00:00
}
$fields = implode ( ',' , array_keys ( $params ));
$qms = array_fill ( 0 , count ( $params ), '?' );
$qms = implode ( ',' , $qms );
$sql = " INSERT INTO { { $table } } ( $fields ) VALUES( $qms ) " ;
if ( ! $this -> execute ( $sql , $params )) {
return false ;
}
if ( ! $returnid ) {
return true ;
}
if ( $id = $this -> pdb -> lastInsertId ()) {
return ( int ) $id ;
}
return false ;
}
2008-08-25 21:00:47 +00:00
2008-06-22 21:35:07 +00:00
/**
* Insert a record into a table and return the " id " field if required ,
* Some conversions and safety checks are carried out . Lobs are supported .
* If the return ID isn ' t required , then this just reports success as true / false .
* $data is an object containing needed data
* @ param string $table The database table to be inserted into
* @ param object $data A data object with values for one or more fields in the record
* @ param bool $returnid Should the id of the newly created record entry be returned ? If this option is not requested then true / false is returned .
* @ param bool $bulk true means repeated inserts expected
2010-08-22 19:00:28 +00:00
* @ return bool | int true or new id
2008-06-22 21:35:07 +00:00
*/
public function insert_record ( $table , $dataobject , $returnid = true , $bulk = false ) {
2010-07-31 20:51:22 +00:00
$dataobject = ( array ) $dataobject ;
2008-06-22 21:35:07 +00:00
$columns = $this -> get_columns ( $table );
$cleaned = array ();
foreach ( $dataobject as $field => $value ) {
2010-07-31 20:51:22 +00:00
if ( $field === 'id' ) {
continue ;
}
2008-06-22 21:35:07 +00:00
if ( ! isset ( $columns [ $field ])) {
continue ;
}
$column = $columns [ $field ];
if ( is_bool ( $value )) {
$value = ( int ) $value ; // prevent "false" problems
}
$cleaned [ $field ] = $value ;
}
if ( empty ( $cleaned )) {
2008-05-15 21:40:00 +00:00
return false ;
}
2008-06-22 21:35:07 +00:00
return $this -> insert_record_raw ( $table , $cleaned , $returnid , $bulk );
2008-05-15 21:40:00 +00:00
}
2008-08-25 21:00:47 +00:00
2008-06-22 21:35:07 +00:00
/**
* Update record in database , as fast as possible , no safety checks , lobs not supported .
* @ param string $table name
* @ param mixed $params data record as object or array
* @ param bool true means repeated updates expected
* @ return bool success
*/
public function update_record_raw ( $table , $params , $bulk = false ) {
2010-07-31 20:51:22 +00:00
$params = ( array ) $params ;
2008-06-22 21:35:07 +00:00
if ( ! isset ( $params [ 'id' ])) {
2009-06-27 21:22:50 +00:00
throw new coding_exception ( 'moodle_database::update_record_raw() id field must be specified.' );
2008-06-22 21:35:07 +00:00
}
$id = $params [ 'id' ];
unset ( $params [ 'id' ]);
2008-05-15 21:40:00 +00:00
2008-06-22 21:35:07 +00:00
if ( empty ( $params )) {
2009-06-27 21:22:50 +00:00
throw new coding_exception ( 'moodle_database::update_record_raw() no fields found.' );
2008-06-22 21:35:07 +00:00
}
2008-05-15 21:40:00 +00:00
2008-06-22 21:35:07 +00:00
$sets = array ();
foreach ( $params as $field => $value ) {
$sets [] = " $field = ? " ;
}
$params [] = $id ; // last ? in WHERE condition
$sets = implode ( ',' , $sets );
$sql = " UPDATE { { $table } } SET $sets WHERE id=? " ;
return $this -> execute ( $sql , $params );
}
/**
* Update a record in a table
*
* $dataobject is an object containing needed data
* Relies on $dataobject having a variable " id " to
* specify the record to update
*
* @ param string $table The database table to be checked against .
* @ param object $dataobject An object with contents equal to fieldname => fieldvalue . Must have an entry for 'id' to map to the table specified .
* @ param bool true means repeated updates expected
* @ return bool success
*/
public function update_record ( $table , $dataobject , $bulk = false ) {
2010-07-31 20:51:22 +00:00
$dataobject = ( array ) $dataobject ;
2008-06-22 21:35:07 +00:00
$columns = $this -> get_columns ( $table );
$cleaned = array ();
foreach ( $dataobject as $field => $value ) {
if ( ! isset ( $columns [ $field ])) {
continue ;
}
if ( is_bool ( $value )) {
$value = ( int ) $value ; // prevent "false" problems
}
$cleaned [ $field ] = $value ;
}
return $this -> update_record_raw ( $table , $cleaned , $bulk );
}
/**
* Set a single field in every table row where the select statement evaluates to true .
*
* @ param string $table The database table to be checked against .
* @ param string $newfield the field to set .
* @ param string $newvalue the value to set the field to .
* @ param string $select A fragment of SQL to be used in a where clause in the SQL call .
* @ param array $params array of sql parameters
* @ return bool success
*/
public function set_field_select ( $table , $newfield , $newvalue , $select , array $params = null ) {
if ( $select ) {
$select = " WHERE $select " ;
}
if ( is_null ( $params )) {
$params = array ();
}
list ( $select , $params , $type ) = $this -> fix_sql_params ( $select , $params );
if ( is_bool ( $newvalue )) {
$newvalue = ( int ) $newvalue ; // prevent "false" problems
}
if ( is_null ( $newvalue )) {
$newfield = " $newfield = NULL " ;
} else {
// make sure SET and WHERE clauses use the same type of parameters,
// because we don't support different types in the same query
switch ( $type ) {
case SQL_PARAMS_NAMED :
$newfield = " $newfield = :newvalueforupdate " ;
$params [ 'newvalueforupdate' ] = $newvalue ;
break ;
case SQL_PARAMS_QM :
$newfield = " $newfield = ? " ;
array_unshift ( $params , $newvalue );
break ;
default :
2008-12-12 04:53:32 +00:00
$this -> lastError = __FILE__ . ' LINE: ' . __LINE__ . '.' ;
print_error ( unknowparamtype , 'error' , '' , $this -> lastError );
2008-06-22 21:35:07 +00:00
}
}
$sql = " UPDATE { { $table } } SET $newfield $select " ;
return $this -> execute ( $sql , $params );
2008-05-15 21:40:00 +00:00
}
public function sql_concat () {
2008-12-12 04:53:32 +00:00
print_error ( 'TODO' );
2008-05-15 21:40:00 +00:00
}
public function sql_concat_join ( $separator = " ' ' " , $elements = array ()) {
2008-12-12 04:53:32 +00:00
print_error ( 'TODO' );
2008-05-15 21:40:00 +00:00
}
2009-11-07 08:52:56 +00:00
protected function begin_transaction () {
2009-06-27 21:22:50 +00:00
$this -> query_start ( '' , NULL , SQL_QUERY_AUX );
2008-06-22 21:35:07 +00:00
try {
$this -> pdb -> beginTransaction ();
} catch ( PDOException $ex ) {
2009-06-27 21:22:50 +00:00
$this -> lastError = $ex -> getMessage ();
2008-06-22 21:35:07 +00:00
}
2009-06-27 21:22:50 +00:00
$this -> query_end ( $result );
2008-05-15 21:40:00 +00:00
}
2009-06-27 21:22:50 +00:00
2009-11-07 08:52:56 +00:00
protected function commit_transaction () {
2009-06-27 21:22:50 +00:00
$this -> query_start ( '' , NULL , SQL_QUERY_AUX );
2008-06-22 21:35:07 +00:00
try {
$this -> pdb -> commit ();
} catch ( PDOException $ex ) {
2009-06-27 21:22:50 +00:00
$this -> lastError = $ex -> getMessage ();
2008-06-22 21:35:07 +00:00
}
2009-06-27 21:22:50 +00:00
$this -> query_end ( $result );
2008-05-15 21:40:00 +00:00
}
2008-06-22 21:35:07 +00:00
2009-11-07 08:52:56 +00:00
protected function rollback_transaction () {
2009-06-27 21:22:50 +00:00
$this -> query_start ( '' , NULL , SQL_QUERY_AUX );
2008-06-22 21:35:07 +00:00
try {
$this -> pdb -> rollBack ();
} catch ( PDOException $ex ) {
2009-06-27 21:22:50 +00:00
$this -> lastError = $ex -> getMessage ();
2008-06-22 21:35:07 +00:00
}
2009-06-27 21:22:50 +00:00
$this -> query_end ( $result );
2008-05-15 21:40:00 +00:00
}
2008-08-25 21:00:47 +00:00
/**
* Import a record into a table , id field is required .
* Basic safety checks only . Lobs are supported .
* @ param string $table name of database table to be inserted into
* @ param mixed $dataobject object or array with fields in the record
* @ return bool success
*/
public function import_record ( $table , $dataobject ) {
$dataobject = ( object ) $dataobject ;
$columns = $this -> get_columns ( $table );
$cleaned = array ();
foreach ( $dataobject as $field => $value ) {
if ( ! isset ( $columns [ $field ])) {
continue ;
}
$cleaned [ $field ] = $value ;
}
return $this -> insert_record_raw ( $table , $cleaned , false , true , true );
}
2009-06-27 21:22:50 +00:00
/**
* Called before each db query .
*
2010-05-21 18:32:44 +00:00
* Overridden to ensure $this -> lastErorr is reset each query
2009-06-27 21:22:50 +00:00
*
* @ param string $sql
* @ param array array of parameters
* @ param int $type type of query
* @ param mixed $extrainfo driver specific extra information
* @ return void
*/
protected function query_start ( $sql , array $params = null , $type , $extrainfo = null ) {
$this -> lastError = null ;
parent :: query_start ( $sql , $params , $type , $extrainfo );
}
2008-05-15 21:40:00 +00:00
}