From fe6563b755fba5630cfc04990e5f66c317ecfbc4 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@users.sourceforge.net>
Date: Sun, 25 Oct 2009 17:57:23 +0000
Subject: [PATCH] Qual: More portable SQL

---
 htdocs/includes/dolibarr_changes.txt          |  3 ++
 htdocs/install/etape2.php                     | 29 ++++++++++++++-----
 htdocs/install/mysql/tables/llx_boxes.key.sql |  6 ++--
 .../mysql/tables/llx_c_type_contact.key.sql   | 11 +------
 .../mysql/tables/llx_c_type_contact.sql       |  4 +--
 .../mysql/tables/llx_dolibarr_modules.key.sql |  1 -
 .../mysql/tables/llx_element_contact.key.sql  |  8 ++---
 .../mysql/tables/llx_element_element.key.sql  |  3 +-
 .../mysql/tables/llx_facturedet.key.sql       |  2 +-
 htdocs/lib/databases/pgsql.lib.php            | 22 +++++++++-----
 10 files changed, 51 insertions(+), 38 deletions(-)

diff --git a/htdocs/includes/dolibarr_changes.txt b/htdocs/includes/dolibarr_changes.txt
index 69e50ee8803..c064c6cd102 100644
--- a/htdocs/includes/dolibarr_changes.txt
+++ b/htdocs/includes/dolibarr_changes.txt
@@ -2,6 +2,9 @@
 This file describe changes made on external library after beeing included
 in Dolibarr root.
 
+ALL:
+----
+Replace "& new" by "new"
 
 
 FPDF:
diff --git a/htdocs/install/etape2.php b/htdocs/install/etape2.php
index a3db901cad2..6259a2d0501 100644
--- a/htdocs/install/etape2.php
+++ b/htdocs/install/etape2.php
@@ -122,7 +122,7 @@ if ($_POST["action"] == "set")
 
         $ok = 0;
         $handle=opendir($dir);
