Add creationTable function for MySQL, SQLite and PostgreSQL

git-svn-id: https://svn.fournier38.fr/svn/ProgSVN/trunk@1437 bf3deb0d-5f1a-0410-827f-c0cc1f45334c
This commit is contained in:
2014-06-11 14:50:16 +00:00
parent 87b4c843ef
commit a1122a716c

View File

@@ -445,6 +445,194 @@ class dblayer extends PDO
return $arr;
}
/** Create the table defined by the differents fields.
Define the SQL syntax based on SQL engines */
public function createTable ($table, $fields, $primary, $unique)
{
if ($this->db === null)
throw new Exception ("Database not connected");
switch ($this->db->getAttribute(PDO::ATTR_DRIVER_NAME))
{
case "sqlite":
$sql = "CREATE TABLE `table` (\n";
$i = 0;
foreach ($fields as $field=>$params)
{
if ($i > 0)
$sql .= ",\n";
// Name of field
$sql .= "`$field` ";
// Type of field : in $params[0]
if (!isset ($params[0]))
throw new Exception (_("No database type defined for field"));
switch ($params[0])
{
case "integer":
$sql .= "INTEGER";
$params = array_slice ($params, 1);
break;
case "varchar":
if (!isset ($params[1]))
throw new Exception (_("No Size provided for varchar field"));
$sql .= "VARCHAR(".$params[1].")";
$params = array_slice ($params, 2);
break;
case "datetime":
$sql .= "DATETIME";
$params = array_slice ($params, 1);
break;
default:
throw new Exception (_("Unknown type provided for field"));
}
// Primary key
if ($primary === $field)
$sql .= " PRIMARY KEY";
// Others parameters for field
// Sort to put the autoincrement field in front of params, if it is
// present
sort ($params);
foreach ($params as $p)
{
switch ($p)
{
case "not null": $sql .= " NOT NULL"; break;
case "autoincrement": $sql .= " AUTOINCREMENT";break;
default:
throw new Exception (_("Unknown additionnal parameter for field"),
500);
}
}
$i ++;
}
break;
case "mysql":
$sql = "CREATE TABLE `table` (\n";
$i = 0;
foreach ($fields as $field=>$params)
{
if ($i > 0)
$sql .= ",\n";
// Name of field
$sql .= "`$field` ";
// Type of field : in $params[0]
if (!isset ($params[0]))
throw new Exception (_("No database type defined for field"));
switch ($params[0])
{
case "integer":
$sql .= "INTEGER";
$params = array_slice ($params, 1);
break;
case "varchar":
if (!isset ($params[1]))
throw new Exception (_("No Size provided for varchar field"));
$sql .= "VARCHAR(".$params[1].")";
$params = array_slice ($params, 2);
break;
case "datetime":
$sql .= "DATETIME";
$params = array_slice ($params, 1);
break;
default:
throw new Exception (_("Unknown type provided for field"));
}
// Primary key
if ($primary === $field)
$sql .= " PRIMARY KEY";
// Others parameters for field
// Sort to put the autoincrement field in front of params, if it is
// present
sort ($params);
foreach ($params as $p)
{
switch ($p)
{
case "not null": $sql .= " NOT NULL"; break;
case "autoincrement": $sql .= " AUTO_INCREMENT";break;
default:
throw new Exception (_("Unknown additionnal parameter for field"),
500);
}
}
$i ++;
}
break;
case "pgsql":
$sql = "CREATE TABLE \"table\" (\n";
$i = 0;
foreach ($fields as $field=>$params)
{
if ($i > 0)
$sql .= ",\n";
// Name of field
$sql .= "\"$field\" ";
if (in_array ("autoincrement", $params))
$sql .= "SERIAL";
else
{
// Type of field : in $params[0]
if (!isset ($params[0]))
throw new Exception (_("No database type defined for field"));
switch ($params[0])
{
case "integer":
$sql .= "INTEGER";
$params = array_slice ($params, 1);
break;
case "varchar":
if (!isset ($params[1]))
throw new Exception (_("No Size provided for varchar field"));
$sql .= "VARCHAR(".$params[1].")";
$params = array_slice ($params, 2);
break;
case "datetime":
$sql .= "timestamp with time zone";
$params = array_slice ($params, 1);
break;
default:
throw new Exception (_("Unknown type provided for field"));
}
// Primary key
if ($primary === $field)
$sql .= " PRIMARY KEY";
// Others parameters for field
// Sort to put the autoincrement field in front of params, if it is
// present
sort ($params);
foreach ($params as $p)
{
switch ($p)
{
case "not null": $sql .= " NOT NULL"; break;
default:
throw new Exception (_("Unknown additionnal parameter for field"),
500);
}
}
}
$i ++;
}
break;
default:
throw new Exception (_("PDO Engine not supported in dbLayer", 500));
}
// Unique fields
if ($unique !== null)
{
foreach ($unique as $u)
{
$sql .= ",\n UNIQUE (";
if (is_array ($u))
$sql .=implode (",", $u);
else
$sql .= $u;
$sql .=")";
}
}
$sql .=")";
echo "$sql\n";
}
}