diff --git a/htdocs/admin/menus.php b/htdocs/admin/menus.php
index e3e69f07088..e218dec564f 100644
--- a/htdocs/admin/menus.php
+++ b/htdocs/admin/menus.php
@@ -71,7 +71,7 @@ if (isset($_POST["action"]) && $_POST["action"] == 'update' && empty($_POST["can
$file='init_menu_'.$key.'.sql';
if (file_exists($dir.$file))
{
- $result=run_sql($dir.$file,1);
+ $result=run_sql($dir.$file,1,'',1);
}
}
diff --git a/htdocs/includes/modules/DolibarrModules.class.php b/htdocs/includes/modules/DolibarrModules.class.php
index 89b1fa420ac..1fdabd12459 100644
--- a/htdocs/includes/modules/DolibarrModules.class.php
+++ b/htdocs/includes/modules/DolibarrModules.class.php
@@ -477,7 +477,7 @@ class DolibarrModules
{
if (preg_match('/\.sql$/i',$file) && ! preg_match('/\.key\.sql$/i',$file) && substr($file,0,4) == 'llx_' && substr($file,0,4) != 'data')
{
- $result=run_sql($dir.$file,1);
+ $result=run_sql($dir.$file,1,'',1);
}
}
closedir($handle);
@@ -491,13 +491,13 @@ class DolibarrModules
{
if (preg_match('/\.key\.sql$/i',$file) && substr($file,0,4) == 'llx_' && substr($file,0,4) != 'data')
{
- $result=run_sql($dir.$file,1);
+ $result=run_sql($dir.$file,1,'',1);
}
}
closedir($handle);
}
- // Run .sql files
+ // Run data_xxx.sql files
$handle=@opendir($dir); // Dir may not exist
if ($handle)
{
@@ -505,7 +505,7 @@ class DolibarrModules
{
if (preg_match('/\.sql$/i',$file) && ! preg_match('/\.key\.sql$/i',$file) && substr($file,0,4) == 'data')
{
- $result=run_sql($dir.$file,1);
+ $result=run_sql($dir.$file,1,'',1);
}
}
closedir($handle);
diff --git a/htdocs/install/repair.php b/htdocs/install/repair.php
index f820b280e63..6bd1850fbc4 100644
--- a/htdocs/install/repair.php
+++ b/htdocs/install/repair.php
@@ -186,7 +186,7 @@ if ($ok)
$name = substr($file, 0, strlen($file) - 4);
// Run sql script
- $ok=run_sql($dir.$file, 0);
+ $ok=run_sql($dir.$file, 0, '', 1);
}
}
diff --git a/htdocs/install/upgrade.php b/htdocs/install/upgrade.php
index d391121a573..fb0f8369946 100644
--- a/htdocs/install/upgrade.php
+++ b/htdocs/install/upgrade.php
@@ -320,7 +320,7 @@ if (! isset($_GET["action"]) || preg_match('/upgrade/i',$_GET["action"]))
$name = substr($file, 0, strlen($file) - 4);
// Run sql script
- $ok=run_sql($dir.$file, 0);
+ $ok=run_sql($dir.$file, 0, '', 1);
}
}
diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php
index 988dc3d0519..a4d3d5b4d53 100644
--- a/htdocs/install/upgrade2.php
+++ b/htdocs/install/upgrade2.php
@@ -3196,7 +3196,7 @@ function migrate_reload_menu($db,$langs,$conf)
$file='init_menu_'.$key.'.sql';
if (file_exists($dir.$file))
{
- $result=run_sql($dir.$file,1);
+ $result=run_sql($dir.$file,1,'',1);
}
}*/
}
diff --git a/htdocs/lib/admin.lib.php b/htdocs/lib/admin.lib.php
index 9cf42634774..d59f40c17ad 100644
--- a/htdocs/lib/admin.lib.php
+++ b/htdocs/lib/admin.lib.php
@@ -83,17 +83,20 @@ function versionphparray()
* \return array Tableau de version (vermajeur,vermineur,autre)
*/
function versiondolibarrarray($fortest=0)
-{
+{
return explode('.',DOL_VERSION);
}
/**
* \brief Launch a sql file
- * \param sqlfile Full path to sql file
- * \return int <=0 if KO, >0 if OK
+ * \param sqlfile Full path to sql file
+ * \param silent 1=Do not output anything, 0=Output line for update page
+ * \param entity Entity targeted for multicompany module
+ * \param usesavepoint 1=Run a savepoint before each request and a rollback to savepoint if error (this allow to have some request with errors inside global transactions).
+ * \return int <=0 if KO, >0 if OK
*/
-function run_sql($sqlfile,$silent=1,$entity='')
+function run_sql($sqlfile,$silent=1,$entity='',$usesavepoint=1)
{
global $db, $conf, $langs, $user;
@@ -153,7 +156,7 @@ function run_sql($sqlfile,$silent=1,$entity='')
}
// Loop on each request to see if there is a __+MAX_table__ key
- $listofmaxrowid=array();
+ $listofmaxrowid=array(); // This is a cache table
foreach($arraysql as $i => $sql)
{
if ($sql)
@@ -224,7 +227,7 @@ function run_sql($sqlfile,$silent=1,$entity='')
dol_syslog('Admin.lib::run_sql New Request '.($i+1).' (replacing '.$from.' to '.$to.') sql='.$newsql, LOG_DEBUG);
}
- $result=$db->query($newsql);
+ $result=$db->query($newsql,$usesavepoint);
if ($result)
{
if (preg_replace('/insert into ([^\s]+)/i',$newsql,$reg))
diff --git a/htdocs/lib/databases/mssql.lib.php b/htdocs/lib/databases/mssql.lib.php
index c8f63adc14e..33e8ca7dcdc 100644
--- a/htdocs/lib/databases/mssql.lib.php
+++ b/htdocs/lib/databases/mssql.lib.php
@@ -309,10 +309,11 @@ class DoliDb
/**
* \brief Effectue une requete et renvoi le resultset de reponse de la base
- * \param query Contenu de la query
- * \return resource Resultset de la reponse
+ * \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
*/
- function query($query)
+ function query($query,$usesavepoint=0)
{
$query = trim($query);
@@ -782,11 +783,12 @@ class DoliDb
}
/**
- \brief Liste des tables dans une database.
- \param database Nom de la database
- \return resource
- */
- function DDLListTables($database)
+ * \brief List tables into a database.
+ * \param database Name of database
+ * \param table Filter on some tables
+ * \return array Array list of tables
+ */
+ function DDLListTables($database,$table='')
{
$this->results = mssql_list_tables($database, $this->db);
return $this->results;
@@ -970,7 +972,7 @@ class DoliDb
}
return $liste;
*/
- return ''; // attente d�buggage
+ return ''; // attente debuggage
}
function getDefaultCollationDatabase()
diff --git a/htdocs/lib/databases/mysql.lib.php b/htdocs/lib/databases/mysql.lib.php
index 7f1c4338652..46e18e01fab 100644
--- a/htdocs/lib/databases/mysql.lib.php
+++ b/htdocs/lib/databases/mysql.lib.php
@@ -354,11 +354,13 @@ class DoliDb
}
/**
- * \brief Effectue une requete et renvoi le resultset de reponse de la base
- * \param query Contenu de la query
- * \return resource Resultset de la reponse
+ * \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).
+ * 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
*/
- function query($query)
+ function query($query,$usesavepoint=0)
{
$query = trim($query);
@@ -800,10 +802,10 @@ class DoliDb
}
/**
- * \brief Liste des tables dans une database.
- * \param database Nom de la database
- * \param table Filtre sur tables a rechercher
- * \return array Tableau des tables de la base
+ * \brief List tables into a database.
+ * \param database Name of database
+ * \param table Filter on some tables
+ * \return array Array list of tables
*/
function DDLListTables($database, $table='')
{
diff --git a/htdocs/lib/databases/mysqli.lib.php b/htdocs/lib/databases/mysqli.lib.php
index d9627171be9..3e66d347cc0 100644
--- a/htdocs/lib/databases/mysqli.lib.php
+++ b/htdocs/lib/databases/mysqli.lib.php
@@ -361,11 +361,13 @@ class DoliDb
}
/**
- * \brief Effectue une requete et renvoi le resultset de reponse de la base
- * \param query Contenu de la query
- * \return resource Resultset de la reponse
+ * \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).
+ * 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
*/
- function query($query)
+ function query($query,$usesavepoint=0)
{
$query = trim($query);
if (! $this->database_name)
@@ -811,10 +813,10 @@ class DoliDb
}
/**
- * \brief Liste des tables dans une database.
- * \param database Nom de la database
- * \param table Filtre sur tables a rechercher
- * \return array Tableau des tables de la base
+ * \brief List tables into a database.
+ * \param database Name of database
+ * \param table Filter on some tables
+ * \return array Array list of tables
*/
function DDLListTables($database, $table='')
{
diff --git a/htdocs/lib/databases/pgsql.lib.php b/htdocs/lib/databases/pgsql.lib.php
index 047cfceb8b0..7aa15e909c1 100644
--- a/htdocs/lib/databases/pgsql.lib.php
+++ b/htdocs/lib/databases/pgsql.lib.php
@@ -455,10 +455,11 @@ class DoliDb
/**
* \brief Convert request to PostgreSQL syntax, execute it and return the resultset
- * \param query query string
- * \return resource Resultset of answer
+ * \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
*/
- function query($query)
+ function query($query,$usesavepoint=0)
{
$query = trim($query);
@@ -478,6 +479,11 @@ class DoliDb
else $loop=false;
}
+ if ($usesavepoint)
+ {
+ @pg_query($this->db, 'SAVEPOINT mysavepoint');
+ }
+
$ret = @pg_query($this->db, $query);
//print $query;
if (! preg_match("/^COMMIT/i",$query) && ! preg_match("/^ROLLBACK/i",$query))
@@ -490,6 +496,11 @@ class DoliDb
$this->lasterrno = $this->errno();
//print "\n>> ".$query."
\n";
//print '>> '.$this->lasterrno.' - '.$this->lasterror.' - '.$this->lastqueryerror."
\n";
+
+ if ($usesavepoint)
+ {
+ @pg_query($this->db, 'ROLLBACK TO SAVEPOINT mysavepoint');
+ }
}
$this->lastquery=$query;
$this->results = $ret;
@@ -882,10 +893,18 @@ class DoliDb
* \param database Nom de la database
* \return resource
*/
- function DDLListTables($database)
+ function DDLListTables($database, $table='')
{
- $this->results = pg_query($this->db, "SHOW TABLES");
- return $this->results;
+ $listtables=array();
+
+ $like = '';
+ if ($table) $like = " AND table_name LIKE '".$table."'";
+ $result = pg_query($this->db, "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'".$like);
+ while($row = $this->fetch_row($result))
+ {
+ $listtables[] = $row[0];
+ }
+ return $listtables;
}
/**