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
/* 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
* 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 "<td>OK requete ==== $buffer</td></tr>";

View File

@ -1,6 +1,6 @@
<?php
/* 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 Sebastien DiCintio <sdicintio@ressource-toi.org>
* 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->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)
{

View File

@ -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)
{

View File

@ -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);

View File

@ -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);

View File

@ -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."<br>\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<EFBFBD>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)
{

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>")
* @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)
{

View File

@ -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)
{

View File

@ -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;
}