diff --git a/htdocs/install/etape0.php b/htdocs/install/etape0.php
index 7486be2841a29fb8eb96935e87535f00d5287aaa..783817c062dbf599db96c2f1a5a64451e5ebad8e 100644
--- a/htdocs/install/etape0.php
+++ b/htdocs/install/etape0.php
@@ -125,7 +125,7 @@ if (! $error)
 			$databasefortest=$_POST["db_name"];
 			if (! empty($_POST["db_create_database"]))
 			{
-				if ($_POST["db_type"] == 'mysql' ||$_POST["db_type"] == 'mysqli')
+				if ($_POST["db_type"] == 'mysql' || $_POST["db_type"] == 'mysqli')
 				{
 					$databasefortest='mysql';
 				}
@@ -255,7 +255,7 @@ if (! $error && $db->connected)
 			{
 				// We keep only utf8 and iso
 				$linedisabled=false;
-				if (! eregi('(utf8|latin1)',$characterSet['charset'])) $linedisabled=true;
+				if (($_POST["db_type"] == 'mysql' ||$_POST["db_type"] == 'mysqli') && ! eregi('(utf8|latin1)',$characterSet['charset'])) $linedisabled=true;
 
 				if ($defaultCharacterSet == $characterSet['charset'] )
 				{
@@ -298,7 +298,7 @@ if (! $error && $db->connected)
 			{
 				// We keep only utf8 and iso
 				$linedisabled=false;
-				if (! eregi('(utf8_general|latin1_swedish)',$collation['collation'])) $linedisabled=true;
+				if (($_POST["db_type"] == 'mysql' ||$_POST["db_type"] == 'mysqli') && ! eregi('(utf8_general|latin1_swedish)',$collation['collation'])) $linedisabled=true;
 
 				if ($defaultCollationConnection == $collation['collation'])
 				{
diff --git a/htdocs/install/etape1.php b/htdocs/install/etape1.php
index dd5ad448cd0785b7a35351ef0f770900526121bf..833a4b953031f89af6aeb499ee21d98823002d49 100644
--- a/htdocs/install/etape1.php
+++ b/htdocs/install/etape1.php
@@ -321,7 +321,7 @@ if ($_POST["action"] == "set")
 
 			if ($db->connected)
 			{
-				if ($db->DDLCreateDb($dolibarr_main_db_name, $dolibarr_main_db_character_set, $dolibarr_main_db_collation))
+				if ($db->DDLCreateDb($dolibarr_main_db_name, $dolibarr_main_db_character_set, $dolibarr_main_db_collation, $dolibarr_main_db_user))
 				{
 					print '<tr><td>';
 					print $langs->trans("DatabaseCreation").' : ';
@@ -378,7 +378,7 @@ if ($_POST["action"] == "set")
 
 
 		/*
-		* On test maintenant l'acc�s par le user admin dolibarr
+		* On test maintenant l'acces par le user admin dolibarr
 		*/
 		if (! $error)
 		{
diff --git a/htdocs/lib/databases/mysql.lib.php b/htdocs/lib/databases/mysql.lib.php
index 6c837ea225cd3e5da6fc70399bfd6c0ff98ed885..256777555e81eaef1ce2dd084f26d7dd941d264d 100644
--- a/htdocs/lib/databases/mysql.lib.php
+++ b/htdocs/lib/databases/mysql.lib.php
@@ -749,11 +749,12 @@ class DoliDb
 	 *	\param	        database		Database name to create
 	 * 	\param			charset			Charset used to store data
 	 * 	\param			collation		Charset used to sort data
-	 *	\return	        resource		resource defined if OK, null if KO
+	 * 	\param			owner			Username of database owner
+	 * 	\return	        resource		resource defined if OK, null if KO
 	 *	\remarks        Do not use function xxx_create_db (xxx=mysql, ...) as they are deprecated
 	 *					We force to create database with charset this->forcecharset and collate this->forcecollate
 	 */
-	function DDLCreateDb($database,$charset='',$collation='')
+	function DDLCreateDb($database,$charset='',$collation='',$owner='')
 	{
 		if (empty($charset))   $charset=$this->forcecharset;
 		if (empty($collation)) $collation=$this->collation;
@@ -963,12 +964,12 @@ class DoliDb
 
 
 	/**
-	 *	\brief      Create a user
-	 *	\param	    dolibarr_main_db_host 		Ip serveur
-	 *	\param	    dolibarr_main_db_user 		Nom user a creer
-	 *	\param	    dolibarr_main_db_pass 		Mot de passe user a creer
+	 *	\brief      Create a user and privileges to connect to database (even if database does not exists yet)
+	 *	\param	    dolibarr_main_db_host 		Ip server
+	 *	\param	    dolibarr_main_db_user 		Username to create
+	 *	\param	    dolibarr_main_db_pass 		Password
 	 *	\param		dolibarr_main_db_name		Database name where user must be granted
-	 *	\return	    int							<0 si KO, >=0 si OK
+	 *	\return	    int							<0 if KO, >=0 if OK
 	 */
 	function DDLCreateUser($dolibarr_main_db_host,$dolibarr_main_db_user,$dolibarr_main_db_pass,$dolibarr_main_db_name)
 	{
diff --git a/htdocs/lib/databases/mysqli.lib.php b/htdocs/lib/databases/mysqli.lib.php
index cd0d702e58f92f3dd438cff79c7744467d13712c..d0d9f3bfee8ee6d71b325dd164913fe8d809542d 100644
--- a/htdocs/lib/databases/mysqli.lib.php
+++ b/htdocs/lib/databases/mysqli.lib.php
@@ -761,11 +761,12 @@ class DoliDb
 	 *	\param	        database		Database name to create
 	 * 	\param			charset			Charset used to store data
 	 * 	\param			collation		Charset used to sort data
+	 * 	\param			owner			Username of database owner
 	 * 	\return	        resource		resource defined if OK, null if KO
 	 *	\remarks        Do not use function xxx_create_db (xxx=mysql, ...) as they are deprecated
 	 *					We force to create database with charset this->forcecharset and collate this->forcecollate
 	 */
-	function DDLCreateDb($database,$charset='',$collation='')
+	function DDLCreateDb($database,$charset='',$collation='',$owner='')
 	{
 		if (empty($charset))   $charset=$this->forcecharset;
 		if (empty($collation)) $collation=$this->collation;
@@ -976,12 +977,12 @@ class DoliDb
 
 
 	/**
-	 *	\brief      Create a user
-	 *	\param	    dolibarr_main_db_host 		Ip serveur
-	 *	\param	    dolibarr_main_db_user 		Nom user a creer
-	 *	\param	    dolibarr_main_db_pass 		Mot de passe user a creer
+	 *	\brief      Create a user and privileges to connect to database (even if database does not exists yet)
+	 *	\param	    dolibarr_main_db_host 		Ip server
+	 *	\param	    dolibarr_main_db_user 		Username to create
+	 *	\param	    dolibarr_main_db_pass 		Password
 	 *	\param		dolibarr_main_db_name		Database name where user must be granted
-	 *	\return	    int							<0 si KO, >=0 si OK
+	 *	\return	    int							<0 if KO, >=0 if OK
 	 */
 	function DDLCreateUser($dolibarr_main_db_host,$dolibarr_main_db_user,$dolibarr_main_db_pass,$dolibarr_main_db_name)
 	{
diff --git a/htdocs/lib/databases/pgsql.lib.php b/htdocs/lib/databases/pgsql.lib.php
index 2892e344b2d8f3f9f81bd14340b6d064814d356c..85f6acbc75ed3e748111908441470c6990e1c8af 100644
--- a/htdocs/lib/databases/pgsql.lib.php
+++ b/htdocs/lib/databases/pgsql.lib.php
@@ -22,129 +22,129 @@
  */
 
 /**
-	    \file       htdocs/lib/databases/pgsql.lib.php
-		\brief      Fichier de la classe permettant de gerer une base pgsql
-		\version	$Id$
-*/
+ \file       htdocs/lib/databases/pgsql.lib.php
+ \brief      Fichier de la classe permettant de gerer une base pgsql
+ \version	$Id$
+ */
 // For compatibility during upgrade
 if (! defined('DOL_DOCUMENT_ROOT'))	 define('DOL_DOCUMENT_ROOT', '../..');
 if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php");
 
 
 /**
-        \class      DoliDb
-        \brief      Classe permettant de gerer la database de dolibarr
-*/
+ \class      DoliDb
+ \brief      Classe permettant de gerer la database de dolibarr
+ */
 class DoliDb
 {
-    var $db;                      // Handler de base
-    var $type='pgsql';            // Nom du gestionnaire
-   //! Charset
-    var $forcecharset='latin1';
+	var $db;                      // Handler de base
+	var $type='pgsql';            // Nom du gestionnaire
+	//! Charset
+	var $forcecharset='latin1';
 	var $versionmin=array(8,1,0);	// Version min database
 
-    var $results;                 // Resultset de la derniere requete
+	var $results;                 // Resultset de la derniere requete
 
-    var $connected;               // 1 si connecte, 0 sinon
-    var $database_selected;       // 1 si base selectionne, 0 sinon
-    var $database_name;			  // Nom base selectionnee
-    var $database_user;	   //! Nom user base
-    var $transaction_opened;      // 1 si une transaction est en cours, 0 sinon
-    var $lastquery;
+	var $connected;               // 1 si connecte, 0 sinon
+	var $database_selected;       // 1 si base selectionne, 0 sinon
+	var $database_name;			  // Nom base selectionnee
+	var $database_user;	   //! Nom user base
+	var $transaction_opened;      // 1 si une transaction est en cours, 0 sinon
+	var $lastquery;
 	var $lastqueryerror;		// Ajout d'une variable en cas d'erreur
 
-    var $ok;
-    var $error;
-    var $lasterror;
+	var $ok;
+	var $error;
+	var $lasterror;
 
 
 
-    /**
-     * \brief      Ouverture d'une connexion vers le serveur et 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='pgsql', $host, $user, $pass, $name='', $port=0)
-    {
-    	global $conf,$langs;
+	/**
+	 * \brief      Ouverture d'une connexion vers le serveur et 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='pgsql', $host, $user, $pass, $name='', $port=0)
+	{
+		global $conf,$langs;
 
 		$this->forcecharset=$conf->file->character_set_client;
-	    $this->forcecollate=$conf->db->dolibarr_main_db_collation;
-	    $this->database_user=$user;
-
-        $this->transaction_opened=0;
-
-        //print "Name DB: $host,$user,$pass,$name<br>";
-
-        if (! function_exists("pg_connect"))
-        {
-        	$this->connected = 0;
-        	$this->ok = 0;
-            $this->error="Pgsql PHP functions are not available in this version of PHP";
-        	dol_syslog("DoliDB::DoliDB : Pgsql PHP functions are not available in this version of PHP",LOG_ERR);
-            return $this->ok;
-        }
-
-        if (! $host)
-        {
-        	$this->connected = 0;
-        	$this->ok = 0;
-            $this->error=$langs->trans("ErrorWrongHostParameter");
-        	dol_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR);
-            return $this->ok;
-        }
-
-        // Essai connexion serveur
-        $this->db = $this->connect($host, $user, $pass, $name, $port);
-
-        if ($this->db)
-        {
-            $this->connected = 1;
-            $this->ok = 1;
-        }
-        else
-        {
-            // host, login ou password incorrect
-            $this->connected = 0;
-            $this->ok = 0;
+		$this->forcecollate=$conf->db->dolibarr_main_db_collation;
+		$this->database_user=$user;
+
+		$this->transaction_opened=0;
+
+		//print "Name DB: $host,$user,$pass,$name<br>";
+
+		if (! function_exists("pg_connect"))
+		{
+			$this->connected = 0;
+			$this->ok = 0;
+			$this->error="Pgsql PHP functions are not available in this version of PHP";
+			dol_syslog("DoliDB::DoliDB : Pgsql PHP functions are not available in this version of PHP",LOG_ERR);
+			return $this->ok;
+		}
+
+		if (! $host)
+		{
+			$this->connected = 0;
+			$this->ok = 0;
+			$this->error=$langs->trans("ErrorWrongHostParameter");
+			dol_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR);
+			return $this->ok;
+		}
+
+		// Essai connexion serveur
+		//print "$host, $user, $pass, $name, $port";
+		$this->db = $this->connect($host, $user, $pass, $name, $port);
+		if ($this->db)
+		{
+			$this->connected = 1;
+			$this->ok = 1;
+		}
+		else
+		{
+			// host, login ou password incorrect
+			$this->connected = 0;
+			$this->ok = 0;
 			$this->error='Host, login or password incorrect';
-            dol_syslog("DoliDB::DoliDB : Erreur Connect ".$this->error,LOG_ERR);
-        }
-
-        // Si connexion serveur ok et si connexion base demandee, on essaie connexion base
-        if ($this->connected && $name)
-        {
-            if ($this->select_db($name))
-            {
-                $this->database_selected = 1;
-                $this->database_name = $name;
-                $this->ok = 1;
-            }
-            else
-            {
-                $this->database_selected = 0;
-                $this->database_name = '';
-                $this->ok = 0;
-                $this->error=$this->error();
-                dol_syslog("DoliDB::DoliDB : Erreur Select_db ".$this->error,LOG_ERR);
-            }
-        }
-        else
-        {
-            // Pas de selection de base demandee, ok ou ko
-            $this->database_selected = 0;
-        }
-
-        return $this->ok;
-    }
-
-
-    /**
+			dol_syslog("DoliDB::DoliDB : Erreur Connect ".$this->error,LOG_ERR);
+		}
+
+		// Si connexion serveur ok et si connexion base demandee, on essaie connexion base
+		if ($this->connected && $name)
+		{
+			if ($this->select_db($name))
+			{
+				$this->database_selected = 1;
+				$this->database_name = $name;
+				$this->ok = 1;
+			}
+			else
+			{
+				$this->database_selected = 0;
+				$this->database_name = '';
+				$this->ok = 0;
+				$this->error=$this->error();
+				dol_syslog("DoliDB::DoliDB : Erreur Select_db ".$this->error,LOG_ERR);
+			}
+		}
+		else
+		{
+			// Pas de selection de base demandee, ok ou ko
+			$this->database_selected = 0;
+		}
+
+		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
@@ -152,239 +152,239 @@ class DoliDb
 	function convertSQLFromMysql($line)
 	{
 		# comments or empty lines
-    	if (eregi('^-- \$Id',$line)) {
-    		return '';
+		if (eregi('^-- \$Id',$line)) {
+			return '';
 		}
 		# comments or empty lines
-    	if (preg_match('/^#/i',$line) || preg_match('/^$/i',$line) || preg_match('/^--/i',$line))
-    	{
-    		return $line;
-    	}
-    	if ($create_sql != "")
-    	{ 		# 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('/\) *type=(MyISAM|innodb);/i',');');
-    			$line=preg_replace('/\) *engine=(MyISAM|innodb);/i',');');
-    		}
-
-            # int, auto_increment -> serial
-//    		} elsif (/^[\s\t]*(\w*)\s*.*int.*auto_increment/i) {
-//    			$seq = qq~${table}_${1}_seq~;
-//    			s/[\s\t]*([a-zA-Z_0-9]*)\s*.*int.*auto_increment[^,]*/  $1 SERIAL PRIMARY KEY/ig;
-//    			$create_sql.=$_;
-
-    		# int type conversion
-/*    		} elsif (/(\w*)int\(\d+\)/i) {
-    			$size=$1;
-    			$size =~ tr [A-Z] [a-z];
-    			if ($size eq "tiny" || $size eq "small") {
-    				$out = "int2";
-    			} elsif ($size eq "big") {
-    				$out = "int8";
-    			} else {
-    				$out = "int4";
-    			}
-    			s/\w*int\(\d+\)/$out/g;
-    		}
-*/
-    		$line=str_replace('tinyint','smallint',$line);
-
-    		# nuke unsigned
-    		if (preg_replace('/(int\w+|smallint)\s+unsigned/i','smallint',$reg))
-    		{
-    			$line=preg_replace('/(int\w+|smallint)\s+unsigned/i',$reg[1]);
-    		}
-
-
-    		# blob -> text
-   			$line=preg_replace('/\w*blob/i','text');
-
-    		# tinytext/mediumtext -> text
-   			$line=preg_replace('/tinytext/i','text');
-   			$line=preg_replace('/mediumtext/i','text');
-
-    		# char -> varchar
-    		# PostgreSQL would otherwise pad with spaces as opposed
-    		# to MySQL! Your user interface may depend on this!
-//    		s/(\s+)char/${1}varchar/gi;
-
-    		# nuke date representation (not supported in PostgreSQL)
-//    		s/datetime default '[^']+'/datetime/i;
-//    		s/date default '[^']+'/datetime/i;
-//    		s/time default '[^']+'/datetime/i;
-
-    		# 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=preg_replace('/datetime/i','timestamp');
-
-    		# nuke size of timestamp
-//    		s/timestamp\([^)]*\)/timestamp/i;
-
-    		# double -> real
-//    		s/^double/real/i;
-//    		s/(\s*)double/${1}real/i;
-
-    		# unique key(field1,field2)
-/*    		if (/unique key\s*\((\w+\s*,\s*\w+)\)/i) {
-    		    s/unique key\s*\((\w+\s*,\s*\w+)\)/UNIQUE\($1\)/i;
-                $create_sql.=$_;
-    		    next;
-    		}
-*/
-    		# unique index(field1,field2)
-/*    		if (/unique index\s*\((\w+\s*,\s*\w+)\)/i) {
-                s/unique index\s*\((\w+\s*,\s*\w+)\)/UNIQUE\($1\)/i;
-                $create_sql.=$_;
-    		    next;
-    		}
-*/
-            # unique key [name] (field)
-/*            if (/unique key\s*(\w*)\s*\((\w+)\)/i) {
-                s/unique key\s*(\w*)\s*\((\w+)\)/UNIQUE\($2\)/i;
-                my $idxname=($1?"$1":"idx_${table}_$2");
-                $create_sql.=$_;
-                $create_index .= "CREATE INDEX $idxname ON $table ($2);\n";
-                next;
-            }
-*/
-            # unique index [name] (field)
-/*            if (/unique index\s*(\w*)\s*\((\w+)\)/i) {
-                s/unique index\s*(\w*)\s*\((\w+)\)/UNIQUE\($2\)/i;
-                my $idxname=($1?"$1":"idx_${table}_$2");
-                $create_sql.=$_;
-                $create_index .= "CREATE INDEX $idxname ON $table ($2);\n";
-                next;
-            }
-*/
-            # unique (field) et unique (field1, field2 ...)
-/*            if (/unique\s*\(([\w,\s]+)\)/i) {
-                s/unique\s*\(([\w,\s]+)\)/UNIQUE\($1\)/i;
-                my $fieldlist="$1";
-                my $idxname="idx_${table}_${fieldlist}";
-                $idxname =~ s/\W/_/g; $idxname =~ tr/_/_/s;
-                $create_sql.=$_;
-                $create_index .= "CREATE INDEX $idxname ON $table ($fieldlist);\n";
-                next;
-            }
-*/
-            # index(field)
-/*            if (/index\s*(\w*)\s*\((\w+)\)/i) {
-                my $idxname=($1?"$1":"idx_${table}_$2");
-                $create_index .= "CREATE INDEX $idxname ON $table ($2);\n";
-                next;
-            }
-*/
-            # primary key
-/*    		if (/\bkey\b/i && !/^\s+primary key\s+/i) {
-    			s/KEY(\s+)[^(]*(\s+)/$1 UNIQUE $2/i;		 # hack off name of the non-primary key
-    		}
-*/
-            # key(xxx)
-/*            if (/key\s*\((\w+)\)/i) {
-                my $idxname="idx_${table}_$1";
-                $create_index .= "CREATE INDEX $idxname ON $table ($1);\n";
-                next;
-            }
-*/
-    		# Quote column names
-/*    		s/(^\s*)([^\s\-\(]+)(\s*)/$1"$2"$3/gi if (!/\bkey\b/i);
-*/
-    		# Remap colums with names of existing system attribute
-/*    		if (/"oid"/i) {
-    			s/"oid"/"_oid"/g;
-    			print STDERR "WARNING: table $table uses column \"oid\" which is renamed to \"_oid\"\nYou should fix application manually! Press return to continue.";
-    			my $wait=<STDIN>;
-    		}
-    		s/oid/_oid/i if (/key/i && /oid/i); # fix oid in key
-    		$create_sql.=$_;
-*/
-    	} #  END of if ($create_sql ne "") i.e. were inside create table statement so processed datatypes
-    	else {	# not inside create table
-    		#---- fix data in inserted data: (from MS world)
-    		# FIX: disabled for now
-/*    		if (00 && /insert into/i) {
-    			s!\x96!-!g;	# --
-    			s!\x93!"!g;	# ``
-    			s!\x94!"!g;	# ''
-    			s!\x85!... !g;	# \ldots
-    			s!\x92!`!g;
-    		}
-*/
-    		# fix dates '0000-00-00 00:00:00' (should be null)
-/*    		s/'0000-00-00 00:00:00'/null/gi;
-    		s/'0000-00-00'/null/gi;
-    		s/'00:00:00'/null/gi;
-    		s/([12]\d\d\d)([01]\d)([0-3]\d)([0-2]\d)([0-6]\d)([0-6]\d)/'$1-$2-$3 $4:$5:$6'/;
-
-    		if (/create\s+table\s+(\w+)/i) {
-    			$create_sql = $_;
-    			/create\s*table\s*(\w+)/i;
-    			$table=$1 if (defined($1));
-    		} else {
-    			print OUT $_;
-    		}
-*/
-    	} # end of if inside create_table
+		if (preg_match('/^#/i',$line) || preg_match('/^$/i',$line) || preg_match('/^--/i',$line))
+		{
+			return $line;
+		}
+		if ($create_sql != "")
+		{ 		# 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('/\) *type=(MyISAM|innodb);/i',');');
+				$line=preg_replace('/\) *engine=(MyISAM|innodb);/i',');');
+			}
+
+			# int, auto_increment -> serial
+			//    		} elsif (/^[\s\t]*(\w*)\s*.*int.*auto_increment/i) {
+			//    			$seq = qq~${table}_${1}_seq~;
+			//    			s/[\s\t]*([a-zA-Z_0-9]*)\s*.*int.*auto_increment[^,]*/  $1 SERIAL PRIMARY KEY/ig;
+			//    			$create_sql.=$_;
+
+			# int type conversion
+			/*    		} elsif (/(\w*)int\(\d+\)/i) {
+			 $size=$1;
+			 $size =~ tr [A-Z] [a-z];
+			 if ($size eq "tiny" || $size eq "small") {
+			 $out = "int2";
+			 } elsif ($size eq "big") {
+			 $out = "int8";
+			 } else {
+			 $out = "int4";
+			 }
+			 s/\w*int\(\d+\)/$out/g;
+			 }
+			 */
+			$line=str_replace('tinyint','smallint',$line);
+
+			# nuke unsigned
+			if (preg_replace('/(int\w+|smallint)\s+unsigned/i','smallint',$reg))
+			{
+				$line=preg_replace('/(int\w+|smallint)\s+unsigned/i',$reg[1]);
+			}
+
+
+			# blob -> text
+			$line=preg_replace('/\w*blob/i','text');
+
+			# tinytext/mediumtext -> text
+			$line=preg_replace('/tinytext/i','text');
+			$line=preg_replace('/mediumtext/i','text');
+
+			# char -> varchar
+			# PostgreSQL would otherwise pad with spaces as opposed
+			# to MySQL! Your user interface may depend on this!
+			//    		s/(\s+)char/${1}varchar/gi;
+
+			# nuke date representation (not supported in PostgreSQL)
+			//    		s/datetime default '[^']+'/datetime/i;
+			//    		s/date default '[^']+'/datetime/i;
+			//    		s/time default '[^']+'/datetime/i;
+
+			# 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=preg_replace('/datetime/i','timestamp');
+
+			# nuke size of timestamp
+			//    		s/timestamp\([^)]*\)/timestamp/i;
+
+			# double -> real
+			//    		s/^double/real/i;
+			//    		s/(\s*)double/${1}real/i;
+
+			# unique key(field1,field2)
+			/*    		if (/unique key\s*\((\w+\s*,\s*\w+)\)/i) {
+			 s/unique key\s*\((\w+\s*,\s*\w+)\)/UNIQUE\($1\)/i;
+			 $create_sql.=$_;
+			 next;
+			 }
+			 */
+			# unique index(field1,field2)
+			/*    		if (/unique index\s*\((\w+\s*,\s*\w+)\)/i) {
+			 s/unique index\s*\((\w+\s*,\s*\w+)\)/UNIQUE\($1\)/i;
+			 $create_sql.=$_;
+			 next;
+			 }
+			 */
+			# unique key [name] (field)
+			/*            if (/unique key\s*(\w*)\s*\((\w+)\)/i) {
+			 s/unique key\s*(\w*)\s*\((\w+)\)/UNIQUE\($2\)/i;
+			 my $idxname=($1?"$1":"idx_${table}_$2");
+			 $create_sql.=$_;
+			 $create_index .= "CREATE INDEX $idxname ON $table ($2);\n";
+			 next;
+			 }
+			 */
+			# unique index [name] (field)
+			/*            if (/unique index\s*(\w*)\s*\((\w+)\)/i) {
+			 s/unique index\s*(\w*)\s*\((\w+)\)/UNIQUE\($2\)/i;
+			 my $idxname=($1?"$1":"idx_${table}_$2");
+			 $create_sql.=$_;
+			 $create_index .= "CREATE INDEX $idxname ON $table ($2);\n";
+			 next;
+			 }
+			 */
+			# unique (field) et unique (field1, field2 ...)
+			/*            if (/unique\s*\(([\w,\s]+)\)/i) {
+			 s/unique\s*\(([\w,\s]+)\)/UNIQUE\($1\)/i;
+			 my $fieldlist="$1";
+			 my $idxname="idx_${table}_${fieldlist}";
+			 $idxname =~ s/\W/_/g; $idxname =~ tr/_/_/s;
+			 $create_sql.=$_;
+			 $create_index .= "CREATE INDEX $idxname ON $table ($fieldlist);\n";
+			 next;
+			 }
+			 */
+			# index(field)
+			/*            if (/index\s*(\w*)\s*\((\w+)\)/i) {
+			 my $idxname=($1?"$1":"idx_${table}_$2");
+			 $create_index .= "CREATE INDEX $idxname ON $table ($2);\n";
+			 next;
+			 }
+			 */
+			# primary key
+			/*    		if (/\bkey\b/i && !/^\s+primary key\s+/i) {
+			 s/KEY(\s+)[^(]*(\s+)/$1 UNIQUE $2/i;		 # hack off name of the non-primary key
+			 }
+			 */
+			# key(xxx)
+			/*            if (/key\s*\((\w+)\)/i) {
+			 my $idxname="idx_${table}_$1";
+			 $create_index .= "CREATE INDEX $idxname ON $table ($1);\n";
+			 next;
+			 }
+			 */
+			# Quote column names
+			/*    		s/(^\s*)([^\s\-\(]+)(\s*)/$1"$2"$3/gi if (!/\bkey\b/i);
+			 */
+			# Remap colums with names of existing system attribute
+			/*    		if (/"oid"/i) {
+			 s/"oid"/"_oid"/g;
+			 print STDERR "WARNING: table $table uses column \"oid\" which is renamed to \"_oid\"\nYou should fix application manually! Press return to continue.";
+			 my $wait=<STDIN>;
+			 }
+			 s/oid/_oid/i if (/key/i && /oid/i); # fix oid in key
+			 $create_sql.=$_;
+			 */
+		} #  END of if ($create_sql ne "") i.e. were inside create table statement so processed datatypes
+		else {	# not inside create table
+			#---- fix data in inserted data: (from MS world)
+			# FIX: disabled for now
+			/*    		if (00 && /insert into/i) {
+			 s!\x96!-!g;	# --
+			 s!\x93!"!g;	# ``
+			 s!\x94!"!g;	# ''
+			 s!\x85!... !g;	# \ldots
+			 s!\x92!`!g;
+			 }
+			 */
+			# fix dates '0000-00-00 00:00:00' (should be null)
+			/*    		s/'0000-00-00 00:00:00'/null/gi;
+			 s/'0000-00-00'/null/gi;
+			 s/'00:00:00'/null/gi;
+			 s/([12]\d\d\d)([01]\d)([0-3]\d)([0-2]\d)([0-6]\d)([0-6]\d)/'$1-$2-$3 $4:$5:$6'/;
+
+			 if (/create\s+table\s+(\w+)/i) {
+			 $create_sql = $_;
+			 /create\s*table\s*(\w+)/i;
+			 $table=$1 if (defined($1));
+			 } else {
+			 print OUT $_;
+			 }
+			 */
+		} # end of if inside create_table
 
 
 		return $line;
 	}
 
-    /**
-     * \brief      Selectionne une 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
-     */
-    function select_db($database)
-    {
-        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
-     */
-    function connect($host, $login, $passwd, $name, $port=0)
-    {
-    	if (!$name){
-    		$name="postgres";
-    	}
-        $con_string = "host=$host port=$port dbname=$name user=$login password=$passwd";
-        $this->db = pg_connect($con_string);
-        if ($this->db)
-        {
-            $this->database_name = $name;
-        }
-        return $this->db;
-    }
-
-    /**
-     * \brief          Renvoie la version du serveur
-     * \return	        string      Chaine version
-     */
-    function getVersion()
-    {
-    	$resql=$this->query('SHOW server_version');
-	    $liste=$this->fetch_array($resql);
-	    return $liste['server_version'];
-    }
-
-    /**
-     * \brief		Renvoie la version du serveur sous forme de nombre
-     * \return		string      Chaine version
-     */
-    function getIntVersion()
+	/**
+	 * \brief      Selectionne une 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
+	 */
+	function select_db($database)
+	{
+		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
+	 */
+	function connect($host, $login, $passwd, $name, $port=0)
+	{
+		if (!$name){
+			$name="postgres";
+		}
+		$con_string = "host=$host port=$port dbname=$name user=$login password=$passwd";
+		$this->db = pg_connect($con_string);
+		if ($this->db)
+		{
+			$this->database_name = $name;
+		}
+		return $this->db;
+	}
+
+	/**
+	 * \brief          Renvoie la version du serveur
+	 * \return	        string      Chaine version
+	 */
+	function getVersion()
+	{
+		$resql=$this->query('SHOW server_version');
+		$liste=$this->fetch_array($resql);
+		return $liste['server_version'];
+	}
+
+	/**
+	 * \brief		Renvoie la version du serveur sous forme de nombre
+	 * \return		string      Chaine version
+	 */
+	function getIntVersion()
 	{
 		$version = $this->getVersion();
 		$vlist = preg_split('/[.-]/',$version);
@@ -397,212 +397,212 @@ class DoliDb
 		return $vlist[0].$vlist[1].$vlist[2];
 	}
 
-    /**
-     * \brief		Renvoie la version du serveur dans un tableau
-     * \return		array  		Tableau de chaque niveau de version
-     */
-    function getVersionArray()
-    {
-        return explode('.',$this->getVersion());
-    }
-
-    /**
-     * \brief      Fermeture d'une connexion vers une database.
-     * \return	    resource
-     */
-    function close()
-    {
+	/**
+	 * \brief		Renvoie la version du serveur dans un tableau
+	 * \return		array  		Tableau de chaque niveau de version
+	 */
+	function getVersionArray()
+	{
+		return explode('.',$this->getVersion());
+	}
+
+	/**
+	 * \brief      Fermeture d'une connexion vers une database.
+	 * \return	    resource
+	 */
+	function close()
+	{
 		dol_syslog("DoliDB::disconnect",LOG_DEBUG);
-    	return pg_close($this->db);
-    }
-
-    /**
-     * \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)
-        {
-            $ret=$this->query("BEGIN;");
-            if ($ret)
+		return pg_close($this->db);
+	}
+
+	/**
+	 * \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)
+		{
+			$ret=$this->query("BEGIN;");
+			if ($ret)
 			{
 				$this->transaction_opened++;
 				dol_syslog("BEGIN Transaction",LOG_DEBUG);
 			}
-            return $ret;
-        }
-        else
-        {
-            $this->transaction_opened++;
-            return 1;
-        }
-    }
-
-    /**
-     * \brief      Validation d'une transaction
-     * \return	    int         1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur
-     */
-    function commit()
-    {
-        if ($this->transaction_opened<=1)
-        {
-            $ret=$this->query("COMMIT;");
+			return $ret;
+		}
+		else
+		{
+			$this->transaction_opened++;
+			return 1;
+		}
+	}
+
+	/**
+	 * \brief      Validation d'une transaction
+	 * \return	    int         1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur
+	 */
+	function commit()
+	{
+		if ($this->transaction_opened<=1)
+		{
+			$ret=$this->query("COMMIT;");
 			if ($ret)
 			{
 				$this->transaction_opened=0;
 				dol_syslog("COMMIT Transaction",LOG_DEBUG);
 			}
-            return $ret;
-        }
-        else
-        {
-            $this->transaction_opened--;
-            return 1;
-        }
-    }
-
-    /**
-     * \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()
-    {
-        if ($this->transaction_opened<=1)
-        {
-            $ret=$this->query("ROLLBACK;");
+			return $ret;
+		}
+		else
+		{
+			$this->transaction_opened--;
+			return 1;
+		}
+	}
+
+	/**
+	 * \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()
+	{
+		if ($this->transaction_opened<=1)
+		{
+			$ret=$this->query("ROLLBACK;");
 			$this->transaction_opened=0;
 			dol_syslog("ROLLBACK Transaction",LOG_DEBUG);
-            return $ret;
-        }
-        else
-        {
-            $this->transaction_opened--;
-            return 1;
-        }
-    }
-
-
-    /**
-     * \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
-     */
-    function query($query)
-    {
-        $query = trim($query);
+			return $ret;
+		}
+		else
+		{
+			$this->transaction_opened--;
+			return 1;
+		}
+	}
+
+
+	/**
+	 * \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
+	 */
+	function query($query)
+	{
+		$query = trim($query);
 
 		if ($this->forcecharset=="UTF-8"){
-					$buffer=utf8_encode ($buffer);
+			$buffer=utf8_encode ($buffer);
 		}
 		$ret = pg_query($this->db, $query);
-        if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query))
-        {
-            // Si requete utilisateur, on la sauvegarde ainsi que son resultset
+		if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query))
+		{
+			// Si requete utilisateur, on la sauvegarde ainsi que son resultset
 			if (! $ret)
 			{
 				$this->lastqueryerror = $query;
-            	$this->lasterror = $this->error();
-            	$this->lasterrno = $this->errno();
-            }
-            $this->lastquery=$query;
-            $this->results = $ret;
-        }
-
-        return $ret;
-    }
-
-    /**
-     * \brief      Renvoie la ligne courante (comme un objet) pour le curseur resultset.
-     * \param      resultset   Curseur de la requete voulue
-     * \return	    resource
-     */
-    function fetch_object($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        return pg_fetch_object($resultset);
-    }
-
-    /**
-     * \brief      Renvoie les donnees dans un tableau.
-     * \param      resultset   Curseur de la requete voulue
-     * \return		array
-     */
-    function fetch_array($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        return pg_fetch_array($resultset);
-    }
-
-    /**
-     * \brief      Renvoie les donnees comme un tableau.
-     * \param      resultset   Curseur de la requete voulue
-     * \return	    array
-     */
-    function fetch_row($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        return pg_fetch_row($resultset);
-    }
-
-    /**
-     * \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=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette 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
-     * \param      resultset   Curseur de la requete voulue
-     * \return     int		    Nombre de lignes
-     */
-    function affected_rows($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        // pgsql necessite un resultset pour cette fonction contrairement
-        // a mysql qui prend un link de base
-        return pg_affected_rows($resultset);
-    }
-
-
-    /**
-     * \brief      Libere le dernier resultset utilise sur cette connexion.
-     * \param      resultset   Curseur de la requete voulue
-     */
-    function free($resultset=0)
-    {
-        // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion
-        if (! is_resource($resultset)) { $resultset=$this->results; }
-        // Si resultset en est un, on libere la m�moire
-        if (is_resource($resultset)) pg_free_result($resultset);
-    }
-
-
-    /**
-     * \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
-     */
-    function plimit($limit=0,$offset=0)
-    {
-        global $conf;
-        if (! $limit) $limit=$conf->liste_limit;
-        if ($offset > 0) return " LIMIT $offset,$limit ";
-        else return " LIMIT $limit ";
-    }
+				$this->lasterror = $this->error();
+				$this->lasterrno = $this->errno();
+			}
+			$this->lastquery=$query;
+			$this->results = $ret;
+		}
+
+		return $ret;
+	}
+
+	/**
+	 * \brief      Renvoie la ligne courante (comme un objet) pour le curseur resultset.
+	 * \param      resultset   Curseur de la requete voulue
+	 * \return	    resource
+	 */
+	function fetch_object($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		return pg_fetch_object($resultset);
+	}
+
+	/**
+	 * \brief      Renvoie les donnees dans un tableau.
+	 * \param      resultset   Curseur de la requete voulue
+	 * \return		array
+	 */
+	function fetch_array($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		return pg_fetch_array($resultset);
+	}
+
+	/**
+	 * \brief      Renvoie les donnees comme un tableau.
+	 * \param      resultset   Curseur de la requete voulue
+	 * \return	    array
+	 */
+	function fetch_row($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		return pg_fetch_row($resultset);
+	}
+
+	/**
+	 * \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=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilise sur cette 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
+	 * \param      resultset   Curseur de la requete voulue
+	 * \return     int		    Nombre de lignes
+	 */
+	function affected_rows($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		// pgsql necessite un resultset pour cette fonction contrairement
+		// a mysql qui prend un link de base
+		return pg_affected_rows($resultset);
+	}
+
+
+	/**
+	 * \brief      Libere le dernier resultset utilise sur cette connexion.
+	 * \param      resultset   Curseur de la requete voulue
+	 */
+	function free($resultset=0)
+	{
+		// Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion
+		if (! is_resource($resultset)) { $resultset=$this->results; }
+		// Si resultset en est un, on libere la m�moire
+		if (is_resource($resultset)) pg_free_result($resultset);
+	}
+
+
+	/**
+	 * \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
+	 */
+	function plimit($limit=0,$offset=0)
+	{
+		global $conf;
+		if (! $limit) $limit=$conf->liste_limit;
+		if ($offset > 0) return " LIMIT $offset,$limit ";
+		else return " LIMIT $limit ";
+	}
 
 
 	/**
@@ -612,8 +612,8 @@ class DoliDb
 	 * \return	    string      chaine exprimant la syntax sql de l'ordre de tri
 	 * \TODO		A mutualiser dans classe mere
 	 */
-    function order($sortfield=0,$sortorder=0)
-    {
+	function order($sortfield=0,$sortorder=0)
+	{
 		if ($sortfield)
 		{
 			$return='';
@@ -632,7 +632,7 @@ class DoliDb
 		{
 			return '';
 		}
-    }
+	}
 
 
 	/**
@@ -640,23 +640,23 @@ class DoliDb
 	 * \param	    stringtoencode		String to escape
 	 * \return	    string				String escaped
 	 */
-    function escape($stringtoencode)
+	function escape($stringtoencode)
 	{
 		return addslashes($stringtoencode);
 	}
 
 
-   /**
-    *   \brief      Formatage (par la base de donnees) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS)
-    *               afin de retourner une donnee toujours au format universel date tms unix.
-    *               Fonction a utiliser pour generer les SELECT.
-    *   \param	    param       Date au format text a convertir
-    *   \return	    date        Date au format tms.
-    */
-    function pdate($param)
-    {
-        return "unix_timestamp(".$param.")";
-    }
+	/**
+	 *   \brief      Formatage (par la base de donnees) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS)
+	 *               afin de retourner une donnee toujours au format universel date tms unix.
+	 *               Fonction a utiliser pour generer les SELECT.
+	 *   \param	    param       Date au format text a convertir
+	 *   \return	    date        Date au format tms.
+	 */
+	function pdate($param)
+	{
+		return "unix_timestamp(".$param.")";
+	}
 
 	/**
 	 *   \brief     Convert (by PHP) a GM Timestamp date into a GM string date to insert into a date field.
@@ -683,64 +683,64 @@ class DoliDb
 		return $date;
 	}
 
-    /**
-     *   \brief      Formatage d'un if SQL
-     *   \param		test            chaine test
-     *   \param		resok           resultat si test egal
-     *   \param		resko           resultat si test non egal
-     *   \return		string          chaine formate SQL
-     */
-    function ifsql($test,$resok,$resko)
-    {
-        return 'IF('.$test.','.$resok.','.$resko.')';
-    }
-
-
-    /**
-     *   \brief      Renvoie la derniere requete soumise par la methode query()
-     *   \return	    lastquery
-     */
-    function lastquery()
-    {
-        return $this->lastquery;
-    }
-
-    /**
-     *   \brief      Renvoie la derniere requete en erreur
-     *   \return	    string	lastqueryerror
-     */
+	/**
+	 *   \brief      Formatage d'un if SQL
+	 *   \param		test            chaine test
+	 *   \param		resok           resultat si test egal
+	 *   \param		resko           resultat si test non egal
+	 *   \return		string          chaine formate SQL
+	 */
+	function ifsql($test,$resok,$resko)
+	{
+		return 'IF('.$test.','.$resok.','.$resko.')';
+	}
+
+
+	/**
+	 *   \brief      Renvoie la derniere requete soumise par la methode query()
+	 *   \return	    lastquery
+	 */
+	function lastquery()
+	{
+		return $this->lastquery;
+	}
+
+	/**
+	 *   \brief      Renvoie la derniere requete en erreur
+	 *   \return	    string	lastqueryerror
+	 */
 	function lastqueryerror()
 	{
 		return $this->lastqueryerror;
 	}
 
-    /**
-     * \brief      Renvoie le libelle derniere erreur
-     * \return	    string	lasterror
-     */
+	/**
+	 * \brief      Renvoie le libelle derniere erreur
+	 * \return	    string	lasterror
+	 */
 	function lasterror()
 	{
 		return $this->lasterror;
 	}
 
-    /**
-     * \brief      Renvoie le code derniere erreur
-     * \return	    string	lasterrno
-     */
+	/**
+	 * \brief      Renvoie le code derniere erreur
+	 * \return	    string	lasterrno
+	 */
 	function lasterrno()
 	{
 		return $this->lasterrno;
 	}
 
-    /**
-     * \brief     Renvoie le code erreur generique de l'operation precedente.
-     * \return    error_num       (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...)
-     */
-    function errno()
-    {
-        if (empty($error_regexps))
-        {
-            $error_regexps = array(
+	/**
+	 * \brief     Renvoie le code erreur generique de l'operation precedente.
+	 * \return    error_num       (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...)
+	 */
+	function errno()
+	{
+		if (empty($error_regexps))
+		{
+			$error_regexps = array(
                 '/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/' => 'DB_ERROR_NOSUCHTABLE',
                 '/table [\"\'].*[\"\'] does not exist/' => 'DB_ERROR_NOSUCHTABLE',
                 '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/'      => 'DB_ERROR_RECORD_ALREADY_EXISTS',
@@ -749,38 +749,38 @@ class DoliDb
                 '/ttribute [\"\'].*[\"\'] not found$|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/' => 'DB_ERROR_NOSUCHFIELD',
                 '/parser: parse error at or near \"/'   => 'DB_ERROR_SYNTAX',
                 '/referential integrity violation/'     => 'DB_ERROR_CONSTRAINT'
-            );
-        }
-        foreach ($error_regexps as $regexp => $code) {
-            if (preg_match($regexp, pg_last_error($this->db))) {
-                return $code;
-            }
-        }
-        $errno=pg_last_error($this->db);
-        return ($errno?'DB_ERROR':'0');
-    }
-
-    /**
-     * \brief 		Renvoie le texte de l'erreur pgsql de l'operation precedente.
-     * \return		error_text
-     */
-    function error()
-    {
-        return pg_last_error($this->db);
-    }
-
-    /**
-     * \brief      Recupere l'id genere par le dernier INSERT.
-     * \param     	tab     Nom de la table concernee par l'insert. Ne sert pas sous MySql mais requis pour compatibilite avec Postgresql
-     * \return     int     id
-     */
-    function last_insert_id($tab)
-    {
-        $result = pg_query($this->db,"SELECT MAX(rowid) FROM ".$tab." ;");
-        $nbre = pg_num_rows($result);
-        $row = pg_fetch_result($result,0,0);
-        return $row;
-    }
+                );
+		}
+		foreach ($error_regexps as $regexp => $code) {
+			if (preg_match($regexp, pg_last_error($this->db))) {
+				return $code;
+			}
+		}
+		$errno=pg_last_error($this->db);
+		return ($errno?'DB_ERROR':'0');
+	}
+
+	/**
+	 * \brief 		Renvoie le texte de l'erreur pgsql de l'operation precedente.
+	 * \return		error_text
+	 */
+	function error()
+	{
+		return pg_last_error($this->db);
+	}
+
+	/**
+	 * \brief      Recupere l'id genere par le dernier INSERT.
+	 * \param     	tab     Nom de la table concernee par l'insert. Ne sert pas sous MySql mais requis pour compatibilite avec Postgresql
+	 * \return     int     id
+	 */
+	function last_insert_id($tab)
+	{
+		$result = pg_query($this->db,"SELECT MAX(rowid) FROM ".$tab." ;");
+		$nbre = pg_num_rows($result);
+		$row = pg_fetch_result($result,0,0);
+		return $row;
+	}
 
 	/**
 	 *	\brief          Encrypt sensitive data in database
@@ -816,43 +816,44 @@ class DoliDb
 
 
 	/**
-     * \brief          Renvoie l'id de la connexion
-     * \return	        string      Id connexion
-     */
-    function DDLGetConnectId()
-    {
-        return '?';
-    }
+	 * \brief          Renvoie l'id de la connexion
+	 * \return	        string      Id connexion
+	 */
+	function DDLGetConnectId()
+	{
+		return '?';
+	}
 
 
 
-    /**
+	/**
 	 *	\brief          Create a new database
- 	 *	\param	        database		Database name to create
+	 *	\param	        database		Database name to create
 	 * 	\param			charset			Charset used to store data
 	 * 	\param			collation		Charset used to sort data
+	 * 	\param			owner			Username of database owner
 	 * 	\return	        resource		resource defined if OK, null if KO
 	 *  \remarks        Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated
-     */
-    function DDLCreateDb($database,$charset='',$collation='')
-    {
+	 */
+	function DDLCreateDb($database,$charset='',$collation='',$owner='')
+	{
 		if (empty($charset))   $charset=$this->forcecharset;
 		if (empty($collation)) $collation=$this->collation;
 
-    	$ret=$this->query('CREATE DATABASE '.$database.' OWNER '.$this->db_user.' ENCODING \''.$charset.'\' ;');
-        return $ret;
-    }
-
-    /**
-     * \brief      Liste des tables dans une database.
-     * \param	    database	Nom de la database
-     * \return	    resource
-     */
-    function DDLListTables($database)
-    {
-        $this->results = pg_query($this->db, "SHOW TABLES;");
-        return  $this->results;
-    }
+		$ret=$this->query('CREATE DATABASE '.$database.' OWNER '.$owner.' ENCODING \''.$charset.'\'');
+		return $ret;
+	}
+
+	/**
+	 * \brief      Liste des tables dans une database.
+	 * \param	    database	Nom de la database
+	 * \return	    resource
+	 */
+	function DDLListTables($database)
+	{
+		$this->results = pg_query($this->db, "SHOW TABLES");
+		return  $this->results;
+	}
 
 	/**
 	 *	\brief     	Liste les informations des champs d'une table.
@@ -863,18 +864,18 @@ class DoliDb
 	function DDLInfoTable($table)
 	{
 		/*
-		$infotables=array();
+		 $infotables=array();
 
-		$sql="SHOW FULL COLUMNS FROM ".$table.";";
+		 $sql="SHOW FULL COLUMNS FROM ".$table.";";
 
-		dol_syslog($sql,LOG_DEBUG);
-		$result = $this->pg_query($this->db,$sql);
-		while($row = $this->fetch_row($result))
-		{
+		 dol_syslog($sql,LOG_DEBUG);
+		 $result = $this->pg_query($this->db,$sql);
+		 while($row = $this->fetch_row($result))
+		 {
 			$infotables[] = $row;
-		}
-		return $infotables;
-		*/
+			}
+			return $infotables;
+			*/
 	}
 
 
@@ -958,72 +959,71 @@ class DoliDb
 	 *	\brief		Return charset used to store data in database
 	 *	\return		string		Charset
 	 */
-	function getDefaultCharacterSetDatabase(){
-		 $resql=$this->query('SHOW SERVER_ENCODING');
-	    $liste=$this->fetch_array($resql);
-	    return $liste['server_encoding'];
+	function getDefaultCharacterSetDatabase()
+	{
+		$resql=$this->query('SHOW SERVER_ENCODING');
+		$liste=$this->fetch_array($resql);
+		return $liste['server_encoding'];
 	}
 
 	/**
 	 *	\brief		Return list of available charset that can be used to store data in database
 	 *	\return		array		List of Charset
 	 */
-	function getListOfCharacterSet(){
-		 $resql=$this->query('SHOW CHARSET');
+	function getListOfCharacterSet()
+	{
+		$resql=$this->query('SHOW SERVER_ENCODING');
 		$liste = array();
 		if ($resql)
-			{
+		{
 			$i = 0;
 			while ($obj = $this->fetch_object($resql) )
 			{
-				$liste[$i]['charset'] = $obj->Charset;
-				$liste[$i]['description'] = $obj->Description;
+				$liste[$i]['charset'] = $obj->server_encoding;
+				$liste[$i]['description'] = 'Default database charset';
 				$i++;
 			}
-	    	$this->free($resql);
-	  	} else {
-	  		// version Mysql < 4.1.1
-	   		return null;
-	  	}
-    	return $liste;
+			$this->free($resql);
+		} else {
+			// version Mysql < 4.1.1
+			return null;
+		}
+		return $liste;
 	}
 
 	/**
 	 *	\brief		Return collation used in database
 	 *	\return		string		Collation value
 	 */
-	function getDefaultCollationDatabase(){
-		$resql=$this->query('SHOW VARIABLES LIKE \'collation_database\'');
-		 if (!$resql)
-	      {
-			// version Mysql < 4.1.1
-			return $this->forcecollate;
-	      }
-	    $liste=$this->fetch_array($resql);
-	    return $liste['Value'];
+	function getDefaultCollationDatabase()
+	{
+		$resql=$this->query('SHOW SERVER_ENCODING');
+		$liste=$this->fetch_array($resql);
+		return $liste['lc_collate'];
 	}
 
 	/**
 	 *	\brief		Return list of available collation that can be used for database
 	 *	\return		array		Liste of Collation
 	 */
-	function getListOfCollation(){
-		 $resql=$this->query('SHOW COLLATION');
+	function getListOfCollation()
+	{
+		$resql=$this->query('SHOW LC_COLLATE');
 		$liste = array();
 		if ($resql)
-			{
+		{
 			$i = 0;
 			while ($obj = $this->fetch_object($resql) )
 			{
-				$liste[$i]['collation'] = $obj->Collation;
+				$liste[$i]['collation'] = $obj->lc_collate;
 				$i++;
 			}
-	    	$this->free($resql);
-	  	} else {
-	  		// version Mysql < 4.1.1
-	   		return null;
-	  	}
-    	return $liste;
+			$this->free($resql);
+		} else {
+			// version Mysql < 4.1.1
+			return null;
+		}
+		return $liste;
 	}
 
 }