diff --git a/htdocs/install/etape2.php b/htdocs/install/etape2.php index 025649af16d..031937481c3 100644 --- a/htdocs/install/etape2.php +++ b/htdocs/install/etape2.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2009 Laurent Destailleur + * Copyright (C) 2004-2010 Laurent Destailleur * * 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 @@ -20,7 +20,7 @@ /** * \file htdocs/install/etape2.php * \ingroup install - * \brief Cree les tables, cles primaires, cles etrangeres, index et fonctions en base puis charge les donnees de reference + * \brief Create tables, primary keys, foreign keys, indexes and functions into database and then load reference data * \version $Id$ */ @@ -173,11 +173,12 @@ if ($_POST["action"] == "set") $buf = fgets($fp, 4096); if (substr($buf, 0, 2) <> '--') { + /* I disable this as it is already done into the query function if ($choix != 1) // All databases except Mysql { - $buf=$db->convertSQLFromMysql($buf); + $buf=$db->convertSQLFromMysql($buf,'dml'); } - + */ $buffer .= $buf; } } @@ -193,7 +194,7 @@ if ($_POST["action"] == "set") } dolibarr_install_syslog("Request: ".$buffer,LOG_DEBUG); - $resql=$db->query($buffer); + $resql=$db->query($buffer,0,'dml'); if ($resql) { // print "OK requete ==== $buffer"; diff --git a/htdocs/install/etape5.php b/htdocs/install/etape5.php index 833d754c696..3496469c15b 100644 --- a/htdocs/install/etape5.php +++ b/htdocs/install/etape5.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2009 Laurent Destailleur + * Copyright (C) 2004-2010 Laurent Destailleur * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2004 Sebastien DiCintio * Copyright (C) 2005-2009 Regis Houssin @@ -170,6 +170,7 @@ if ($_POST["action"] == "set" || preg_match('/upgrade/i',$_POST["action"])) $newuser->admin=1; $newuser->entity=0; + $conf->global->USER_MAIL_REQUIRED=0; // Force global option to be sure to create a new user with no email $result=$newuser->create($createuser,1); if ($result > 0) { diff --git a/htdocs/lib/databases/mssql.lib.php b/htdocs/lib/databases/mssql.lib.php index 904c1b49b06..ab5f2d32d76 100644 --- a/htdocs/lib/databases/mssql.lib.php +++ b/htdocs/lib/databases/mssql.lib.php @@ -75,14 +75,14 @@ class DoliDb /** - * \brief Ouverture d'une connexion vers le serveur et eventuellement une database. - * \param type Type de base de donnees (mysql ou pgsql) - * \param host Addresse de la base de donnees - * \param user Nom de l'utilisateur autorise - * \param pass Mot de passe - * \param name Nom de la database - * \param port Port of database server - * \return int 1 en cas de succes, 0 sinon + * Ouverture d'une connexion vers le serveur et eventuellement une database. + * @param type Type de base de donnees (mysql ou pgsql) + * @param host Addresse de la base de donnees + * @param user Nom de l'utilisateur autorise + * @param pass Mot de passe + * @param name Nom de la database + * @param port Port of database server + * @return int 1 en cas de succes, 0 sinon */ function DoliDb($type='mssql', $host, $user, $pass, $name='', $port=0) { @@ -154,20 +154,21 @@ class DoliDb return $this->ok; } - /** - * \brief Convert a SQL request in mysql syntax to database syntax - * \param line SQL request line to convert - * \return string SQL request line converted - */ - function convertSQLFromMysql($line) + /** + * Convert a SQL request in Mysql syntax to PostgreSQL syntax + * @param line SQL request line to convert + * @param type Type of SQL order ('ddl' for insert, update, select, delete or 'dml' for create, alter...) + * @return string SQL request line converted + */ + function convertSQLFromMysql($line,$type='ddl') { return $line; } /** - * \brief Selectionne une database. - * \param database Nom de la database - * \return boolean true si ok, false si ko + * Selectionne une database. + * @param database Nom de la database + * @return boolean true si ok, false si ko */ function select_db($database) { @@ -175,14 +176,14 @@ class DoliDb } /** - \brief Connection vers le serveur - \param host addresse de la base de donnees - \param login nom de l'utilisateur autoris - \param passwd mot de passe - \param name nom de la database (ne sert pas sous mysql, sert sous pgsql) - \param port Port of database server - \return resource handler d'acces a la base - \seealso close + * Connection vers le serveur + * @param host addresse de la base de donnees + * @param login nom de l'utilisateur autoris + * @param passwd mot de passe + * @param name nom de la database (ne sert pas sous mysql, sert sous pgsql) + * @param port Port of database server + * @return resource handler d'acces a la base + * @see close */ function connect($host, $login, $passwd, $name, $port=0) { @@ -230,9 +231,9 @@ class DoliDb /** - \brief Fermeture d'une connexion vers une database. - \return resource - \seealso connect + * \brief Fermeture d'une connexion vers une database. + * \return resource + * \see connect */ function close() { @@ -242,9 +243,9 @@ class DoliDb /** - \brief Debut d'une transaction. - \return int 1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur - */ + * \brief Debut d'une transaction. + * \return int 1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur + */ function begin() { if (! $this->transaction_opened) @@ -265,9 +266,10 @@ class DoliDb } /** - \brief Validation d'une transaction - \return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur - */ + * Validate a database transaction + * @param log Add more log to default log line + * @return int 1 if validation is OK or transaction level no started, 0 if ERROR + */ function commit() { if ($this->transaction_opened <= 1) @@ -288,8 +290,8 @@ class DoliDb } /** - \brief Annulation d'une transaction et retour aux anciennes valeurs - \return int 1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur + * \brief Annulation d'une transaction et retour aux anciennes valeurs + * \return int 1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur */ function rollback() { @@ -308,12 +310,14 @@ class DoliDb } /** - * \brief Effectue une requete et renvoi le resultset de reponse de la base - * \param query SQL query string - * \param 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). - * \return resource Resultset of answer + * Execute a SQL request and return the resultset + * @param query SQL query string + * @param 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 type Type of SQL order ('ddl' for insert, update, select, delete or 'dml' for create, alter...) + * @return resource Resultset of answer */ - function query($query,$usesavepoint=0) + function query($query,$usesavepoint=0,$type='ddl') { $query = trim($query); @@ -409,9 +413,9 @@ class DoliDb } /** - \brief Renvoie les donnees dans un tableau. - \param resultset Curseur de la requete voulue - \return array + * \brief Renvoie les donnees dans un tableau. + * \param resultset Curseur de la requete voulue + * \return array */ function fetch_array($resultset) { @@ -422,9 +426,9 @@ class DoliDb /** - \brief Renvoie les donnees comme un tableau. - \param resultset Curseur de la requete voulue - \return array + * \brief Renvoie les donnees comme un tableau. + * \param resultset Curseur de la requete voulue + * \return array */ function fetch_row($resultset) { @@ -434,10 +438,10 @@ class DoliDb } /** - \brief Renvoie le nombre de lignes dans le resultat d'une requete SELECT - \see affected_rows - \param resultset Curseur de la requete voulue - \return int Nombre de lignes + * \brief Renvoie le nombre de lignes dans le resultat d'une requete SELECT + * \see affected_rows + * \param resultset Curseur de la requete voulue + * \return int Nombre de lignes */ function num_rows($resultset) { diff --git a/htdocs/lib/databases/mysql.lib.php b/htdocs/lib/databases/mysql.lib.php index 12267fa0726..bf274106992 100644 --- a/htdocs/lib/databases/mysql.lib.php +++ b/htdocs/lib/databases/mysql.lib.php @@ -74,14 +74,14 @@ class DoliDb /** - * \brief Ouverture d'une connexion vers le serveur et eventuellement une database. - * \param type Type de base de donnees (mysql ou pgsql) - * \param host Addresse de la base de donnees - * \param user Nom de l'utilisateur autorise - * \param pass Mot de passe - * \param name Nom de la database - * \param port Port of database server - * \return int 1 en cas de succes, 0 sinon + * Ouverture d'une connexion vers le serveur et eventuellement une database. + * @param type Type de base de donnees (mysql ou pgsql) + * @param host Addresse de la base de donnees + * @param user Nom de l'utilisateur autorise + * @param pass Mot de passe + * @param name Nom de la database + * @param port Port of database server + * @return int 1 en cas de succes, 0 sinon */ function DoliDb($type='mysql', $host, $user, $pass, $name='', $port=0) { @@ -181,12 +181,13 @@ class DoliDb } - /** - * \brief Convert a SQL request in mysql syntax to database syntax - * \param line SQL request line to convert - * \return string SQL request line converted - */ - function convertSQLFromMysql($line) + /** + * Convert a SQL request in Mysql syntax to PostgreSQL syntax + * @param line SQL request line to convert + * @param type Type of SQL order ('ddl' for insert, update, select, delete or 'dml' for create, alter...) + * @return string SQL request line converted + */ + function convertSQLFromMysql($line,$type='ddl') { return $line; } @@ -309,9 +310,9 @@ class DoliDb } /** - * \brief Validation d'une transaction - * \param log Add more log to default log line - * \return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur + * Validate a database transaction + * @param log Add more log to default log line + * @return int 1 if validation is OK or transaction level no started, 0 if ERROR */ function commit($log='') { @@ -354,13 +355,14 @@ class DoliDb } /** - * \brief Execute a SQL request and return the resultset - * \param query SQL query string - * \param 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). + * Execute a SQL request and return the resultset + * @param query SQL query string + * @param 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. - * \return resource Resultset of answer + * @param type Type of SQL order ('ddl' for insert, update, select, delete or 'dml' for create, alter...) + * @return resource Resultset of answer */ - function query($query,$usesavepoint=0) + function query($query,$usesavepoint=0,$type='ddl') { $query = trim($query); @@ -399,7 +401,7 @@ class DoliDb */ function fetch_object($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_resource($resultset)) { $resultset=$this->results; } return mysql_fetch_object($resultset); } @@ -411,7 +413,7 @@ class DoliDb */ function fetch_array($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_resource($resultset)) { $resultset=$this->results; } return mysql_fetch_array($resultset); } @@ -424,7 +426,7 @@ class DoliDb */ function fetch_row($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_resource($resultset)) { $resultset=$this->results; } return @mysql_fetch_row($resultset); } @@ -437,7 +439,7 @@ class DoliDb */ function num_rows($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_resource($resultset)) { $resultset=$this->results; } return mysql_num_rows($resultset); } @@ -450,7 +452,7 @@ class DoliDb */ function affected_rows($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_resource($resultset)) { $resultset=$this->results; } // mysql necessite un link de base pour cette fonction contrairement // a pqsql qui prend un resultset @@ -464,7 +466,7 @@ class DoliDb */ function free($resultset=0) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_resource($resultset)) { $resultset=$this->results; } // Si resultset en est un, on libere la memoire if (is_resource($resultset)) mysql_free_result($resultset); diff --git a/htdocs/lib/databases/mysqli.lib.php b/htdocs/lib/databases/mysqli.lib.php index f4c32c858e7..525ae643e89 100644 --- a/htdocs/lib/databases/mysqli.lib.php +++ b/htdocs/lib/databases/mysqli.lib.php @@ -75,14 +75,14 @@ class DoliDb /** - * \brief Ouverture d'une connexion vers le serveur et eventuellement une database. - * \param type Type de base de donnees (mysql ou pgsql) - * \param host Addresse de la base de donnees - * \param user Nom de l'utilisateur autorise - * \param pass Mot de passe - * \param name Nom de la database - * \param port Port of database server - * \return int 1 en cas de succes, 0 sinon + * Ouverture d'une connexion vers le serveur et eventuellement une database. + * @param type Type de base de donnees (mysql ou pgsql) + * @param host Addresse de la base de donnees + * @param user Nom de l'utilisateur autorise + * @param pass Mot de passe + * @param name Nom de la database + * @param port Port of database server + * @return int 1 en cas de succes, 0 sinon */ function DoliDb($type='mysqli', $host, $user, $pass, $name='', $port=0) { @@ -184,12 +184,13 @@ class DoliDb } - /** - * \brief Convert a SQL request in mysql syntax to database syntax - * \param line SQL request line to convert - * \return string SQL request line converted - */ - function convertSQLFromMysql($line) + /** + * Convert a SQL request in Mysql syntax to PostgreSQL syntax + * @param line SQL request line to convert + * @param type Type of SQL order ('ddl' for insert, update, select, delete or 'dml' for create, alter...) + * @return string SQL request line converted + */ + function convertSQLFromMysql($line,$type='ddl') { return $line; } @@ -316,9 +317,9 @@ class DoliDb } /** - * \brief Validation d'une transaction - * \param log Add more log to default log line - * \return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur + * Validate a database transaction + * @param log Add more log to default log line + * @return int 1 if validation is OK or transaction level no started, 0 if ERROR */ function commit($log='') { @@ -361,13 +362,14 @@ class DoliDb } /** - * \brief Execute a SQL request and return the resultset - * \param query SQL query string - * \param 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). + * Execute a SQL request and return the resultset + * @param query SQL query string + * @param 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. - * \return resource Resultset of answer + * @param type Type of SQL order ('ddl' for insert, update, select, delete or 'dml' for create, alter...) + * @return resource Resultset of answer */ - function query($query,$usesavepoint=0) + function query($query,$usesavepoint=0,$type='ddl') { $query = trim($query); if (! $this->database_name) @@ -417,7 +419,7 @@ class DoliDb */ function fetch_array($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_object($resultset)) { $resultset=$this->results; } return mysqli_fetch_array($resultset); } @@ -429,7 +431,7 @@ class DoliDb */ function fetch_row($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_bool($resultset)) { if (! is_object($resultset)) { $resultset=$this->results; } @@ -450,7 +452,7 @@ class DoliDb */ function num_rows($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_object($resultset)) { $resultset=$this->results; } return mysqli_num_rows($resultset); } @@ -464,7 +466,7 @@ class DoliDb function affected_rows($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_object($resultset)) { $resultset=$this->results; } // mysql necessite un link de base pour cette fonction contrairement // a pqsql qui prend un resultset @@ -478,7 +480,7 @@ class DoliDb */ function free($resultset=0) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_object($resultset)) { $resultset=$this->results; } // Si resultset en est un, on libere la memoire if (is_object($resultset)) mysqli_free_result($resultset); diff --git a/htdocs/lib/databases/pgsql.lib.php b/htdocs/lib/databases/pgsql.lib.php index 848530a0e44..ba9b21a3328 100644 --- a/htdocs/lib/databases/pgsql.lib.php +++ b/htdocs/lib/databases/pgsql.lib.php @@ -149,11 +149,12 @@ class DoliDb /** - * \brief Convert a SQL request in Mysql syntax to PostgreSQL syntax - * \param line SQL request line to convert - * \return string SQL request line converted + * Convert a SQL request in Mysql syntax to PostgreSQL syntax + * @param line SQL request line to convert + * @param type Type of SQL order ('ddl' for insert, update, select, delete or 'dml' for create, alter...) + * @return string SQL request line converted */ - function convertSQLFromMysql($line) + function convertSQLFromMysql($line,$type='ddl') { # Removed empty line if this is a comment line for SVN tagging if (preg_match('/^--\s\$Id/i',$line)) { @@ -166,104 +167,106 @@ class DoliDb } if ($line != "") { - # we are inside create table statement so lets process datatypes - if (preg_match('/(ISAM|innodb)/i',$line)) { # end of create table sequence - $line=preg_replace('/\)[\s\t]*type[\s\t]*=[\s\t]*(MyISAM|innodb);/i',');',$line); - $line=preg_replace('/\)[\s\t]*engine[\s\t]*=[\s\t]*(MyISAM|innodb);/i',');',$line); - $line=preg_replace('/,$/','',$line); - } + if ($type == 'dml') + { + # we are inside create table statement so lets process datatypes + if (preg_match('/(ISAM|innodb)/i',$line)) { # end of create table sequence + $line=preg_replace('/\)[\s\t]*type[\s\t]*=[\s\t]*(MyISAM|innodb);/i',');',$line); + $line=preg_replace('/\)[\s\t]*engine[\s\t]*=[\s\t]*(MyISAM|innodb);/i',');',$line); + $line=preg_replace('/,$/','',$line); + } - if (preg_match('/[\s\t]*(\w*)\s*.*int.*auto_increment/i',$line,$reg)) { - $line=preg_replace('/[\s\t]*([a-zA-Z_0-9]*)[\s\t]*.*int.*auto_increment[^,]*/i','\\1 SERIAL PRIMARY KEY',$line); - } + if (preg_match('/[\s\t]*(\w*)\s*.*int.*auto_increment/i',$line,$reg)) { + $line=preg_replace('/[\s\t]*([a-zA-Z_0-9]*)[\s\t]*.*int.*auto_increment[^,]*/i','\\1 SERIAL PRIMARY KEY',$line); + } - # tinyint type conversion - $line=str_replace('tinyint','smallint',$line); + # tinyint type conversion + $line=str_replace('tinyint','smallint',$line); - # nuke unsigned - $line=preg_replace('/(int\w+|smallint)\s+unsigned/i','\\1',$line); + # nuke unsigned + $line=preg_replace('/(int\w+|smallint)\s+unsigned/i','\\1',$line); - # blob -> text - $line=preg_replace('/\w*blob/i','text',$line); + # blob -> text + $line=preg_replace('/\w*blob/i','text',$line); - # tinytext/mediumtext -> text - $line=preg_replace('/tinytext/i','text',$line); - $line=preg_replace('/mediumtext/i','text',$line); + # tinytext/mediumtext -> text + $line=preg_replace('/tinytext/i','text',$line); + $line=preg_replace('/mediumtext/i','text',$line); - # change not null datetime field to null valid ones - # (to support remapping of "zero time" to null - $line=preg_replace('/datetime not null/i','datetime',$line); - $line=preg_replace('/datetime/i','timestamp',$line); + # change not null datetime field to null valid ones + # (to support remapping of "zero time" to null + $line=preg_replace('/datetime not null/i','datetime',$line); + $line=preg_replace('/datetime/i','timestamp',$line); - # double -> numeric - // FIXME problem if value contain "double" word - $line=preg_replace('/^double/i','numeric',$line); - $line=preg_replace('/(\s*)double/i','\\1numeric',$line); - # float -> numeric - $line=preg_replace('/^float/i','numeric',$line); - $line=preg_replace('/(\s*)float/i','\\1numeric',$line); + # double -> numeric + $line=preg_replace('/^double/i','numeric',$line); + $line=preg_replace('/(\s*)double/i','\\1numeric',$line); + # float -> numeric + $line=preg_replace('/^float/i','numeric',$line); + $line=preg_replace('/(\s*)float/i','\\1numeric',$line); - # unique index(field1,field2) - if (preg_match('/unique index\s*\((\w+\s*,\s*\w+)\)/i',$line)) - { - $line=preg_replace('/unique index\s*\((\w+\s*,\s*\w+)\)/i','UNIQUE\(\\1\)',$line); - } + # unique index(field1,field2) + if (preg_match('/unique index\s*\((\w+\s*,\s*\w+)\)/i',$line)) + { + $line=preg_replace('/unique index\s*\((\w+\s*,\s*\w+)\)/i','UNIQUE\(\\1\)',$line); + } + + # We remove end of requests "AFTER fieldxxx" + $line=preg_replace('/AFTER [a-z0-9_]+/i','',$line); + + # We remove start of requests "ALTER TABLE tablexxx" if this is a DROP INDEX + $line=preg_replace('/ALTER TABLE [a-z0-9_]+ DROP INDEX/i','DROP INDEX',$line); + + # Translate order to rename fields + if (preg_match('/ALTER TABLE ([a-z0-9_]+) CHANGE(?: COLUMN)? ([a-z0-9_]+) ([a-z0-9_]+)(.*)$/i',$line,$reg)) + { + $line = "-- ".$line." replaced by --\n"; + $line.= "ALTER TABLE ".$reg[1]." RENAME COLUMN ".$reg[2]." TO ".$reg[3]; + } + + # Translate order to modify field format + if (preg_match('/ALTER TABLE ([a-z0-9_]+) MODIFY(?: COLUMN)? ([a-z0-9_]+) (.*)$/i',$line,$reg)) + { + $line = "-- ".$line." replaced by --\n"; + $newreg3=$reg[3]; + $newreg3=preg_replace('/ NOT NULL/i','',$newreg3); + $newreg3=preg_replace('/ NULL/i','',$newreg3); + $newreg3=preg_replace('/ DEFAULT 0/i','',$newreg3); + $newreg3=preg_replace('/ DEFAULT \'[0-9a-zA-Z_@]*\'/i','',$newreg3); + $line.= "ALTER TABLE ".$reg[1]." ALTER COLUMN ".$reg[2]." TYPE ".$newreg3; + } + + # alter table add primary key (field1, field2 ...) -> We remove the primary key name not accepted by PostGreSQL + # ALTER TABLE llx_dolibarr_modules ADD PRIMARY KEY pk_dolibarr_modules (numero, entity); + if (preg_match('/ALTER\s+TABLE\s*(.*)\s*ADD\s+PRIMARY\s+KEY\s*(.*)\s*\((.*)$/i',$line,$reg)) + { + $line = "-- ".$line." replaced by --\n"; + $line.= "ALTER TABLE ".$reg[1]." ADD PRIMARY KEY (".$reg[3]; + } + + # Translate order to drop foreign keys + # ALTER TABLE llx_dolibarr_modules DROP FOREIGN KEY fk_xxx; + if (preg_match('/ALTER\s+TABLE\s*(.*)\s*DROP\s+FOREIGN\s+KEY\s*(.*)$/i',$line,$reg)) + { + $line = "-- ".$line." replaced by --\n"; + $line.= "ALTER TABLE ".$reg[1]." DROP CONSTRAINT ".$reg[2]; + } + + # alter table add [unique] [index] (field1, field2 ...) + # ALTER TABLE llx_accountingaccount ADD INDEX idx_accountingaccount_fk_pcg_version (fk_pcg_version) + if (preg_match('/ALTER\s+TABLE\s*(.*)\s*ADD\s+(UNIQUE INDEX|INDEX|UNIQUE)\s+(.*)\s*\(([\w,\s]+)\)/i',$line,$reg)) + { + $fieldlist=$reg[4]; + $idxname=$reg[3]; + $tablename=$reg[1]; + $line = "-- ".$line." replaced by --\n"; + $line.= "CREATE ".(preg_match('/UNIQUE/',$reg[2])?'UNIQUE ':'')."INDEX ".$idxname." ON ".$tablename." (".$fieldlist.")"; + } + } // To have postgresql case sensitive $line=str_replace(' LIKE \'',' ILIKE \'',$line); - # We remove end of requests "AFTER fieldxxx" - $line=preg_replace('/AFTER [a-z0-9_]+/i','',$line); - - # We remove start of requests "ALTER TABLE tablexxx" if this is a DROP INDEX - $line=preg_replace('/ALTER TABLE [a-z0-9_]+ DROP INDEX/i','DROP INDEX',$line); - - # Translate order to rename fields - if (preg_match('/ALTER TABLE ([a-z0-9_]+) CHANGE(?: COLUMN)? ([a-z0-9_]+) ([a-z0-9_]+)(.*)$/i',$line,$reg)) - { - $line = "-- ".$line." replaced by --\n"; - $line.= "ALTER TABLE ".$reg[1]." RENAME COLUMN ".$reg[2]." TO ".$reg[3]; - } - - # Translate order to modify field format - if (preg_match('/ALTER TABLE ([a-z0-9_]+) MODIFY(?: COLUMN)? ([a-z0-9_]+) (.*)$/i',$line,$reg)) - { - $line = "-- ".$line." replaced by --\n"; - $newreg3=$reg[3]; - $newreg3=preg_replace('/ NOT NULL/i','',$newreg3); - $newreg3=preg_replace('/ NULL/i','',$newreg3); - $newreg3=preg_replace('/ DEFAULT 0/i','',$newreg3); - $newreg3=preg_replace('/ DEFAULT \'[0-9a-zA-Z_@]*\'/i','',$newreg3); - $line.= "ALTER TABLE ".$reg[1]." ALTER COLUMN ".$reg[2]." TYPE ".$newreg3; - } - - # alter table add primary key (field1, field2 ...) -> We remove the primary key name not accepted by PostGreSQL - # ALTER TABLE llx_dolibarr_modules ADD PRIMARY KEY pk_dolibarr_modules (numero, entity); - if (preg_match('/ALTER\s+TABLE\s*(.*)\s*ADD\s+PRIMARY\s+KEY\s*(.*)\s*\((.*)$/i',$line,$reg)) - { - $line = "-- ".$line." replaced by --\n"; - $line.= "ALTER TABLE ".$reg[1]." ADD PRIMARY KEY (".$reg[3]; - } - - # Translate order to drop foreign keys - # ALTER TABLE llx_dolibarr_modules DROP FOREIGN KEY fk_xxx; - if (preg_match('/ALTER\s+TABLE\s*(.*)\s*DROP\s+FOREIGN\s+KEY\s*(.*)$/i',$line,$reg)) - { - $line = "-- ".$line." replaced by --\n"; - $line.= "ALTER TABLE ".$reg[1]." DROP CONSTRAINT ".$reg[2]; - } - - # alter table add [unique] [index] (field1, field2 ...) - # ALTER TABLE llx_accountingaccount ADD INDEX idx_accountingaccount_fk_pcg_version (fk_pcg_version) - if (preg_match('/ALTER\s+TABLE\s*(.*)\s*ADD\s+(UNIQUE INDEX|INDEX|UNIQUE)\s+(.*)\s*\(([\w,\s]+)\)/i',$line,$reg)) - { - $fieldlist=$reg[4]; - $idxname=$reg[3]; - $tablename=$reg[1]; - $line = "-- ".$line." replaced by --\n"; - $line.= "CREATE ".(preg_match('/UNIQUE/',$reg[2])?'UNIQUE ':'')."INDEX ".$idxname." ON ".$tablename." (".$fieldlist.")"; - } - // Delete using criteria on other table must not declare twice the deleted table // DELETE FROM tabletodelete USING tabletodelete, othertable -> DELETE FROM tabletodelete USING othertable if (preg_match('/DELETE FROM ([a-z_]+) USING ([a-z_]+), ([a-z_]+)/i',$line,$reg)) @@ -306,28 +309,26 @@ class DoliDb } /** - * \brief Select a database - * \param database nom de la database - * \return boolean true si ok, false si ko - * \remarks Ici postgresql n'a aucune fonction equivalente de mysql_select_db - * \remarks On compare juste manuellement si la database choisie est bien celle activee par la connexion + * Select a database. + * Ici postgresql n'a aucune fonction equivalente de mysql_select_db + * On compare juste manuellement si la database choisie est bien celle activee par la connexion + * @param database nom de la database + * @return boolean true si ok, false si ko */ function select_db($database) { - if ($database == $this->database_name) - return true; - else - return false; + if ($database == $this->database_name) return true; + else return false; } /** - * \brief Connection vers le serveur - * \param host addresse de la base de donnees - * \param login nom de l'utilisateur autorise - * \param passwd mot de passe - * \param name nom de la database (ne sert pas sous mysql, sert sous pgsql) - * \param port Port of database server - * \return resource handler d'acces a la base + * Connection vers le serveur + * @param host addresse de la base de donnees + * @param login nom de l'utilisateur autorise + * @param passwd mot de passe + * @param name nom de la database (ne sert pas sous mysql, sert sous pgsql) + * @param port Port of database server + * @return resource handler d'acces a la base */ function connect($host, $login, $passwd, $name, $port=0) { @@ -432,10 +433,11 @@ class DoliDb } /** - * \brief Validation d'une transaction - * \return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur + * Validate a database transaction + * @param log Add more log to default log line + * @return int 1 if validation is OK or transaction level no started, 0 if ERROR */ - function commit() + function commit($log='') { if ($this->transaction_opened<=1) { @@ -476,17 +478,18 @@ class DoliDb /** - * \brief Convert request to PostgreSQL syntax, execute it and return the resultset - * \param query SQL query string - * \param usesavepoint 0=Default mode, 1=Run a savepoint before and a rollback to savepoint if error (this allow to have some request with errors inside global transactions). - * \return resource Resultset of answer + * Convert request to PostgreSQL syntax, execute it and return the resultset. + * @param query SQL query string + * @param usesavepoint 0=Default mode, 1=Run a savepoint before and a rollback to savepoint if error (this allow to have some request with errors inside global transactions). + * @param type Type of SQL order ('ddl' for insert, update, select, delete or 'dml' for create, alter...) + * @return resource Resultset of answer */ - function query($query,$usesavepoint=0) + function query($query,$usesavepoint=0,$type='ddl') { $query = trim($query); // Convert MySQL syntax to PostgresSQL syntax - $query=$this->convertSQLFromMysql($query); + $query=$this->convertSQLFromMysql($query,$type); //print "FF\n".$query."
\n"; // Fix bad formed requests. If request contains a date without quotes, we fix this but this should not occurs. @@ -538,7 +541,7 @@ class DoliDb */ function fetch_object($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_resource($resultset)) { $resultset=$this->results; } return pg_fetch_object($resultset); } @@ -550,7 +553,7 @@ class DoliDb */ function fetch_array($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_resource($resultset)) { $resultset=$this->results; } return pg_fetch_array($resultset); } @@ -569,26 +572,26 @@ class DoliDb /** * \brief Renvoie le nombre de lignes dans le resultat d'une requete SELECT - * \see affected_rows + * \see affected_rows * \param resultset Curseur de la requete voulue * \return int Nombre de lignes */ function num_rows($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_resource($resultset)) { $resultset=$this->results; } return pg_num_rows($resultset); } /** * \brief Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE - * \see num_rows + * \see num_rows * \param resultset Curseur de la requete voulue * \return int Nombre de lignes */ function affected_rows($resultset) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_resource($resultset)) { $resultset=$this->results; } // pgsql necessite un resultset pour cette fonction contrairement // a mysql qui prend un link de base @@ -602,15 +605,15 @@ class DoliDb */ function free($resultset=0) { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + // If resultset not provided, we take the last used by connexion if (! is_resource($resultset)) { $resultset=$this->results; } - // Si resultset en est un, on libere la m�moire + // Si resultset en est un, on libere la memoire if (is_resource($resultset)) pg_free_result($resultset); } /** - * \brief Defini les limites de la requete. + * \brief Defini les limites de la requete. * \param limit nombre maximum de lignes retournees * \param offset numero de la ligne a partir de laquelle recuperer les lignes * \return string chaine exprimant la syntax sql de la limite @@ -625,7 +628,7 @@ class DoliDb /** - * \brief Defini le tri de la requete. + * \brief Defini le tri de la requete. * \param sortfield liste des champ de tri * \param sortorder ordre du tri * \return string chaine exprimant la syntax sql de l'ordre de tri @@ -655,9 +658,9 @@ class DoliDb /** - * \brief Escape a string to insert data. - * \param stringtoencode String to escape - * \return string String escaped + * \brief Escape a string to insert data. + * \param stringtoencode String to escape + * \return string String escaped */ function escape($stringtoencode) { diff --git a/htdocs/lib/functions.lib.php b/htdocs/lib/functions.lib.php index b3997d3c59b..932c6f1b1c1 100644 --- a/htdocs/lib/functions.lib.php +++ b/htdocs/lib/functions.lib.php @@ -954,9 +954,9 @@ function dol_print_ip($ip,$mode=0) } /** - * Return true if email syntax is ok + * Return true if email syntax is ok. * @param address email (Ex: "toto@titi.com", "John Do ") - * @return boolean true if email syntax is OK, false if KO + * @return boolean true if email syntax is OK, false if KO or empty string/ */ function isValidEmail($address) { diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index b4fabb589df..ef46190c8b3 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -1283,7 +1283,6 @@ class Societe extends CommonObject * \param option Sur quoi pointe le lien ('', 'customer', 'supplier', 'compta') * \param maxlen Longueur max libelle * \return string Chaine avec URL - * FIXME not in business class */ function getNomUrl($withpicto=0,$option='customer',$maxlen=0) { @@ -1791,7 +1790,7 @@ class Societe extends CommonObject * @param idprof 1,2,3,4 (Exemple: 1=siren,2=siret,3=naf,4=rcs/rm) * @param soc Objet societe * @return string url ou chaine vide si aucune url connue - * FIXME not in business class + * FIXME not in business class */ function id_prof_url($idprof,$soc) { diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 4511c3c139e..f0628e57098 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -635,12 +635,12 @@ class User extends CommonObject { } - + // Remove group $sql = "DELETE FROM ".MAIN_DB_PREFIX."usergroup_user WHERE fk_user = ".$this->id; if ($this->db->query($sql)) { - + } // Si contact, supprime lien @@ -677,10 +677,10 @@ class User extends CommonObject } /** - * \brief Create user in database - * \param user Objet user qui demande la creation - * \param notrigger 1 ne declenche pas les triggers, 0 sinon - * \return int <0 si KO, id compte cree si OK + * Create a user into database + * @param user Objet user qui demande la creation + * @param notrigger 1 ne declenche pas les triggers, 0 sinon + * @return int <0 si KO, id compte cree si OK */ function create($user,$notrigger=0) { @@ -842,7 +842,7 @@ class User extends CommonObject $result = $interface->run_triggers('USER_CREATE_FROM_CONTACT',$this,$user,$langs,$conf); if ($result < 0) { $error++; $this->errors=$interface->errors; } // Fin appel triggers - + $this->db->commit(); return $this->id; }