Better type hinting and code structure for the MySQLi database driver

This commit is contained in:
Raphaël Doursenaud 2015-05-12 17:56:01 +02:00
parent 04f5e73557
commit 6e6e63db50
3 changed files with 41 additions and 47 deletions

View File

@ -21,7 +21,7 @@
*/ */
/** /**
* Class to manage Dolibarr database access for a Mysql database * Class to manage Dolibarr database access for an SQL database
*/ */
interface Database interface Database
{ {

View File

@ -21,13 +21,13 @@
/** /**
* \file htdocs/core/db/mysql.class.php * \file htdocs/core/db/mysql.class.php
* \brief Class file to manage Dolibarr database access for a Mysql database * \brief Class file to manage Dolibarr database access for a MySQL database
*/ */
require_once DOL_DOCUMENT_ROOT .'/core/db/DoliDB.class.php'; require_once DOL_DOCUMENT_ROOT .'/core/db/DoliDB.class.php';
/** /**
* Class to manage Dolibarr database access for a Mysql database * Class to manage Dolibarr database access for a MySQL database using the mysql extension
*/ */
class DoliDBMysql extends DoliDB class DoliDBMysql extends DoliDB
{ {

View File

@ -21,13 +21,13 @@
/** /**
* \file htdocs/core/db/mysqli.class.php * \file htdocs/core/db/mysqli.class.php
* \brief Class file to manage Dolibarr database access for a Mysql database * \brief Class file to manage Dolibarr database access for a MySQL database
*/ */
require_once DOL_DOCUMENT_ROOT .'/core/db/DoliDB.class.php'; require_once DOL_DOCUMENT_ROOT .'/core/db/DoliDB.class.php';
/** /**
* Class to manage Dolibarr database access for a Mysql database * Class to manage Dolibarr database access for a MySQL database using the MySQLi extension
*/ */
class DoliDBMysqli extends DoliDB class DoliDBMysqli extends DoliDB
{ {
@ -36,7 +36,7 @@ class DoliDBMysqli extends DoliDB
//! Database label //! Database label
const LABEL='MySQL'; const LABEL='MySQL';
//! Version min database //! Version min database
const VERSIONMIN='4.1.0'; const VERSIONMIN='4.1.3';
//! Resultset of last query //! Resultset of last query
private $_results; private $_results;
@ -187,7 +187,7 @@ class DoliDBMysqli extends DoliDB
* @param string $passwd password * @param string $passwd password
* @param string $name name of database (not used for mysql, used for pgsql) * @param string $name name of database (not used for mysql, used for pgsql)
* @param integer $port Port of database server * @param integer $port Port of database server
* @return resource Database access handler * @return mysqli Database access handler
* @see close * @see close
*/ */
function connect($host, $login, $passwd, $name, $port=0) function connect($host, $login, $passwd, $name, $port=0)
@ -230,7 +230,7 @@ class DoliDBMysqli extends DoliDB
/** /**
* Close database connexion * Close database connexion
* *
* @return boolean True if disconnect successfull, false otherwise * @return bool True if disconnect successfull, false otherwise
* @see connect * @see connect
*/ */
function close() function close()
@ -251,7 +251,7 @@ class DoliDBMysqli extends DoliDB
* @param int $usesavepoint 0=Default mode, 1=Run a savepoint before and a rollbock to savepoint if error (this allow to have some request with errors inside global transactions). * @param int $usesavepoint 0=Default mode, 1=Run a savepoint before and a rollbock to savepoint if error (this allow to have some request with errors inside global transactions).
* Note that with Mysql, this parameter is not used as Myssql can already commit a transaction even if one request is in error, without using savepoints. * Note that with Mysql, this parameter is not used as Myssql can already commit a transaction even if one request is in error, without using savepoints.
* @param string $type Type of SQL order ('ddl' for insert, update, select, delete or 'dml' for create, alter...) * @param string $type Type of SQL order ('ddl' for insert, update, select, delete or 'dml' for create, alter...)
* @return resource Resultset of answer * @return bool|mysqli_result Resultset of answer
*/ */
function query($query,$usesavepoint=0,$type='auto') function query($query,$usesavepoint=0,$type='auto')
{ {
@ -290,8 +290,8 @@ class DoliDBMysqli extends DoliDB
/** /**
* Renvoie la ligne courante (comme un objet) pour le curseur resultset * Renvoie la ligne courante (comme un objet) pour le curseur resultset
* *
* @param Resultset $resultset Curseur de la requete voulue * @param mysqli_result $resultset Curseur de la requete voulue
* @return Object Object result line or false if KO or end of cursor * @return object|null Object result line or null if KO or end of cursor
*/ */
function fetch_object($resultset) function fetch_object($resultset)
{ {
@ -304,8 +304,8 @@ class DoliDBMysqli extends DoliDB
/** /**
* Return datas as an array * Return datas as an array
* *
* @param Resultset $resultset Resultset of request * @param mysqli_result $resultset Resultset of request
* @return array Array * @return array|null Array or null if KO or end of cursor
*/ */
function fetch_array($resultset) function fetch_array($resultset)
{ {
@ -317,8 +317,8 @@ class DoliDBMysqli extends DoliDB
/** /**
* Return datas as an array * Return datas as an array
* *
* @param resource $resultset Resultset of request * @param mysqli_result $resultset Resultset of request
* @return array Array * @return array|null|0 Array or null if KO or end of cursor or 0 if resultset is bool
*/ */
function fetch_row($resultset) function fetch_row($resultset)
{ {
@ -338,7 +338,7 @@ class DoliDBMysqli extends DoliDB
/** /**
* Return number of lines for result of a SELECT * Return number of lines for result of a SELECT
* *
* @param Resultset $resultset Resulset of requests * @param mysqli_result $resultset Resulset of requests
* @return int Nb of lines * @return int Nb of lines
* @see affected_rows * @see affected_rows
*/ */
@ -352,7 +352,7 @@ class DoliDBMysqli extends DoliDB
/** /**
* Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE * Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE
* *
* @param resultset $resultset Curseur de la requete voulue * @param mysqli_result $resultset Curseur de la requete voulue
* @return int Nombre de lignes * @return int Nombre de lignes
* @see num_rows * @see num_rows
*/ */
@ -369,10 +369,10 @@ class DoliDBMysqli extends DoliDB
/** /**
* Libere le dernier resultset utilise sur cette connexion * Libere le dernier resultset utilise sur cette connexion
* *
* @param resultset $resultset Curseur de la requete voulue * @param mysqli_result $resultset Curseur de la requete voulue
* @return void * @return void
*/ */
function free($resultset=0) function free($resultset=null)
{ {
// If resultset not provided, we take the last used by connexion // If resultset not provided, we take the last used by connexion
if (! is_object($resultset)) { $resultset=$this->_results; } if (! is_object($resultset)) { $resultset=$this->_results; }
@ -401,8 +401,7 @@ class DoliDBMysqli extends DoliDB
if (! $this->connected) { if (! $this->connected) {
// Si il y a eu echec de connexion, $this->db n'est pas valide. // Si il y a eu echec de connexion, $this->db n'est pas valide.
return 'DB_ERROR_FAILED_TO_CONNECT'; return 'DB_ERROR_FAILED_TO_CONNECT';
} } else {
else {
// Constants to convert a MySql error code to a generic Dolibarr error code // Constants to convert a MySql error code to a generic Dolibarr error code
$errorcode_map = array( $errorcode_map = array(
1004 => 'DB_ERROR_CANNOT_CREATE', 1004 => 'DB_ERROR_CANNOT_CREATE',
@ -434,8 +433,7 @@ class DoliDBMysqli extends DoliDB
1451 => 'DB_ERROR_CHILD_EXISTS' 1451 => 'DB_ERROR_CHILD_EXISTS'
); );
if (isset($errorcode_map[mysqli_errno($this->db)])) if (isset($errorcode_map[mysqli_errno($this->db)])) {
{
return $errorcode_map[mysqli_errno($this->db)]; return $errorcode_map[mysqli_errno($this->db)];
} }
$errno=mysqli_errno($this->db); $errno=mysqli_errno($this->db);
@ -464,7 +462,7 @@ class DoliDBMysqli extends DoliDB
* *
* @param string $tab Table name concerned by insert. Ne sert pas sous MySql mais requis pour compatibilite avec Postgresql * @param string $tab Table name concerned by insert. Ne sert pas sous MySql mais requis pour compatibilite avec Postgresql
* @param string $fieldid Field name * @param string $fieldid Field name
* @return int Id of row * @return int|string Id of row
*/ */
function last_insert_id($tab,$fieldid='rowid') function last_insert_id($tab,$fieldid='rowid')
{ {
@ -562,7 +560,7 @@ class DoliDBMysqli extends DoliDB
* @param string $charset Charset used to store data * @param string $charset Charset used to store data
* @param string $collation Charset used to sort data * @param string $collation Charset used to sort data
* @param string $owner Username of database owner * @param string $owner Username of database owner
* @return resource resource defined if OK, null if KO * @return bool|mysqli_result resource defined if OK, null if KO
*/ */
function DDLCreateDb($database,$charset='',$collation='',$owner='') function DDLCreateDb($database,$charset='',$collation='',$owner='')
{ {
@ -638,11 +636,13 @@ class DoliDBMysqli extends DoliDB
* @param string $type Type de la table * @param string $type Type de la table
* @param array $unique_keys Tableau associatifs Nom de champs qui seront clef unique => valeur * @param array $unique_keys Tableau associatifs Nom de champs qui seront clef unique => valeur
* @param array $fulltext_keys Tableau des Nom de champs qui seront indexes en fulltext * @param array $fulltext_keys Tableau des Nom de champs qui seront indexes en fulltext
* @param string $keys Tableau des champs cles noms => valeur * @param array $keys Tableau des champs cles noms => valeur
* @return int <0 if KO, >=0 if OK * @return int <0 if KO, >=0 if OK
*/ */
function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="") function DDLCreateTable($table,$fields,$primary_key,$type,$unique_keys=null,$fulltext_keys=null,$keys=null)
{ {
// FIXME: $fulltext_keys parameter is unused
// cles recherchees dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra // cles recherchees dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra
// ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment'); // ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql = "CREATE TABLE ".$table."("; $sql = "CREATE TABLE ".$table."(";
@ -677,8 +677,7 @@ class DoliDBMysqli extends DoliDB
if($primary_key != "") if($primary_key != "")
$pk = "primary key(".$primary_key.")"; $pk = "primary key(".$primary_key.")";
if($unique_keys != "") if(is_array($unique_keys)) {
{
$i = 0; $i = 0;
foreach($unique_keys as $key => $value) foreach($unique_keys as $key => $value)
{ {
@ -686,7 +685,7 @@ class DoliDBMysqli extends DoliDB
$i++; $i++;
} }
} }
if($keys != "") if(is_array($keys))
{ {
$i = 0; $i = 0;
foreach($keys as $key => $value) foreach($keys as $key => $value)
@ -700,7 +699,7 @@ class DoliDBMysqli extends DoliDB
$sql .= ",".$pk; $sql .= ",".$pk;
if($unique_keys != "") if($unique_keys != "")
$sql .= ",".implode(',',$sqluq); $sql .= ",".implode(',',$sqluq);
if($keys != "") if(is_array($keys))
$sql .= ",".implode(',',$sqlk); $sql .= ",".implode(',',$sqlk);
$sql .=") engine=".$type; $sql .=") engine=".$type;
@ -716,7 +715,7 @@ class DoliDBMysqli extends DoliDB
* *
* @param string $table Name of table * @param string $table Name of table
* @param string $field Optionnel : Name of field if we want description of field * @param string $field Optionnel : Name of field if we want description of field
* @return resource Resultset x (x->Field, x->Type, ...) * @return bool|mysqli_result Resultset x (x->Field, x->Type, ...)
*/ */
function DDLDescTable($table,$field="") function DDLDescTable($table,$field="")
{ {
@ -763,14 +762,10 @@ class DoliDBMysqli extends DoliDB
$sql.= " ".$field_position; $sql.= " ".$field_position;
dol_syslog(get_class($this)."::DDLAddField ".$sql,LOG_DEBUG); dol_syslog(get_class($this)."::DDLAddField ".$sql,LOG_DEBUG);
if(! $this->query($sql)) if($this->query($sql)) {
{
return -1;
}
else
{
return 1; return 1;
} }
return -1;
} }
/** /**
@ -808,13 +803,12 @@ class DoliDBMysqli extends DoliDB
{ {
$sql= "ALTER TABLE ".$table." DROP COLUMN `".$field_name."`"; $sql= "ALTER TABLE ".$table." DROP COLUMN `".$field_name."`";
dol_syslog(get_class($this)."::DDLDropField ".$sql,LOG_DEBUG); dol_syslog(get_class($this)."::DDLDropField ".$sql,LOG_DEBUG);
if (! $this->query($sql)) if ($this->query($sql)) {
{ return 1;
}
$this->error=$this->lasterror(); $this->error=$this->lasterror();
return -1; return -1;
} }
else return 1;
}
/** /**
@ -883,7 +877,7 @@ class DoliDBMysqli extends DoliDB
/** /**
* Return list of available charset that can be used to store data in database * Return list of available charset that can be used to store data in database
* *
* @return array List of Charset * @return array|null List of Charset
*/ */
function getListOfCharacterSet() function getListOfCharacterSet()
{ {
@ -926,7 +920,7 @@ class DoliDBMysqli extends DoliDB
/** /**
* Return list of available collation that can be used for database * Return list of available collation that can be used for database
* *
* @return array Liste of Collation * @return array|null Liste of Collation
*/ */
function getListOfCollation() function getListOfCollation()
{ {