From 054572fa12b2254655d5ad83c58d22f5c56b7c9f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 30 Apr 2010 17:31:46 +0000 Subject: [PATCH] Enhancement for postgresql support --- htdocs/admin/menus.php | 2 +- .../modules/DolibarrModules.class.php | 8 ++--- htdocs/install/repair.php | 2 +- htdocs/install/upgrade.php | 2 +- htdocs/install/upgrade2.php | 2 +- htdocs/lib/admin.lib.php | 15 +++++---- htdocs/lib/databases/mssql.lib.php | 20 ++++++------ htdocs/lib/databases/mysql.lib.php | 18 ++++++----- htdocs/lib/databases/mysqli.lib.php | 18 ++++++----- htdocs/lib/databases/pgsql.lib.php | 31 +++++++++++++++---- 10 files changed, 73 insertions(+), 45 deletions(-) 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; } /**