summaryrefslogtreecommitdiff
path: root/includes/db/DatabaseIbm_db2.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/db/DatabaseIbm_db2.php')
-rw-r--r--includes/db/DatabaseIbm_db2.php165
1 files changed, 80 insertions, 85 deletions
diff --git a/includes/db/DatabaseIbm_db2.php b/includes/db/DatabaseIbm_db2.php
index fed3b12e..f1f6dfca 100644
--- a/includes/db/DatabaseIbm_db2.php
+++ b/includes/db/DatabaseIbm_db2.php
@@ -2,7 +2,22 @@
/**
* This is the IBM DB2 database abstraction layer.
* See maintenance/ibm_db2/README for development notes
- * and other specific information
+ * and other specific information.
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
*
* @file
* @ingroup Database
@@ -122,7 +137,7 @@ class IBM_DB2Result{
/**
* Construct and initialize a wrapper for DB2 query results
- * @param $db Database
+ * @param $db DatabaseBase
* @param $result Object
* @param $num_rows Integer
* @param $sql String
@@ -130,21 +145,21 @@ class IBM_DB2Result{
*/
public function __construct( $db, $result, $num_rows, $sql, $columns ){
$this->db = $db;
-
+
if( $result instanceof ResultWrapper ){
$this->result = $result->result;
}
else{
$this->result = $result;
}
-
+
$this->num_rows = $num_rows;
$this->current_pos = 0;
if ( $this->num_rows > 0 ) {
// Make a lower-case list of the column names
// By default, DB2 column names are capitalized
// while MySQL column names are lowercase
-
+
// Is there a reasonable maximum value for $i?
// Setting to 2048 to prevent an infinite loop
for( $i = 0; $i < 2048; $i++ ) {
@@ -155,11 +170,11 @@ class IBM_DB2Result{
else {
return false;
}
-
+
$this->columns[$i] = strtolower( $name );
}
}
-
+
$this->sql = $sql;
}
@@ -187,14 +202,14 @@ class IBM_DB2Result{
* @return mixed Object on success, false on failure.
*/
public function fetchObject() {
- if ( $this->result
- && $this->num_rows > 0
- && $this->current_pos >= 0
- && $this->current_pos < $this->num_rows )
+ if ( $this->result
+ && $this->num_rows > 0
+ && $this->current_pos >= 0
+ && $this->current_pos < $this->num_rows )
{
$row = $this->fetchRow();
$ret = new stdClass();
-
+
foreach ( $row as $k => $v ) {
$lc = $this->columns[$k];
$ret->$lc = $v;
@@ -210,9 +225,9 @@ class IBM_DB2Result{
* @throws DBUnexpectedError
*/
public function fetchRow(){
- if ( $this->result
- && $this->num_rows > 0
- && $this->current_pos >= 0
+ if ( $this->result
+ && $this->num_rows > 0
+ && $this->current_pos >= 0
&& $this->current_pos < $this->num_rows )
{
if ( $this->loadedLines <= $this->current_pos ) {
@@ -227,7 +242,7 @@ class IBM_DB2Result{
if ( $this->loadedLines > $this->current_pos ){
return $this->resultSet[$this->current_pos++];
}
-
+
}
return false;
}
@@ -313,6 +328,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Returns true if this database supports (and uses) cascading deletes
+ * @return bool
*/
function cascadingDeletes() {
return true;
@@ -321,6 +337,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Returns true if this database supports (and uses) triggers (e.g. on the
* page table)
+ * @return bool
*/
function cleanupTriggers() {
return true;
@@ -330,6 +347,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
* Returns true if this database is strict about what can be put into an
* IP field.
* Specifically, it uses a NULL value instead of an empty string.
+ * @return bool
*/
function strictIPs() {
return true;
@@ -337,13 +355,15 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Returns true if this database uses timestamps rather than integers
- */
+ * @return bool
+ */
function realTimestamps() {
return true;
}
/**
* Returns true if this database does an implicit sort when doing GROUP BY
+ * @return bool
*/
function implicitGroupby() {
return false;
@@ -353,6 +373,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
* Returns true if this database does an implicit order by when the column
* has an index
* For example: SELECT page_title FROM page LIMIT 1
+ * @return bool
*/
function implicitOrderby() {
return false;
@@ -361,6 +382,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Returns true if this database can do a native search on IP columns
* e.g. this works as expected: .. WHERE rc_ip = '127.42.12.102/32';
+ * @return bool
*/
function searchableIPs() {
return true;
@@ -368,6 +390,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Returns true if this database can use functional indexes
+ * @return bool
*/
function functionalIndexes() {
return true;
@@ -375,6 +398,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Returns a unique string representing the wiki on the server
+ * @return string
*/
public function getWikiID() {
if( $this->mSchema ) {
@@ -392,7 +416,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
return 'ibm_db2';
}
- /**
+ /**
* Returns the database connection object
* @return Object
*/
@@ -472,7 +496,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
* @param $user String
* @param $password String
* @param $dbName String: database name
- * @return a fresh connection
+ * @return DatabaseBase a fresh connection
*/
public function open( $server, $user, $password, $dbName ) {
wfProfileIn( __METHOD__ );
@@ -546,32 +570,26 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Closes a database connection, if it is open
* Returns success, true if already closed
+ * @return bool
*/
- public function close() {
- $this->mOpened = false;
- if ( $this->mConn ) {
- if ( $this->trxLevel() > 0 ) {
- $this->commit();
- }
- return db2_close( $this->mConn );
- } else {
- return true;
- }
+ protected function closeConnection() {
+ return db2_close( $this->mConn );
}
/**
* Retrieves the most current database error
* Forces a database rollback
+ * @return bool|string
*/
public function lastError() {
$connerr = db2_conn_errormsg();
if ( $connerr ) {
- //$this->rollback();
+ //$this->rollback( __METHOD__ );
return $connerr;
}
$stmterr = db2_stmt_errormsg();
if ( $stmterr ) {
- //$this->rollback();
+ //$this->rollback( __METHOD__ );
return $stmterr;
}
@@ -667,7 +685,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
* Fields can be retrieved with $row->fieldname, with fields acting like
* member variables.
*
- * @param $res SQL result object as returned from Database::query(), etc.
+ * @param $res array|ResultWrapper SQL result object as returned from Database::query(), etc.
* @return DB2 row object
* @throws DBUnexpectedError Thrown if the database returns an error
*/
@@ -689,8 +707,8 @@ class DatabaseIbm_db2 extends DatabaseBase {
* Fetch the next row from the given result object, in associative array
* form. Fields are retrieved with $row['fieldname'].
*
- * @param $res SQL result object as returned from Database::query(), etc.
- * @return DB2 row object
+ * @param $res array|ResultWrapper SQL result object as returned from Database::query(), etc.
+ * @return ResultWrapper row object
* @throws DBUnexpectedError Thrown if the database returns an error
*/
public function fetchRow( $res ) {
@@ -715,7 +733,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
* Doesn't escape numbers
*
* @param $s String: string to escape
- * @return escaped string
+ * @return string escaped string
*/
public function addQuotes( $s ) {
//$this->installPrint( "DB2::addQuotes( $s )\n" );
@@ -758,7 +776,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Alias for addQuotes()
* @param $s String: string to escape
- * @return escaped string
+ * @return string escaped string
*/
public function strencode( $s ) {
// Bloody useless function
@@ -780,16 +798,16 @@ class DatabaseIbm_db2 extends DatabaseBase {
protected function applySchema() {
if ( !( $this->mSchemaSet ) ) {
$this->mSchemaSet = true;
- $this->begin();
+ $this->begin( __METHOD__ );
$this->doQuery( "SET SCHEMA = $this->mSchema" );
- $this->commit();
+ $this->commit( __METHOD__ );
}
}
/**
* Start a transaction (mandatory)
*/
- public function begin( $fname = 'DatabaseIbm_db2::begin' ) {
+ protected function doBegin( $fname = 'DatabaseIbm_db2::begin' ) {
// BEGIN is implicit for DB2
// However, it requires that AutoCommit be off.
@@ -805,7 +823,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
* End a transaction
* Must have a preceding begin()
*/
- public function commit( $fname = 'DatabaseIbm_db2::commit' ) {
+ protected function doCommit( $fname = 'DatabaseIbm_db2::commit' ) {
db2_commit( $this->mConn );
// Some MediaWiki code is still transaction-less (?).
@@ -819,7 +837,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Cancel a transaction
*/
- public function rollback( $fname = 'DatabaseIbm_db2::rollback' ) {
+ protected function doRollback( $fname = 'DatabaseIbm_db2::rollback' ) {
db2_rollback( $this->mConn );
// turn auto-commit back on
// not sure if this is appropriate
@@ -836,6 +854,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
* LIST_SET - comma separated with field names, like a SET clause
* LIST_NAMES - comma separated field names
* LIST_SET_PREPARED - like LIST_SET, except with ? tokens as values
+ * @return string
*/
function makeList( $a, $mode = LIST_COMMA ) {
if ( !is_array( $a ) ) {
@@ -873,6 +892,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
* @param $sql string SQL query we will append the limit too
* @param $limit integer the SQL limit
* @param $offset integer the SQL offset (default false)
+ * @return string
*/
public function limitResult( $sql, $limit, $offset=false ) {
if( !is_numeric( $limit ) ) {
@@ -904,7 +924,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Generates a timestamp in an insertable format
*
- * @param $ts timestamp
+ * @param $ts string timestamp
* @return String: timestamp value
*/
public function timestamp( $ts = 0 ) {
@@ -915,7 +935,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Return the next in a sequence, save the value for retrieval via insertId()
* @param $seqName String: name of a defined sequence in the database
- * @return next value in that sequence
+ * @return int next value in that sequence
*/
public function nextSequenceValue( $seqName ) {
// Not using sequences in the primary schema to allow for easier migration
@@ -934,7 +954,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* This must be called after nextSequenceVal
- * @return Last sequence value used as a primary key
+ * @return int Last sequence value used as a primary key
*/
public function insertId() {
return $this->mInsertId;
@@ -1003,7 +1023,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
$res = true;
// If we are not in a transaction, we need to be for savepoint trickery
if ( !$this->mTrxLevel ) {
- $this->begin();
+ $this->begin( __METHOD__ );
}
$sql = "INSERT INTO $table ( " . implode( ',', $keys ) . ' ) VALUES ';
@@ -1018,7 +1038,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
$stmt = $this->prepare( $sql );
// start a transaction/enter transaction mode
- $this->begin();
+ $this->begin( __METHOD__ );
if ( !$ignore ) {
//$first = true;
@@ -1071,7 +1091,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
$this->mAffectedRows = $numrowsinserted;
}
// commit either way
- $this->commit();
+ $this->commit( __METHOD__ );
$this->freePrepared( $stmt );
return $res;
@@ -1121,11 +1141,11 @@ class DatabaseIbm_db2 extends DatabaseBase {
* UPDATE wrapper, takes a condition array and a SET array
*
* @param $table String: The table to UPDATE
- * @param $values An array of values to SET
- * @param $conds An array of conditions ( WHERE ). Use '*' to update all rows.
+ * @param $values array An array of values to SET
+ * @param $conds array An array of conditions ( WHERE ). Use '*' to update all rows.
* @param $fname String: The Class::Function calling this function
* ( for the log )
- * @param $options An array of UPDATE options, can be one or
+ * @param $options array An array of UPDATE options, can be one or
* more of IGNORE, LOW_PRIORITY
* @return Boolean
*/
@@ -1153,6 +1173,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
* DELETE query wrapper
*
* Use $conds == "*" to delete all rows
+ * @return bool|\ResultWrapper
*/
public function delete( $table, $conds, $fname = 'DatabaseIbm_db2::delete' ) {
if ( !$conds ) {
@@ -1206,7 +1227,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
* Moves the row pointer of the result set
* @param $res Object: result set
* @param $row Integer: row number
- * @return success or failure
+ * @return bool success or failure
*/
public function dataSeek( $res, $row ) {
if ( $res instanceof ResultWrapper ) {
@@ -1279,11 +1300,11 @@ class DatabaseIbm_db2 extends DatabaseBase {
* @param $conds Array or string, condition(s) for WHERE
* @param $fname String: calling function name (use __METHOD__)
* for logs/profiling
- * @param $options Associative array of options
+ * @param $options array Associative array of options
* (e.g. array( 'GROUP BY' => 'page_title' )),
* see Database::makeSelectOptions code for list of
* supported stuff
- * @param $join_conds Associative array of table join conditions (optional)
+ * @param $join_conds array Associative array of table join conditions (optional)
* (e.g. array( 'page' => array('LEFT JOIN',
* 'page_latest=rev_id') )
* @return Mixed: database result resource for fetch functions or false
@@ -1320,10 +1341,10 @@ class DatabaseIbm_db2 extends DatabaseBase {
$res2 = parent::select( $table, $vars2, $conds, $fname, $options2,
$join_conds );
-
+
$obj = $this->fetchObject( $res2 );
$this->mNumRows = $obj->num_rows;
-
+
return new ResultWrapper( $this, new IBM_DB2Result( $this, $res, $obj->num_rows, $vars, $sql ) );
}
@@ -1333,7 +1354,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
*
* @private
*
- * @param $options Associative array of options to be turned into
+ * @param $options array Associative array of options to be turned into
* an SQL query, valid keys are listed in the function.
* @return Array
*/
@@ -1412,7 +1433,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
// db2_ping() doesn't exist
// Emulate
$this->close();
- $this->mConn = $this->openUncataloged( $this->mDBName, $this->mUser,
+ $this->openUncataloged( $this->mDBName, $this->mUser,
$this->mPassword, $this->mServer, $this->mPort );
return false;
@@ -1420,14 +1441,6 @@ class DatabaseIbm_db2 extends DatabaseBase {
######################################
# Unimplemented and not applicable
######################################
- /**
- * Not implemented
- * @return string $sql
- */
- public function limitResultForUpdate( $sql, $num ) {
- $this->installPrint( 'Not implemented for DB2: limitResultForUpdate()' );
- return $sql;
- }
/**
* Only useful with fake prepare like in base Database class
@@ -1502,7 +1515,7 @@ SQL;
* Verifies that an index was created as unique
* @param $table String: table name
* @param $index String: index name
- * @param $fname function name for profiling
+ * @param $fname string function name for profiling
* @return Bool
*/
public function indexUnique ( $table, $index,
@@ -1636,25 +1649,6 @@ SQL;
}
/**
- * Prepare & execute an SQL statement, quoting and inserting arguments
- * in the appropriate places.
- * @param $query String
- * @param $args ...
- */
- public function safeQuery( $query, $args = null ) {
- // copied verbatim from Database.php
- $prepared = $this->prepare( $query, 'DB2::safeQuery' );
- if( !is_array( $args ) ) {
- # Pull the var args
- $args = func_get_args();
- array_shift( $args );
- }
- $retval = $this->execute( $prepared, $args );
- $this->freePrepared( $prepared );
- return $retval;
- }
-
- /**
* For faking prepared SQL statements on DBs that don't support
* it directly.
* @param $preparedQuery String: a 'preparable' SQL statement
@@ -1674,6 +1668,7 @@ SQL;
/**
* Switches module between regular and install modes
+ * @return string
*/
public function setMode( $mode ) {
$old = $this->mMode;