Fix: Try to fix to allow reserved keyworks into PGSQL user records.

This commit is contained in:
Laurent Destailleur 2010-11-15 19:08:35 +00:00
parent 6dc97d6da6
commit 761c613356
9 changed files with 263 additions and 251 deletions

View File

@ -1,6 +1,6 @@
<?php <?php
/* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org> /* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net> * Copyright (C) 2004-2010 Laurent Destailleur <eldy@users.sourceforge.net>
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -20,7 +20,7 @@
/** /**
* \file htdocs/install/etape2.php * \file htdocs/install/etape2.php
* \ingroup install * \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$ * \version $Id$
*/ */
@ -173,11 +173,12 @@ if ($_POST["action"] == "set")
$buf = fgets($fp, 4096); $buf = fgets($fp, 4096);
if (substr($buf, 0, 2) <> '--') if (substr($buf, 0, 2) <> '--')
{ {
/* I disable this as it is already done into the query function
if ($choix != 1) // All databases except Mysql if ($choix != 1) // All databases except Mysql
{ {
$buf=$db->convertSQLFromMysql($buf); $buf=$db->convertSQLFromMysql($buf,'dml');
} }
*/
$buffer .= $buf; $buffer .= $buf;
} }
} }
@ -193,7 +194,7 @@ if ($_POST["action"] == "set")
} }
dolibarr_install_syslog("Request: ".$buffer,LOG_DEBUG); dolibarr_install_syslog("Request: ".$buffer,LOG_DEBUG);
$resql=$db->query($buffer); $resql=$db->query($buffer,0,'dml');
if ($resql) if ($resql)
{ {
// print "<td>OK requete ==== $buffer</td></tr>"; // print "<td>OK requete ==== $buffer</td></tr>";

View File

@ -1,6 +1,6 @@
<?php <?php
/* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org> /* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2009 Laurent Destailleur <eldy@users.sourceforge.net> * Copyright (C) 2004-2010 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be> * Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
* Copyright (C) 2004 Sebastien DiCintio <sdicintio@ressource-toi.org> * Copyright (C) 2004 Sebastien DiCintio <sdicintio@ressource-toi.org>
* Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr> * Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
@ -170,6 +170,7 @@ if ($_POST["action"] == "set" || preg_match('/upgrade/i',$_POST["action"]))
$newuser->admin=1; $newuser->admin=1;
$newuser->entity=0; $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); $result=$newuser->create($createuser,1);
if ($result > 0) if ($result > 0)
{ {

View File

@ -75,14 +75,14 @@ class DoliDb
/** /**
* \brief Ouverture d'une connexion vers le serveur et eventuellement une database. * Ouverture d'une connexion vers le serveur et eventuellement une database.
* \param type Type de base de donnees (mysql ou pgsql) * @param type Type de base de donnees (mysql ou pgsql)
* \param host Addresse de la base de donnees * @param host Addresse de la base de donnees
* \param user Nom de l'utilisateur autorise * @param user Nom de l'utilisateur autorise
* \param pass Mot de passe * @param pass Mot de passe
* \param name Nom de la database * @param name Nom de la database
* \param port Port of database server * @param port Port of database server
* \return int 1 en cas de succes, 0 sinon * @return int 1 en cas de succes, 0 sinon
*/ */
function DoliDb($type='mssql', $host, $user, $pass, $name='', $port=0) function DoliDb($type='mssql', $host, $user, $pass, $name='', $port=0)
{ {
@ -154,20 +154,21 @@ class DoliDb
return $this->ok; return $this->ok;
} }
/** /**
* \brief Convert a SQL request in mysql syntax to database syntax * Convert a SQL request in Mysql syntax to PostgreSQL syntax
* \param line SQL request line to convert * @param line SQL request line to convert
* \return string SQL request line converted * @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')
{ {
return $line; return $line;
} }
/** /**
* \brief Selectionne une database. * Selectionne une database.
* \param database Nom de la database * @param database Nom de la database
* \return boolean true si ok, false si ko * @return boolean true si ok, false si ko
*/ */
function select_db($database) function select_db($database)
{ {
@ -175,14 +176,14 @@ class DoliDb
} }
/** /**
\brief Connection vers le serveur * Connection vers le serveur
\param host addresse de la base de donnees * @param host addresse de la base de donnees
\param login nom de l'utilisateur autoris * @param login nom de l'utilisateur autoris
\param passwd mot de passe * @param passwd mot de passe
\param name nom de la database (ne sert pas sous mysql, sert sous pgsql) * @param name nom de la database (ne sert pas sous mysql, sert sous pgsql)
\param port Port of database server * @param port Port of database server
\return resource handler d'acces a la base * @return resource handler d'acces a la base
\seealso close * @see close
*/ */
function connect($host, $login, $passwd, $name, $port=0) function connect($host, $login, $passwd, $name, $port=0)
{ {
@ -230,9 +231,9 @@ class DoliDb
/** /**
\brief Fermeture d'une connexion vers une database. * \brief Fermeture d'une connexion vers une database.
\return resource * \return resource
\seealso connect * \see connect
*/ */
function close() function close()
{ {
@ -242,9 +243,9 @@ class DoliDb
/** /**
\brief Debut d'une transaction. * \brief Debut d'une transaction.
\return int 1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur * \return int 1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur
*/ */
function begin() function begin()
{ {
if (! $this->transaction_opened) if (! $this->transaction_opened)
@ -265,9 +266,10 @@ class DoliDb
} }
/** /**
\brief Validation d'une transaction * Validate a database transaction
\return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur * @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()
{ {
if ($this->transaction_opened <= 1) if ($this->transaction_opened <= 1)
@ -288,8 +290,8 @@ class DoliDb
} }
/** /**
\brief Annulation d'une transaction et retour aux anciennes valeurs * \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 * \return int 1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur
*/ */
function rollback() function rollback()
{ {
@ -308,12 +310,14 @@ class DoliDb
} }
/** /**
* \brief Effectue une requete et renvoi le resultset de reponse de la base * Execute a SQL request and return the resultset
* \param query SQL query string * @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). * @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 * 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); $query = trim($query);
@ -409,9 +413,9 @@ class DoliDb
} }
/** /**
\brief Renvoie les donnees dans un tableau. * \brief Renvoie les donnees dans un tableau.
\param resultset Curseur de la requete voulue * \param resultset Curseur de la requete voulue
\return array * \return array
*/ */
function fetch_array($resultset) function fetch_array($resultset)
{ {
@ -422,9 +426,9 @@ class DoliDb
/** /**
\brief Renvoie les donnees comme un tableau. * \brief Renvoie les donnees comme un tableau.
\param resultset Curseur de la requete voulue * \param resultset Curseur de la requete voulue
\return array * \return array
*/ */
function fetch_row($resultset) function fetch_row($resultset)
{ {
@ -434,10 +438,10 @@ class DoliDb
} }
/** /**
\brief Renvoie le nombre de lignes dans le resultat d'une requete SELECT * \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 * \param resultset Curseur de la requete voulue
\return int Nombre de lignes * \return int Nombre de lignes
*/ */
function num_rows($resultset) function num_rows($resultset)
{ {

View File

@ -74,14 +74,14 @@ class DoliDb
/** /**
* \brief Ouverture d'une connexion vers le serveur et eventuellement une database. * Ouverture d'une connexion vers le serveur et eventuellement une database.
* \param type Type de base de donnees (mysql ou pgsql) * @param type Type de base de donnees (mysql ou pgsql)
* \param host Addresse de la base de donnees * @param host Addresse de la base de donnees
* \param user Nom de l'utilisateur autorise * @param user Nom de l'utilisateur autorise
* \param pass Mot de passe * @param pass Mot de passe
* \param name Nom de la database * @param name Nom de la database
* \param port Port of database server * @param port Port of database server
* \return int 1 en cas de succes, 0 sinon * @return int 1 en cas de succes, 0 sinon
*/ */
function DoliDb($type='mysql', $host, $user, $pass, $name='', $port=0) 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 * Convert a SQL request in Mysql syntax to PostgreSQL syntax
* \param line SQL request line to convert * @param line SQL request line to convert
* \return string SQL request line converted * @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')
{ {
return $line; return $line;
} }
@ -309,9 +310,9 @@ class DoliDb
} }
/** /**
* \brief Validation d'une transaction * Validate a database transaction
* \param log Add more log to default log line * @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 * @return int 1 if validation is OK or transaction level no started, 0 if ERROR
*/ */
function commit($log='') function commit($log='')
{ {
@ -354,13 +355,14 @@ class DoliDb
} }
/** /**
* \brief Execute a SQL request and return the resultset * Execute a SQL request and return the resultset
* \param query SQL query string * @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). * @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. * 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); $query = trim($query);
@ -399,7 +401,7 @@ class DoliDb
*/ */
function fetch_object($resultset) 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; } if (! is_resource($resultset)) { $resultset=$this->results; }
return mysql_fetch_object($resultset); return mysql_fetch_object($resultset);
} }
@ -411,7 +413,7 @@ class DoliDb
*/ */
function fetch_array($resultset) 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; } if (! is_resource($resultset)) { $resultset=$this->results; }
return mysql_fetch_array($resultset); return mysql_fetch_array($resultset);
} }
@ -424,7 +426,7 @@ class DoliDb
*/ */
function fetch_row($resultset) 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; } if (! is_resource($resultset)) { $resultset=$this->results; }
return @mysql_fetch_row($resultset); return @mysql_fetch_row($resultset);
} }
@ -437,7 +439,7 @@ class DoliDb
*/ */
function num_rows($resultset) 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; } if (! is_resource($resultset)) { $resultset=$this->results; }
return mysql_num_rows($resultset); return mysql_num_rows($resultset);
} }
@ -450,7 +452,7 @@ class DoliDb
*/ */
function affected_rows($resultset) 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; } if (! is_resource($resultset)) { $resultset=$this->results; }
// mysql necessite un link de base pour cette fonction contrairement // mysql necessite un link de base pour cette fonction contrairement
// a pqsql qui prend un resultset // a pqsql qui prend un resultset
@ -464,7 +466,7 @@ class DoliDb
*/ */
function free($resultset=0) 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; } if (! is_resource($resultset)) { $resultset=$this->results; }
// Si resultset en est un, on libere la memoire // Si resultset en est un, on libere la memoire
if (is_resource($resultset)) mysql_free_result($resultset); if (is_resource($resultset)) mysql_free_result($resultset);

