X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FDatabaseFunctions.php;h=772ca43e42d455b2886363c861e52eeea21d8309;hb=aa47997796e8a2a44ea4b472fa794f1a435d223f;hp=cdee2564ea73ce38e6bd13d1315234873fdaeb91;hpb=a2bc5d8338c0a546307cb3f8fc2e99b86ecf60cd;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/DatabaseFunctions.php b/includes/DatabaseFunctions.php index cdee2564ea..772ca43e42 100644 --- a/includes/DatabaseFunctions.php +++ b/includes/DatabaseFunctions.php @@ -1,186 +1,370 @@ -fatalError( wfMsgNoDB( 'wrong_wfQuery_params', $db, $sql ) ); + } + $c =& wfGetDB( $db ); + if ( $c !== false ) { + return $c->query( $sql, $fname ); + } else { + return false; + } +} -$wgLastDatabaseQuery = ""; +/** + * + * @param string $sql SQL query + * @param $dbi + * @param string $fname name of the php function calling + * @return array first row from the database + */ +function wfSingleQuery( $sql, $dbi, $fname = '' ) { + $db =& wfGetDB( $dbi ); + $res = $db->query($sql, $fname ); + $row = $db->fetchRow( $res ); + $ret = $row[0]; + $db->freeResult( $res ); + return $ret; +} -function wfGetDB( $altuser = "", $altpassword = "", $altserver = "", $altdb = "" ) -{ - global $wgDBserver, $wgDBuser, $wgDBpassword; - global $wgDBname, $wgDBconnection, $wgEmergencyContact; - - $noconn = str_replace( "$1", $wgDBserver, wfMsgNoDB( "noconnect" ) ); - $nodb = str_replace( "$1", $wgDBname, wfMsgNoDB( "nodb" ) ); - - $helpme = "\n

If this error persists after reloading and clearing " . - "your browser cache, please notify the Wikipedia developers.

"; - - if ( $altuser != "" ) { - $serve = ($altserver ? $altserver : $wgDBserver ); - $db = ($altdb ? $altdb : $wgDBname ); - $wgDBconnection = mysql_connect( $serve, $altuser, $altpassword ) - or die( "bad sql user" ); - mysql_select_db( $db, $wgDBconnection ) or die( - htmlspecialchars(mysql_error()) ); - } - - if ( ! $wgDBconnection ) { - @$wgDBconnection = mysql_pconnect( $wgDBserver, $wgDBuser, $wgDBpassword ) - or wfEmergencyAbort(); - - if( !mysql_select_db( $wgDBname, $wgDBconnection ) ) { - /* Persistent connections may become stuck in an unusable state */ - wfDebug( "Persistent connection is broken?\n", true ); - - @$wgDBconnection = mysql_connect( $wgDBserver, $wgDBuser, $wgDBpassword ) - or wfEmergencyAbort(); - - @mysql_select_db( $wgDBname, $wgDBconnection ) - or wfEmergencyAbort(); - } - } - # mysql_ping( $wgDBconnection ); - return $wgDBconnection; -} - -/* Call this function if we couldn't contact the database... - We'll try to use the cache to display something in the meantime */ -function wfEmergencyAbort( $msg = "" ) { - global $wgTitle, $wgUseFileCache, $title, $wgOutputEncoding; - - header( "Content-type: text/html; charset=$wgOutputEncoding" ); - if($msg == "") $msg = wfMsgNoDB( "noconnect" ); - $text = $msg; - - if($wgUseFileCache) { - if($wgTitle) { - $t =& $wgTitle; - } else { - if($title) { - $t = Title::newFromURL( $title ); - } else { - $t = Title::newFromText( wfMsgNoDB( "mainpage" ) ); - } - } - - $cache = new CacheManager( $t ); - if( $cache->isFileCached() ) { - $msg = "

$msg
\n" . - wfMsgNoDB( "cachederror" ) . "

\n"; - - $tag = "
"; - $text = str_replace( - $tag, - $tag . $msg, - $cache->fetchPageText() ); - } - } +/* + * @todo document function + */ +function &wfGetDB( $db = DB_LAST, $groups = array() ) { + global $wgLoadBalancer; + return $wgLoadBalancer->getConnection( $db, true, $groups ); +} - /* Don't cache error pages! They cause no end of trouble... */ - header( "Cache-control: none" ); - header( "Pragma: nocache" ); - echo $text; - exit; -} - -# $db: DB_READ = -1 read from slave (or only server) -# DB_WRITE = -2 write to master (or only server) -# 0,1,2,... query a database with a specific index -# Replication is not actually implemented just yet -function wfQuery( $sql, $db, $fname = "" ) -{ - global $wgLastDatabaseQuery, $wgOut; -## wfProfileIn( "wfQuery" ); - $wgLastDatabaseQuery = $sql; - $conn = wfGetDB(); - $ret = mysql_query( $sql, $conn ); - - if ( "" != $fname ) { -# wfDebug( "{$fname}:SQL: {$sql}\n", true ); +/** + * Turns on (false) or off (true) the automatic generation and sending + * of a "we're sorry, but there has been a database error" page on + * database errors. Default is on (false). When turned off, the + * code should use wfLastErrno() and wfLastError() to handle the + * situation as appropriate. + * + * @param $newstate + * @param $dbi + * @return Returns the previous state. + */ +function wfIgnoreSQLErrors( $newstate, $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->ignoreErrors( $newstate ); } else { -# wfDebug( "SQL: {$sql}\n", true ); + return NULL; } - if ( false === $ret ) { - $wgOut->databaseError( $fname ); - exit; +} + +/**#@+ + * @param $res database result handler + * @param $dbi +*/ + +/** + * Free a database result + * @return bool whether result is sucessful or not + */ +function wfFreeResult( $res, $dbi = DB_LAST ) +{ + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + $db->freeResult( $res ); + return true; + } else { + return false; } -## wfProfileOut(); - return $ret; } -function wfFreeResult( $res ) { mysql_free_result( $res ); } -function wfFetchObject( $res ) { return mysql_fetch_object( $res ); } -function wfNumRows( $res ) { return mysql_num_rows( $res ); } -function wfNumFields( $res ) { return mysql_num_fields( $res ); } -function wfFieldName( $res, $n ) { return mysql_field_name( $res, $n ); } -function wfInsertId() { return mysql_insert_id( wfGetDB() ); } -function wfDataSeek( $res, $row ) { return mysql_data_seek( $res, $row ); } -function wfLastErrno() { return mysql_errno(); } -function wfLastError() { return mysql_error(); } -function wfAffectedRows() { return mysql_affected_rows( wfGetDB() ); } +/** + * Get an object from a database result + * @return object|false object we requested + */ +function wfFetchObject( $res, $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->fetchObject( $res, $dbi = DB_LAST ); + } else { + return false; + } +} -function wfLastDBquery() -{ - global $wgLastDatabaseQuery; - return $wgLastDatabaseQuery; +/** + * Get a row from a database result + * @return object|false row we requested + */ +function wfFetchRow( $res, $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->fetchRow ( $res, $dbi = DB_LAST ); + } else { + return false; + } +} + +/** + * Get a number of rows from a database result + * @return integer|false number of rows + */ +function wfNumRows( $res, $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->numRows( $res, $dbi = DB_LAST ); + } else { + return false; + } +} + +/** + * Get the number of fields from a database result + * @return integer|false number of fields + */ +function wfNumFields( $res, $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->numFields( $res ); + } else { + return false; + } +} + +/** + * Return name of a field in a result + * @param integer $n id of the field + * @return string|false name of field + */ +function wfFieldName( $res, $n, $dbi = DB_LAST ) +{ + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->fieldName( $res, $n, $dbi = DB_LAST ); + } else { + return false; + } +} +/**#@-*/ + +/** + * @todo document function + */ +function wfInsertId( $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->insertId(); + } else { + return false; + } +} + +/** + * @todo document function + */ +function wfDataSeek( $res, $row, $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->dataSeek( $res, $row ); + } else { + return false; + } +} + +/** + * @todo document function + */ +function wfLastErrno( $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->lastErrno(); + } else { + return false; + } +} + +/** + * @todo document function + */ +function wfLastError( $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->lastError(); + } else { + return false; + } +} + +/** + * @todo document function + */ +function wfAffectedRows( $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->affectedRows(); + } else { + return false; + } +} + +/** + * @todo document function + */ +function wfLastDBquery( $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->lastQuery(); + } else { + return false; + } } -function wfSetSQL( $table, $var, $value, $cond ) +/** + * @todo document function + */ +function wfSetSQL( $table, $var, $value, $cond, $dbi = DB_MASTER ) { - $sql = "UPDATE $table SET $var = '" . - wfStrencode( $value ) . "' WHERE ($cond)"; - wfQuery( $sql, DB_WRITE, "wfSetSQL" ); + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->set( $table, $var, $value, $cond ); + } else { + return false; + } } -function wfGetSQL( $table, $var, $cond ) + +/** + * @todo document function + */ +function wfGetSQL( $table, $var, $cond='', $dbi = DB_LAST ) { - $sql = "SELECT $var FROM $table WHERE ($cond)"; - $result = wfQuery( $sql, DB_READ, "wfGetSQL" ); + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->selectField( $table, $var, $cond ); + } else { + return false; + } +} - $ret = ""; - if ( mysql_num_rows( $result ) > 0 ) { - $s = mysql_fetch_object( $result ); - $ret = $s->$var; - mysql_free_result( $result ); +/** + * @todo document function + */ +function wfFieldExists( $table, $field, $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->fieldExists( $table, $field ); + } else { + return false; } - return $ret; } -function wfStrencode( $s ) -{ - return addslashes( $s ); +/** + * @todo document function + */ +function wfIndexExists( $table, $index, $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->indexExists( $table, $index ); + } else { + return false; + } } -# Ideally we'd be using actual time fields in the db -function wfTimestamp2Unix( $ts ) { - return gmmktime( ( (int)substr( $ts, 8, 2) ), - (int)substr( $ts, 10, 2 ), (int)substr( $ts, 12, 2 ), - (int)substr( $ts, 4, 2 ), (int)substr( $ts, 6, 2 ), - (int)substr( $ts, 0, 4 ) ); +/** + * @todo document function + */ +function wfInsertArray( $table, $array, $fname = 'wfInsertArray', $dbi = DB_MASTER ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->insert( $table, $array, $fname ); + } else { + return false; + } } -function wfUnix2Timestamp( $unixtime ) { - return gmdate( "YmdHis", $unixtime ); +/** + * @todo document function + */ +function wfGetArray( $table, $vars, $conds, $fname = 'wfGetArray', $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->getArray( $table, $vars, $conds, $fname ); + } else { + return false; + } } -function wfTimestampNow() { - # return NOW - return gmdate( "YmdHis" ); +/** + * @todo document function + */ +function wfUpdateArray( $table, $values, $conds, $fname = 'wfUpdateArray', $dbi = DB_MASTER ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + $db->update( $table, $values, $conds, $fname ); + return true; + } else { + return false; + } } -# Sorting hack for MySQL 3, which doesn't use index sorts for DESC -function wfInvertTimestamp( $ts ) { - return strtr( - $ts, - "0123456789", - "9876543210" - ); +/** + * @todo document function + */ +function wfTableName( $name, $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->tableName( $name ); + } else { + return false; + } } +/** + * @todo document function + */ +function wfStrencode( $s, $dbi = DB_LAST ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->strencode( $s ); + } else { + return false; + } +} + +/** + * @todo document function + */ +function wfNextSequenceValue( $seqName, $dbi = DB_MASTER ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->nextSequenceValue( $seqName ); + } else { + return false; + } +} + +/** + * @todo document function + */ +function wfUseIndexClause( $index, $dbi = DB_SLAVE ) { + $db =& wfGetDB( $dbi ); + if ( $db !== false ) { + return $db->useIndexClause( $index ); + } else { + return false; + } +} ?>