-        dolibarr_install_syslog("Ouverture repertoire ".$dir." handle=".$handle,LOG_DEBUG);
+        dolibarr_install_syslog("Open tables directory ".$dir." handle=".$handle,LOG_DEBUG);
         $tablefound = 0;
         while (($file = readdir($handle))!==false)
         {
@@ -166,15 +166,16 @@ if ($_POST["action"] == "set")
 	                }
 	                else
 	                {
-	                    if ($db->errno() == 'DB_ERROR_TABLE_ALREADY_EXISTS')
+	                    if ($db->errno() == 'DB_ERROR_TABLE_ALREADY_EXISTS' ||
+	                        $db->errno() == 'DB_ERROR_TABLE_OR_KEY_ALREADY_EXISTS')
 	                    {
 	                        //print "<td>Deja existante</td></tr>";
 	                    }
 	                    else
 	                    {
 	                        print "<tr><td>".$langs->trans("CreateTableAndPrimaryKey",$name);
-	                        print "<br>".$langs->trans("Request").' '.$requestnb.' : '.$buffer;
-	                        print "</td>";
+	                        print "<br>\n".$langs->trans("Request").' '.$requestnb.' : '.$buffer;
+	                        print "\n</td>";
 	                        print "<td>".$langs->trans("Error")." ".$db->errno()." ".$db->error()."</td></tr>";
 	                        $error++;
 	                    }
@@ -222,7 +223,7 @@ if ($_POST["action"] == "set")
 
         $okkeys = 0;
         $handle=opendir($dir);
-        dolibarr_install_syslog("Ouverture repertoire tables ".$dir." handle=".$handle,LOG_DEBUG);
+        dolibarr_install_syslog("Open keys directory ".$dir." handle=".$handle,LOG_DEBUG);
         while (($file = readdir($handle))!==false)
         {
             if (preg_match('/\.sql$/i',$file) && preg_match('/^llx_/i',$file) && preg_match('/\.key\.sql$/i',$file))
@@ -238,7 +239,7 @@ if ($_POST["action"] == "set")
                         $buf = fgets($fp, 4096);
 
                         // Cas special de lignes autorisees pour certaines versions uniquement
-                        if (preg_match('/^--\sV([0-9\.]+)/i',$buf,$reg))
+                        if ($choix == 1 && preg_match('/^--\sV([0-9\.]+)/i',$buf,$reg))
                         {
                             $versioncommande=explode('.',$reg[1]);
 							//print var_dump($versioncommande);
@@ -247,7 +248,20 @@ if ($_POST["action"] == "set")
                             	&& versioncompare($versioncommande,$versionarray) <= 0)
                             {
                             	// Version qualified, delete SQL comments
-                                $buf=preg_replace('/^-- V([0-9\.]+)/i','',$buf);
+                                $buf=preg_replace('/^--\sV([0-9\.]+)/i','',$buf);
+                                //print "Ligne $i qualifiee par version: ".$buf.'<br>';
+                            }
+                        }
+                        if ($choix == 2 && preg_match('/^--\sPOSTGRESQL\sV([0-9\.]+)/i',$buf,$reg))
+                        {
+                            $versioncommande=explode('.',$reg[1]);
+							//print var_dump($versioncommande);
+							//print var_dump($versionarray);
+                            if (sizeof($versioncommande) && sizeof($versionarray)
+                            	&& versioncompare($versioncommande,$versionarray) <= 0)
+                            {
+                            	// Version qualified, delete SQL comments
+                                $buf=preg_replace('/^--\sPOSTGRESQL\sV([0-9\.]+)/i','',$buf);
                                 //print "Ligne $i qualifiee par version: ".$buf.'<br>';
                             }
                         }
@@ -281,6 +295,7 @@ if ($_POST["action"] == "set")
 	                            if ($db->errno() == 'DB_ERROR_KEY_NAME_ALREADY_EXISTS' ||
 	                                $db->errno() == 'DB_ERROR_CANNOT_CREATE' ||
 	                                $db->errno() == 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS' ||
+	                                $db->errno() == 'DB_ERROR_TABLE_OR_KEY_ALREADY_EXISTS' ||
 	                                preg_match('/duplicate key name/i',$db->error()))
 	                            {
 	                                //print "<td>Deja existante</td></tr>";
diff --git a/htdocs/install/mysql/tables/llx_boxes.key.sql b/htdocs/install/mysql/tables/llx_boxes.key.sql
index 1b0530c37e5..09365976d78 100644
--- a/htdocs/install/mysql/tables/llx_boxes.key.sql
+++ b/htdocs/install/mysql/tables/llx_boxes.key.sql
@@ -1,5 +1,5 @@
 -- ===================================================================
--- Copyright (C) 2006-2007 Laurent Destailleur  <eldy@users.sourceforge.net>
+-- Copyright (C) 2006-2009 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
@@ -21,8 +21,10 @@
 
 ALTER TABLE llx_boxes ADD UNIQUE INDEX uk_boxes (box_id, position, fk_user);
 
--- Supprime orphelins pour permettre mont�e de la cl�
+-- Supprime orphelins pour permettre montee de la cle
 -- V4 DELETE llx_boxes FROM llx_boxes LEFT JOIN llx_boxes_def ON llx_boxes.box_id = llx_boxes_def.rowid WHERE llx_boxes_def.rowid IS NULL;
+-- POSTGRESQL V8 DELETE FROM llx_boxes USING llx_boxes_def WHERE llx_boxes.box_id NOT IN (SELECT llx_boxes_def.rowid FROM llx_boxes_def);
+
 ALTER TABLE llx_boxes ADD INDEX idx_boxes_boxid (box_id);
 ALTER TABLE llx_boxes ADD CONSTRAINT fk_boxes_box_id FOREIGN KEY (box_id) REFERENCES llx_boxes_def (rowid);
 
diff --git a/htdocs/install/mysql/tables/llx_c_type_contact.key.sql b/htdocs/install/mysql/tables/llx_c_type_contact.key.sql
index 526e6e3f2c1..dc284fc8cea 100644
--- a/htdocs/install/mysql/tables/llx_c_type_contact.key.sql
+++ b/htdocs/install/mysql/tables/llx_c_type_contact.key.sql
@@ -18,16 +18,7 @@
 --
 -- $Id$
 -- ========================================================================
--- Defini les types de contact d'un element sert de reference pour
--- la table llx_element_contact
---
--- element est le nom de la table utilisant le type de contact.
--- i.e. contact, facture, projet, societe (sans le llx_ devant).
--- Libelle est un texte d�crivant le type de contact.
--- active pr�cide si cette valeur est active ou 'archiv�'.
-
 
 
-ALTER TABLE llx_c_type_contact 
-	ADD UNIQUE INDEX idx_c_type_contact_uk (element, source, code);
+ALTER TABLE llx_c_type_contact ADD UNIQUE INDEX idx_c_type_contact_uk (element, source, code);
 
diff --git a/htdocs/install/mysql/tables/llx_c_type_contact.sql b/htdocs/install/mysql/tables/llx_c_type_contact.sql
index bde65bb8ea6..7ca83bee2ac 100644
--- a/htdocs/install/mysql/tables/llx_c_type_contact.sql
+++ b/htdocs/install/mysql/tables/llx_c_type_contact.sql
@@ -21,8 +21,8 @@
 --
 -- element est le nom de la table utilisant le type de contact.
 -- i.e. contact, facture, projet, societe (sans le llx_ devant).
--- Libelle est un texte d�crivant le type de contact.
--- active pr�cide si cette valeur est active ou 'archiv�'.
+-- Libelle est un texte decrivant le type de contact.
+-- active precise si cette valeur est 'active' ou 'archive'.
 --
 -- $Id$
 -- ========================================================================
diff --git a/htdocs/install/mysql/tables/llx_dolibarr_modules.key.sql b/htdocs/install/mysql/tables/llx_dolibarr_modules.key.sql
index 92458721321..e4eb41f3bb4 100644
--- a/htdocs/install/mysql/tables/llx_dolibarr_modules.key.sql
+++ b/htdocs/install/mysql/tables/llx_dolibarr_modules.key.sql
@@ -18,5 +18,4 @@
 -- $Id$
 -- ===========================================================================
 
-
 ALTER TABLE llx_dolibarr_modules ADD PRIMARY KEY pk_dolibarr_modules (numero, entity);
diff --git a/htdocs/install/mysql/tables/llx_element_contact.key.sql b/htdocs/install/mysql/tables/llx_element_contact.key.sql
index 3c25b2e6463..575930a728c 100644
--- a/htdocs/install/mysql/tables/llx_element_contact.key.sql
+++ b/htdocs/install/mysql/tables/llx_element_contact.key.sql
@@ -20,13 +20,9 @@
 -- ============================================================================
 
 
-ALTER TABLE llx_element_contact 
-	ADD UNIQUE INDEX idx_element_contact_idx1 (element_id, fk_c_type_contact, fk_socpeople);
+ALTER TABLE llx_element_contact ADD UNIQUE INDEX idx_element_contact_idx1 (element_id, fk_c_type_contact, fk_socpeople);
 	
-ALTER TABLE llx_element_contact 
-	ADD CONSTRAINT fk_element_contact_fk_c_type_contact
-	FOREIGN KEY (fk_c_type_contact)     REFERENCES llx_c_type_contact(rowid);
-
+ALTER TABLE llx_element_contact ADD CONSTRAINT fk_element_contact_fk_c_type_contact FOREIGN KEY (fk_c_type_contact)     REFERENCES llx_c_type_contact(rowid);
 	
 ALTER TABLE llx_element_contact ADD INDEX idx_element_contact_fk_socpeople (fk_socpeople);
 -- Pas de contraite sur fk_socpeople car point sur llx_socpeople mais aussi llx_user
diff --git a/htdocs/install/mysql/tables/llx_element_element.key.sql b/htdocs/install/mysql/tables/llx_element_element.key.sql
index 046b8125421..d065c0f2136 100644
--- a/htdocs/install/mysql/tables/llx_element_element.key.sql
+++ b/htdocs/install/mysql/tables/llx_element_element.key.sql
@@ -19,8 +19,7 @@
 -- ============================================================================
 
 
-ALTER TABLE llx_element_element 
-	ADD UNIQUE INDEX idx_element_element_idx1 (sourceid, sourcetype, targetid, targettype);
+ALTER TABLE llx_element_element ADD UNIQUE INDEX idx_element_element_idx1 (sourceid, sourcetype, targetid, targettype);
 
 	
 ALTER TABLE llx_element_element ADD INDEX idx_element_element_targetid (targetid);
diff --git a/htdocs/install/mysql/tables/llx_facturedet.key.sql b/htdocs/install/mysql/tables/llx_facturedet.key.sql
index 3421ae46655..44df288c94d 100644
--- a/htdocs/install/mysql/tables/llx_facturedet.key.sql
+++ b/htdocs/install/mysql/tables/llx_facturedet.key.sql
@@ -19,7 +19,7 @@
 -- ===================================================================
 
 
--- Supprimme orhpelins pour permettre mont�e de la cl�
+-- Supprimme orhpelins pour permettre montee de la cle
 -- V4 DELETE llx_facturedet FROM llx_facturedet LEFT JOIN llx_facture ON llx_facturedet.fk_facture = llx_facture.rowid WHERE llx_facture.rowid IS NULL;
 
 ALTER TABLE llx_facturedet ADD INDEX idx_facturedet_fk_facture (fk_facture);
diff --git a/htdocs/lib/databases/pgsql.lib.php b/htdocs/lib/databases/pgsql.lib.php
index fe8895516e2..bbbde427996 100644
--- a/htdocs/lib/databases/pgsql.lib.php
+++ b/htdocs/lib/databases/pgsql.lib.php
@@ -217,15 +217,23 @@ class DoliDb
 				$line=preg_replace('/unique index\s*\((\w+\s*,\s*\w+)\)/i','UNIQUE\(\\1\)',$line);
 			}
 
-			# alter table create [unique] index (field1, field2 ...)
+			# 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];
+			}
+
+			# 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)?\s*(INDEX)?\s*(.*)\s*\(([\w,\s]+)\)/i',$line,$reg))
+			if (preg_match('/ALTER\s+TABLE\s*(.*)\s*ADD\s+(UNIQUE INDEX|INDEX|UNIQUE)\s+(.*)\s*\(([\w,\s]+)\)/i',$line,$reg))
 			{
-				$fieldlist=$reg[5];
-				$idxname=$reg[4];
+				$fieldlist=$reg[4];
+				$idxname=$reg[3];
 				$tablename=$reg[1];
 				$line = "-- ".$line." replaced by --\n";
-				$line.= "CREATE ".($reg[2]?$reg[2].' ':'')."INDEX ".$idxname." ON ".$tablename." (".$fieldlist.")";
+				$line.= "CREATE ".(preg_match('/UNIQUE/',$reg[2])?'UNIQUE ':'')."INDEX ".$idxname." ON ".$tablename." (".$fieldlist.")";
 			}
 		} #  END of if ($create_sql ne "") i.e. were inside create table statement so processed datatypes
 		else {	# not inside create table
@@ -686,7 +694,7 @@ class DoliDb
 			1044 => 'DB_ERROR_ACCESSDENIED',
 			1046 => 'DB_ERROR_NODBSELECTED',
 			1048 => 'DB_ERROR_CONSTRAINT',
-			'42P07' => 'DB_ERROR_TABLE_ALREADY_EXISTS',
+			'42P07' => 'DB_ERROR_TABLE_OR_KEY_ALREADY_EXISTS',
 			1051 => 'DB_ERROR_NOSUCHTABLE',
 			1054 => 'DB_ERROR_NOSUCHFIELD',
 			1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS',
@@ -694,7 +702,7 @@ class DoliDb
 			1062 => 'DB_ERROR_RECORD_ALREADY_EXISTS',
 			'42704' => 'DB_ERROR_SYNTAX',
 			'42601' => 'DB_ERROR_SYNTAX',
-			1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS',
+			'42P16' => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS',
 			1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY',
 			1091 => 'DB_ERROR_NOSUCHFIELD',
 			1100 => 'DB_ERROR_NOT_LOCKED',
-- 
GitLab