View File

@ -75,14 +75,14 @@ class DoliDb
/** /**
* \brief Ouverture d'une connexion vers le serveur et eventuellement une database. * Ouverture d'une connexion vers le serveur et eventuellement une database.
* \param type Type de base de donnees (mysql ou pgsql) * @param type Type de base de donnees (mysql ou pgsql)
* \param host Addresse de la base de donnees * @param host Addresse de la base de donnees
* \param user Nom de l'utilisateur autorise * @param user Nom de l'utilisateur autorise
* \param pass Mot de passe * @param pass Mot de passe
* \param name Nom de la database * @param name Nom de la database
* \param port Port of database server * @param port Port of database server
* \return int 1 en cas de succes, 0 sinon * @return int 1 en cas de succes, 0 sinon
*/ */
function DoliDb($type='mysqli', $host, $user, $pass, $name='', $port=0) 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 * Convert a SQL request in Mysql syntax to PostgreSQL syntax
* \param line SQL request line to convert * @param line SQL request line to convert
* \return string SQL request line converted * @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')
{ {
return $line; return $line;
} }
@ -316,9 +317,9 @@ class DoliDb
} }
/** /**
* \brief Validation d'une transaction * Validate a database transaction
* \param log Add more log to default log line * @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 * @return int 1 if validation is OK or transaction level no started, 0 if ERROR
*/ */
function commit($log='') function commit($log='')
{ {
@ -361,13 +362,14 @@ class DoliDb
} }
/** /**
* \brief Execute a SQL request and return the resultset * Execute a SQL request and return the resultset
* \param query SQL query string * @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). * @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. * 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); $query = trim($query);
if (! $this->database_name) if (! $this->database_name)
@ -417,7 +419,7 @@ class DoliDb
*/ */
function fetch_array($resultset) 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; } if (! is_object($resultset)) { $resultset=$this->results; }
return mysqli_fetch_array($resultset); return mysqli_fetch_array($resultset);
} }
@ -429,7 +431,7 @@ class DoliDb
*/ */
function fetch_row($resultset) 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_bool($resultset))
{ {
if (! is_object($resultset)) { $resultset=$this->results; } if (! is_object($resultset)) { $resultset=$this->results; }
@ -450,7 +452,7 @@ class DoliDb
*/ */
function num_rows($resultset) 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; } if (! is_object($resultset)) { $resultset=$this->results; }
return mysqli_num_rows($resultset); return mysqli_num_rows($resultset);
} }
@ -464,7 +466,7 @@ class DoliDb
function affected_rows($resultset) 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; } if (! is_object($resultset)) { $resultset=$this->results; }
// mysql necessite un link de base pour cette fonction contrairement // mysql necessite un link de base pour cette fonction contrairement
// a pqsql qui prend un resultset // a pqsql qui prend un resultset
@ -478,7 +480,7 @@ class DoliDb
*/ */
function free($resultset=0) 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; } if (! is_object($resultset)) { $resultset=$this->results; }
// Si resultset en est un, on libere la memoire // Si resultset en est un, on libere la memoire
if (is_object($resultset)) mysqli_free_result($resultset); if (is_object($resultset)) mysqli_free_result($resultset);

