Source for file postgresql.php
Documentation is available at postgresql.php
* @package Joomla.Platform
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
* PostgreSQL import driver.
* @package Joomla.Platform
* Checks if all data and options are in order prior to exporting.
* @return JDatabaseImporterPostgresql Method supports chaining.
* @throws Exception if an error is encountered.
// Check if the db connector has been set.
throw
new Exception('JPLATFORM_ERROR_DATABASE_CONNECTOR_WRONG_TYPE');
// Check if the tables have been specified.
throw
new Exception('JPLATFORM_ERROR_NO_TABLES_SPECIFIED');
* Get the SQL syntax to add a column.
* @param string $table The table name.
* @param SimpleXMLElement $field The XML field definition.
return 'ALTER TABLE ' .
$this->db->quoteName($table) .
' ADD COLUMN ' .
$this->getColumnSQL($field);
* Get the SQL syntax to add an index.
* @param SimpleXMLElement $field The XML index definition.
return (string)
$field['Query'];
* Get alters for table if there is a difference.
* @param SimpleXMLElement $structure The XML structure of the table.
$oldFields =
$this->db->getTableColumns($table);
$oldKeys =
$this->db->getTableKeys($table);
$oldSequence =
$this->db->getTableSequences($table);
// Get the fields and keys from the XML that we are aiming for.
$newFields =
$structure->xpath('field');
$newKeys =
$structure->xpath('key');
$newSequence =
$structure->xpath('sequence');
foreach ($newSequenceLook as $kSeqName =>
$vSeq)
if (isset
($oldSeq[$kSeqName]))
// The field exists, check it's the same.
$column =
$oldSeq[$kSeqName][0];
/* For older database version that doesn't support these fields use default values */
$column->Min_Value =
'1';
$column->Max_Value =
'9223372036854775807';
$column->Increment =
'1';
$column->Cycle_option =
'NO';
$column->Start_Value =
'1';
// Test whether there is a change.
$change =
((string)
$vSeq[0]['Type'] !=
$column->Type) ||
((string)
$vSeq[0]['Start_Value'] !=
$column->Start_Value)
||
((string)
$vSeq[0]['Min_Value'] !=
$column->Min_Value) ||
((string)
$vSeq[0]['Max_Value'] !=
$column->Max_Value)
||
((string)
$vSeq[0]['Increment'] !=
$column->Increment) ||
((string)
$vSeq[0]['Cycle_option'] !=
$column->Cycle_option)
||
((string)
$vSeq[0]['Table'] !=
$column->Table) ||
((string)
$vSeq[0]['Column'] !=
$column->Column)
||
((string)
$vSeq[0]['Schema'] !=
$column->Schema) ||
((string)
$vSeq[0]['Name'] !=
$column->Name);
// Unset this field so that what we have left are fields that need to be removed.
unset
($oldSeq[$kSeqName]);
// Any sequences left are orphans
foreach ($oldSeq as $name =>
$column)
// Loop through each field in the new structure.
foreach ($newFields as $field)
$fName = (string)
$field['Field'];
if (isset
($oldFields[$fName]))
// The field exists, check it's the same.
$column =
$oldFields[$fName];
// Test whether there is a change.
$change =
((string)
$field['Type'] !=
$column->Type) ||
((string)
$field['Null'] !=
$column->Null)
||
((string)
$field['Default'] !=
$column->Default);
// Unset this field so that what we have left are fields that need to be removed.
unset
($oldFields[$fName]);
// Any columns left are orphans
foreach ($oldFields as $name =>
$column)
// Get the lookups for the old and new keys
// Loop through each key in the new structure.
foreach ($newLookup as $name =>
$keys)
// Check if there are keys on this field in the existing table.
if (isset
($oldLookup[$name]))
$newCount =
count($newLookup[$name]);
$oldCount =
count($oldLookup[$name]);
// There is a key on this field in the old and new tables. Are they the same?
if ($newCount ==
$oldCount)
for ($i =
0; $i <
$newCount; $i++
)
// Check only query field -> different query means different index
$same =
((string)
$newLookup[$name][$i]['Query'] ==
$oldLookup[$name][$i]->Query);
// Break out of the loop. No need to check further.
// Count is different, just drop and add.
$alters[] = (string)
$newLookup[$name][0]['Query'];
// Unset this field so that what we have left are fields that need to be removed.
unset
($oldLookup[$name]);
$alters[] = (string)
$newLookup[$name][0]['Query'];
// Any keys left are orphans.
foreach ($oldLookup as $name =>
$keys)
if ($oldLookup[$name][0]->is_primary ==
'TRUE')
* Get the SQL syntax to drop a sequence.
* @param string $name The name of the sequence to drop.
return 'DROP SEQUENCE ' .
$this->db->quoteName($name);
* Get the syntax to add a sequence.
* @param SimpleXMLElement $field The XML definition for the sequence.
/* For older database version that doesn't support these fields use default values */
$field['Min_Value'] =
'1';
$field['Max_Value'] =
'9223372036854775807';
$field['Increment'] =
'1';
$field['Cycle_option'] =
'NO';
$field['Start_Value'] =
'1';
return 'CREATE SEQUENCE ' . (string)
$field['Name'] .
' INCREMENT BY ' . (string)
$field['Increment'] .
' MINVALUE ' .
$field['Min_Value'] .
' MAXVALUE ' . (string)
$field['Max_Value'] .
' START ' . (string)
$field['Start_Value'] .
(((string)
$field['Cycle_option'] ==
'NO') ?
' NO' :
'') .
' CYCLE' .
' OWNED BY ' .
$this->db->quoteName((string)
$field['Schema'] .
'.' . (string)
$field['Table'] .
'.' . (string)
$field['Column']);
* Get the syntax to alter a sequence.
* @param SimpleXMLElement $field The XML definition for the sequence.
/* For older database version that doesn't support these fields use default values */
$field['Min_Value'] =
'1';
$field['Max_Value'] =
'9223372036854775807';
$field['Increment'] =
'1';
$field['Cycle_option'] =
'NO';
$field['Start_Value'] =
'1';
return 'ALTER SEQUENCE ' . (string)
$field['Name'] .
' INCREMENT BY ' . (string)
$field['Increment'] .
' MINVALUE ' . (string)
$field['Min_Value'] .
' MAXVALUE ' . (string)
$field['Max_Value'] .
' START ' . (string)
$field['Start_Value'] .
' OWNED BY ' .
$this->db->quoteName((string)
$field['Schema'] .
'.' . (string)
$field['Table'] .
'.' . (string)
$field['Column']);
* Get the syntax to alter a column.
* @param string $table The name of the database table to alter.
* @param SimpleXMLElement $field The XML definition for the field.
return 'ALTER TABLE ' .
$this->db->quoteName($table) .
' ALTER COLUMN ' .
$this->db->quoteName((string)
$field['Field']) .
' '
* Get the SQL syntax for a single column that would be included in a table create statement.
* @param string $table The name of the database table to alter.
* @param SimpleXMLElement $field The XML field definition.
// TODO Incorporate into parent class and use $this.
$blobs =
array('text', 'smalltext', 'mediumtext', 'largetext');
$fName = (string)
$field['Field'];
$fType = (string)
$field['Type'];
$fNull = (string)
$field['Null'];
$fDefault =
(isset
($field['Default']) &&
$field['Default'] !=
'NULL' ) ?
preg_match('/^[0-9]$/', $field['Default']) ?
$field['Default'] :
$this->db->quote((string)
$field['Default'])
$query =
' TYPE ' .
$fType;
if (in_array($fType, $blobs) ||
$fDefault ===
null)
$query .=
",\nALTER COLUMN " .
$this->db->quoteName($fName) .
' SET NOT NULL' .
",\nALTER COLUMN " .
$this->db->quoteName($fName) .
' DROP DEFAULT';
$query .=
",\nALTER COLUMN " .
$this->db->quoteName($fName) .
' SET NOT NULL' .
",\nALTER COLUMN " .
$this->db->quoteName($fName) .
' SET DEFAULT ' .
$fDefault;
$query .=
",\nALTER COLUMN " .
$this->db->quoteName($fName) .
' DROP NOT NULL' .
",\nALTER COLUMN " .
$this->db->quoteName($fName) .
' SET DEFAULT ' .
$fDefault;
/* sequence was created in other function, here is associated a default value but not yet owner */
if (strpos($fDefault, 'nextval') !==
false)
$query .=
";\nALTER SEQUENCE " .
$this->db->quoteName($table .
'_' .
$fName .
'_seq') .
' OWNED BY ' .
$this->db->quoteName($table .
'.' .
$fName);
* Get the SQL syntax for a single column that would be included in a table create statement.
* @param SimpleXMLElement $field The XML field definition.
// TODO Incorporate into parent class and use $this.
$blobs =
array('text', 'smalltext', 'mediumtext', 'largetext');
$fName = (string)
$field['Field'];
$fType = (string)
$field['Type'];
$fNull = (string)
$field['Null'];
$fDefault =
(isset
($field['Default']) &&
$field['Default'] !=
'NULL' ) ?
preg_match('/^[0-9]$/', $field['Default']) ?
$field['Default'] :
$this->db->quote((string)
$field['Default'])
/* nextval() as default value means that type field is serial */
if (strpos($fDefault, 'nextval') !==
false)
$query =
$this->db->quoteName($fName) .
' SERIAL';
$query =
$this->db->quoteName($fName) .
' ' .
$fType;
if (in_array($fType, $blobs) ||
$fDefault ===
null)
$query .=
' NOT NULL DEFAULT ' .
$fDefault;
$query .=
' DEFAULT ' .
$fDefault;
* Get the SQL syntax to drop an index.
* @param string $name The name of the key to drop.
return 'DROP INDEX ' .
$this->db->quoteName($name);
* Get the SQL syntax to drop a key.
* @param string $table The table name.
* @param string $name The constraint name.
return 'ALTER TABLE ONLY ' .
$this->db->quoteName($table) .
' DROP CONSTRAINT ' .
$this->db->quoteName($name);
* Get the details list of keys for a table.
* @param array $keys An array of objects that comprise the keys for the table.
* @return array The lookup array. array({key name} => array(object, ...))
// First pass, create a lookup of the keys.
if ($key instanceof
SimpleXMLElement)
$kName = (string)
$key['Index'];
if (empty($lookup[$kName]))
$lookup[$kName] =
array();
$lookup[$kName][] =
$key;
* Get the details list of sequences for a table.
* @param array $sequences An array of objects that comprise the sequences for the table.
* @return array The lookup array. array({key name} => array(object, ...))
// First pass, create a lookup of the keys.
foreach ($sequences as $seq)
if ($seq instanceof
SimpleXMLElement)
$sName = (string)
$seq['Name'];
if (empty($lookup[$sName]))
$lookup[$sName] =
array();
$lookup[$sName][] =
$seq;
Documentation generated on Tue, 19 Nov 2013 15:11:12 +0100 by phpDocumentor 1.4.3