From 6e6e63db503d23d03237da0be2066b2ad58b2cf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 12 May 2015 17:56:01 +0200 Subject: [PATCH] Better type hinting and code structure for the MySQLi database driver --- htdocs/core/db/Database.interface.php | 2 +- htdocs/core/db/mysql.class.php | 4 +- htdocs/core/db/mysqli.class.php | 82 +++++++++++++-------------- 3 files changed, 41 insertions(+), 47 deletions(-) diff --git a/htdocs/core/db/Database.interface.php b/htdocs/core/db/Database.interface.php index f27c4e75189..b09e4e48db2 100644 --- a/htdocs/core/db/Database.interface.php +++ b/htdocs/core/db/Database.interface.php @@ -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 { diff --git a/htdocs/core/db/mysql.class.php b/htdocs/core/db/mysql.class.php index 809402de28c..e4efaa50b97 100644 --- a/htdocs/core/db/mysql.class.php +++ b/htdocs/core/db/mysql.class.php @@ -21,13 +21,13 @@ /** * \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'; /** - * 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 { diff --git a/htdocs/core/db/mysqli.class.php b/htdocs/core/db/mysqli.class.php index 1126f6c8a57..77d484b92bf 100644 --- a/htdocs/core/db/mysqli.class.php +++ b/htdocs/core/db/mysqli.class.php @@ -21,13 +21,13 @@ /** * \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'; /** - * 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 { @@ -36,7 +36,7 @@ class DoliDBMysqli extends DoliDB //! Database label const LABEL='MySQL'; //! Version min database - const VERSIONMIN='4.1.0'; + const VERSIONMIN='4.1.3'; //! Resultset of last query private $_results; @@ -187,7 +187,7 @@ class DoliDBMysqli extends DoliDB * @param string $passwd password * @param string $name name of database (not used for mysql, used for pgsql) * @param integer $port Port of database server - * @return resource Database access handler + * @return mysqli Database access handler * @see close */ function connect($host, $login, $passwd, $name, $port=0) @@ -230,7 +230,7 @@ class DoliDBMysqli extends DoliDB /** * Close database connexion * - * @return boolean True if disconnect successfull, false otherwise + * @return bool True if disconnect successfull, false otherwise * @see connect */ 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). * 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...) - * @return resource Resultset of answer + * @return bool|mysqli_result Resultset of answer */ 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 * - * @param Resultset $resultset Curseur de la requete voulue - * @return Object Object result line or false if KO or end of cursor + * @param mysqli_result $resultset Curseur de la requete voulue + * @return object|null Object result line or null if KO or end of cursor */ function fetch_object($resultset) { @@ -304,8 +304,8 @@ class DoliDBMysqli extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request - * @return array Array + * @param mysqli_result $resultset Resultset of request + * @return array|null Array or null if KO or end of cursor */ function fetch_array($resultset) { @@ -317,8 +317,8 @@ class DoliDBMysqli extends DoliDB /** * Return datas as an array * - * @param resource $resultset Resultset of request - * @return array Array + * @param mysqli_result $resultset Resultset of request + * @return array|null|0 Array or null if KO or end of cursor or 0 if resultset is bool */ function fetch_row($resultset) { @@ -338,8 +338,8 @@ class DoliDBMysqli extends DoliDB /** * Return number of lines for result of a SELECT * - * @param Resultset $resultset Resulset of requests - * @return int Nb of lines + * @param mysqli_result $resultset Resulset of requests + * @return int Nb of lines * @see affected_rows */ function num_rows($resultset) @@ -352,8 +352,8 @@ class DoliDBMysqli extends DoliDB /** * Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE * - * @param resultset $resultset Curseur de la requete voulue - * @return int Nombre de lignes + * @param mysqli_result $resultset Curseur de la requete voulue + * @return int Nombre de lignes * @see num_rows */ function affected_rows($resultset) @@ -369,10 +369,10 @@ class DoliDBMysqli extends DoliDB /** * 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 */ - function free($resultset=0) + function free($resultset=null) { // If resultset not provided, we take the last used by connexion if (! is_object($resultset)) { $resultset=$this->_results; } @@ -401,8 +401,7 @@ class DoliDBMysqli extends DoliDB if (! $this->connected) { // Si il y a eu echec de connexion, $this->db n'est pas valide. return 'DB_ERROR_FAILED_TO_CONNECT'; - } - else { + } else { // Constants to convert a MySql error code to a generic Dolibarr error code $errorcode_map = array( 1004 => 'DB_ERROR_CANNOT_CREATE', @@ -434,8 +433,7 @@ class DoliDBMysqli extends DoliDB 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)]; } $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 $fieldid Field name - * @return int Id of row + * @return int|string Id of row */ 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 $collation Charset used to sort data * @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='') { @@ -638,11 +636,13 @@ class DoliDBMysqli extends DoliDB * @param string $type Type de la table * @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 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 */ - 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 // ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment'); $sql = "CREATE TABLE ".$table."("; @@ -677,8 +677,7 @@ class DoliDBMysqli extends DoliDB if($primary_key != "") $pk = "primary key(".$primary_key.")"; - if($unique_keys != "") - { + if(is_array($unique_keys)) { $i = 0; foreach($unique_keys as $key => $value) { @@ -686,7 +685,7 @@ class DoliDBMysqli extends DoliDB $i++; } } - if($keys != "") + if(is_array($keys)) { $i = 0; foreach($keys as $key => $value) @@ -700,7 +699,7 @@ class DoliDBMysqli extends DoliDB $sql .= ",".$pk; if($unique_keys != "") $sql .= ",".implode(',',$sqluq); - if($keys != "") + if(is_array($keys)) $sql .= ",".implode(',',$sqlk); $sql .=") engine=".$type; @@ -716,7 +715,7 @@ class DoliDBMysqli extends DoliDB * * @param string $table Name of table * @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="") { @@ -763,14 +762,10 @@ class DoliDBMysqli extends DoliDB $sql.= " ".$field_position; dol_syslog(get_class($this)."::DDLAddField ".$sql,LOG_DEBUG); - if(! $this->query($sql)) - { - return -1; - } - else - { + if($this->query($sql)) { return 1; } + return -1; } /** @@ -808,12 +803,11 @@ class DoliDBMysqli extends DoliDB { $sql= "ALTER TABLE ".$table." DROP COLUMN `".$field_name."`"; dol_syslog(get_class($this)."::DDLDropField ".$sql,LOG_DEBUG); - if (! $this->query($sql)) - { - $this->error=$this->lasterror(); - return -1; + if ($this->query($sql)) { + return 1; } - else return 1; + $this->error=$this->lasterror(); + 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 array List of Charset + * @return array|null List of Charset */ function getListOfCharacterSet() { @@ -926,7 +920,7 @@ class DoliDBMysqli extends DoliDB /** * Return list of available collation that can be used for database * - * @return array Liste of Collation + * @return array|null Liste of Collation */ function getListOfCollation() {