View File

@ -149,11 +149,12 @@ class DoliDb
/** /**
* \brief Convert a SQL request in Mysql syntax to PostgreSQL syntax * Convert a SQL request in Mysql syntax to PostgreSQL syntax
* \param line SQL request line to convert * @param line SQL request line to convert
* \return string SQL request line converted * @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 # Removed empty line if this is a comment line for SVN tagging
if (preg_match('/^--\s\$Id/i',$line)) { if (preg_match('/^--\s\$Id/i',$line)) {
@ -166,104 +167,106 @@ class DoliDb
} }
if ($line != "") if ($line != "")
{ {
# we are inside create table statement so lets process datatypes if ($type == 'dml')
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); # we are inside create table statement so lets process datatypes
$line=preg_replace('/\)[\s\t]*engine[\s\t]*=[\s\t]*(MyISAM|innodb);/i',');',$line); if (preg_match('/(ISAM|innodb)/i',$line)) { # end of create table sequence
$line=preg_replace('/,$/','',$line); $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)) { 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); $line=preg_replace('/[\s\t]*([a-zA-Z_0-9]*)[\s\t]*.*int.*auto_increment[^,]*/i','\\1 SERIAL PRIMARY KEY',$line);
} }
# tinyint type conversion # tinyint type conversion
$line=str_replace('tinyint','smallint',$line); $line=str_replace('tinyint','smallint',$line);
# nuke unsigned # nuke unsigned
$line=preg_replace('/(int\w+|smallint)\s+unsigned/i','\\1',$line); $line=preg_replace('/(int\w+|smallint)\s+unsigned/i','\\1',$line);
# blob -> text # blob -> text
$line=preg_replace('/\w*blob/i','text',$line); $line=preg_replace('/\w*blob/i','text',$line);
# tinytext/mediumtext -> text # tinytext/mediumtext -> text
$line=preg_replace('/tinytext/i','text',$line); $line=preg_replace('/tinytext/i','text',$line);
$line=preg_replace('/mediumtext/i','text',$line); $line=preg_replace('/mediumtext/i','text',$line);
# change not null datetime field to null valid ones # change not null datetime field to null valid ones
# (to support remapping of "zero time" to null # (to support remapping of "zero time" to null
$line=preg_replace('/datetime not null/i','datetime',$line); $line=preg_replace('/datetime not null/i','datetime',$line);
$line=preg_replace('/datetime/i','timestamp',$line); $line=preg_replace('/datetime/i','timestamp',$line);
# double -> numeric # double -> numeric
// FIXME problem if value contain "double" word $line=preg_replace('/^double/i','numeric',$line);
$line=preg_replace('/^double/i','numeric',$line); $line=preg_replace('/(\s*)double/i','\\1numeric',$line);
$line=preg_replace('/(\s*)double/i','\\1numeric',$line); # float -> numeric
# float -> numeric $line=preg_replace('/^float/i','numeric',$line);
$line=preg_replace('/^float/i','numeric',$line); $line=preg_replace('/(\s*)float/i','\\1numeric',$line);
$line=preg_replace('/(\s*)float/i','\\1numeric',$line);
# unique index(field1,field2) # unique index(field1,field2)
if (preg_match('/unique index\s*\((\w+\s*,\s*\w+)\)/i',$line)) 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); $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 // To have postgresql case sensitive
$line=str_replace(' LIKE \'',' ILIKE \'',$line); $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 using criteria on other table must not declare twice the deleted table
// DELETE FROM tabletodelete USING tabletodelete, othertable -> DELETE FROM tabletodelete USING othertable // 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)) 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 * Select a database.
* \param database nom de la database * Ici postgresql n'a aucune fonction equivalente de mysql_select_db
* \return boolean true si ok, false si ko * On compare juste manuellement si la database choisie est bien celle activee par la connexion
* \remarks Ici postgresql n'a aucune fonction equivalente de mysql_select_db * @param database nom de la database
* \remarks On compare juste manuellement si la database choisie est bien celle activee par la connexion * @return boolean true si ok, false si ko
*/ */
function select_db($database) function select_db($database)
{ {
if ($database == $this->database_name) if ($database == $this->database_name) return true;
return true; else return false;
else
return false;
} }
/** /**
* \brief Connection vers le serveur * Connection vers le serveur
* \param host addresse de la base de donnees * @param host addresse de la base de donnees
* \param login nom de l'utilisateur autorise * @param login nom de l'utilisateur autorise
* \param passwd mot de passe * @param passwd mot de passe
* \param name nom de la database (ne sert pas sous mysql, sert sous pgsql) * @param name nom de la database (ne sert pas sous mysql, sert sous pgsql)
* \param port Port of database server * @param port Port of database server
* \return resource handler d'acces a la base * @return resource handler d'acces a la base
*/ */
function connect($host, $login, $passwd, $name, $port=0) function connect($host, $login, $passwd, $name, $port=0)
{ {
@ -432,10 +433,11 @@ class DoliDb
} }
/** /**
* \brief Validation d'une transaction * Validate a database transaction
* \return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur * @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) if ($this->transaction_opened<=1)
{ {
@ -476,17 +478,18 @@ class DoliDb
/** /**
* \brief Convert request to PostgreSQL syntax, execute it and return the resultset * Convert request to PostgreSQL syntax, execute it and return the resultset.
* \param query SQL query string * @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 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 * @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); $query = trim($query);
// Convert MySQL syntax to PostgresSQL syntax // Convert MySQL syntax to PostgresSQL syntax
$query=$this->convertSQLFromMysql($query); $query=$this->convertSQLFromMysql($query,$type);
//print "FF\n".$query."<br>\n"; //print "FF\n".$query."<br>\n";
// Fix bad formed requests. If request contains a date without quotes, we fix this but this should not occurs. // 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) 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; } if (! is_resource($resultset)) { $resultset=$this->results; }
return pg_fetch_object($resultset); return pg_fetch_object($resultset);
} }
@ -550,7 +553,7 @@ class DoliDb
*/ */
function fetch_array($resultset) 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; } if (! is_resource($resultset)) { $resultset=$this->results; }
return pg_fetch_array($resultset); return pg_fetch_array($resultset);
} }
@ -569,26 +572,26 @@ class DoliDb
/** /**
* \brief Renvoie le nombre de lignes dans le resultat d'une requete SELECT * \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 * \param resultset Curseur de la requete voulue
* \return int Nombre de lignes * \return int Nombre de lignes
*/ */
function num_rows($resultset) 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; } if (! is_resource($resultset)) { $resultset=$this->results; }
return pg_num_rows($resultset); return pg_num_rows($resultset);
} }
/** /**
* \brief Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE * \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 * \param resultset Curseur de la requete voulue
* \return int Nombre de lignes * \return int Nombre de lignes
*/ */
function affected_rows($resultset) 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; } if (! is_resource($resultset)) { $resultset=$this->results; }
// pgsql necessite un resultset pour cette fonction contrairement // pgsql necessite un resultset pour cette fonction contrairement
// a mysql qui prend un link de base // a mysql qui prend un link de base
@ -602,15 +605,15 @@ class DoliDb
*/ */
function free($resultset=0) 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; } if (! is_resource($resultset)) { $resultset=$this->results; }
// Si resultset en est un, on libere la m<EFBFBD>moire // Si resultset en est un, on libere la memoire
if (is_resource($resultset)) pg_free_result($resultset); 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 limit nombre maximum de lignes retournees
* \param offset numero de la ligne a partir de laquelle recuperer les lignes * \param offset numero de la ligne a partir de laquelle recuperer les lignes
* \return string chaine exprimant la syntax sql de la limite * \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 sortfield liste des champ de tri
* \param sortorder ordre du tri * \param sortorder ordre du tri
* \return string chaine exprimant la syntax sql de l'ordre de 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. * \brief Escape a string to insert data.
* \param stringtoencode String to escape * \param stringtoencode String to escape
* \return string String escaped * \return string String escaped
*/ */
function escape($stringtoencode) function escape($stringtoencode)
{ {

View File

@ -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 <johndo@titi.com>") * @param address email (Ex: "toto@titi.com", "John Do <johndo@titi.com>")
* @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) function isValidEmail($address)
{ {

View File

@ -1283,7 +1283,6 @@ class Societe extends CommonObject
* \param option Sur quoi pointe le lien ('', 'customer', 'supplier', 'compta') * \param option Sur quoi pointe le lien ('', 'customer', 'supplier', 'compta')
* \param maxlen Longueur max libelle * \param maxlen Longueur max libelle
* \return string Chaine avec URL * \return string Chaine avec URL
* FIXME not in business class
*/ */
function getNomUrl($withpicto=0,$option='customer',$maxlen=0) 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 idprof 1,2,3,4 (Exemple: 1=siren,2=siret,3=naf,4=rcs/rm)
* @param soc Objet societe * @param soc Objet societe
* @return string url ou chaine vide si aucune url connue * @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) function id_prof_url($idprof,$soc)
{ {

View File

@ -677,10 +677,10 @@ class User extends CommonObject
} }
/** /**
* \brief Create user in database * Create a user into database
* \param user Objet user qui demande la creation * @param user Objet user qui demande la creation
* \param notrigger 1 ne declenche pas les triggers, 0 sinon * @param notrigger 1 ne declenche pas les triggers, 0 sinon
* \return int <0 si KO, id compte cree si OK * @return int <0 si KO, id compte cree si OK
*/ */
function create($user,$notrigger=0) function create($user,$notrigger=0)
{ {