fix schema updates with oracle\n basically this took me all day to debug and hack, we need a new db layer! MDB2 is dead and pecl oci8 even more so! It has officially been deprecated in php 5.4: http://www.php.net/manual/de/function.ocifetchinto.php

This commit is contained in:
Jörn Friedrich Dreyer 2012-09-12 23:01:06 +02:00
parent b2d60ed6b7
commit 53b0e6dcc1
2 changed files with 79 additions and 22 deletions

View File

@ -84,12 +84,12 @@ class MDB2_Driver_Reverse_oci8 extends MDB2_Driver_Reverse_Common
$owner = $db->dsn['username']; $owner = $db->dsn['username'];
} }
$query = 'SELECT column_name name, $query = 'SELECT column_name AS "name",
data_type "type", data_type AS "type",
nullable, nullable AS "nullable",
data_default "default", data_default AS "default",
COALESCE(data_precision, data_length) "length", COALESCE(data_precision, data_length) AS "length",
data_scale "scale" data_scale AS "scale"
FROM all_tab_columns FROM all_tab_columns
WHERE (table_name=? OR table_name=?) WHERE (table_name=? OR table_name=?)
AND (owner=? OR owner=?) AND (owner=? OR owner=?)
@ -146,6 +146,10 @@ class MDB2_Driver_Reverse_oci8 extends MDB2_Driver_Reverse_Common
if ($default === 'NULL') { if ($default === 'NULL') {
$default = null; $default = null;
} }
//ugly hack, but works for the reverse direction
if ($default == "''") {
$default = '';
}
if ((null === $default) && $notnull) { if ((null === $default) && $notnull) {
$default = ''; $default = '';
} }
@ -221,11 +225,11 @@ class MDB2_Driver_Reverse_oci8 extends MDB2_Driver_Reverse_Common
$owner = $db->dsn['username']; $owner = $db->dsn['username'];
} }
$query = "SELECT aic.column_name, $query = 'SELECT aic.column_name AS "column_name",
aic.column_position, aic.column_position AS "column_position",
aic.descend, aic.descend AS "descend",
aic.table_owner, aic.table_owner AS "table_owner",
alc.constraint_type alc.constraint_type AS "constraint_type"
FROM all_ind_columns aic FROM all_ind_columns aic
LEFT JOIN all_constraints alc LEFT JOIN all_constraints alc
ON aic.index_name = alc.constraint_name ON aic.index_name = alc.constraint_name
@ -234,7 +238,7 @@ class MDB2_Driver_Reverse_oci8 extends MDB2_Driver_Reverse_Common
WHERE (aic.table_name=? OR aic.table_name=?) WHERE (aic.table_name=? OR aic.table_name=?)
AND (aic.index_name=? OR aic.index_name=?) AND (aic.index_name=? OR aic.index_name=?)
AND (aic.table_owner=? OR aic.table_owner=?) AND (aic.table_owner=? OR aic.table_owner=?)
ORDER BY column_position"; ORDER BY column_position';
$stmt = $db->prepare($query); $stmt = $db->prepare($query);
if (PEAR::isError($stmt)) { if (PEAR::isError($stmt)) {
return $stmt; return $stmt;
@ -331,9 +335,9 @@ class MDB2_Driver_Reverse_oci8 extends MDB2_Driver_Reverse_Common
\'SIMPLE\' "match", \'SIMPLE\' "match",
CASE alc.deferrable WHEN \'NOT DEFERRABLE\' THEN 0 ELSE 1 END "deferrable", CASE alc.deferrable WHEN \'NOT DEFERRABLE\' THEN 0 ELSE 1 END "deferrable",
CASE alc.deferred WHEN \'IMMEDIATE\' THEN 0 ELSE 1 END "initiallydeferred", CASE alc.deferred WHEN \'IMMEDIATE\' THEN 0 ELSE 1 END "initiallydeferred",
alc.search_condition, alc.search_condition AS "search_condition",
alc.table_name, alc.table_name,
cols.column_name, cols.column_name AS "column_name",
cols.position, cols.position,
r_alc.table_name "references_table", r_alc.table_name "references_table",
r_cols.column_name "references_field", r_cols.column_name "references_field",
@ -509,14 +513,14 @@ class MDB2_Driver_Reverse_oci8 extends MDB2_Driver_Reverse_Common
return $db; return $db;
} }
$query = 'SELECT trigger_name, $query = 'SELECT trigger_name AS "trigger_name",
table_name, table_name AS "table_name",
trigger_body, trigger_body AS "trigger_body",
trigger_type, trigger_type AS "trigger_type",
triggering_event trigger_event, triggering_event AS "trigger_event",
description trigger_comment, description AS "trigger_comment",
1 trigger_enabled, 1 AS "trigger_enabled",
when_clause when_clause AS "when_clause"
FROM user_triggers FROM user_triggers
WHERE trigger_name = \''. strtoupper($trigger).'\''; WHERE trigger_name = \''. strtoupper($trigger).'\'';
$types = array( $types = array(

View File

@ -634,6 +634,59 @@ class MDB2_Driver_oci8 extends MDB2_Driver_Common
return $query; return $query;
} }
/**
* Obtain DBMS specific SQL code portion needed to declare a generic type
* field to be used in statement like CREATE TABLE, without the field name
* and type values (ie. just the character set, default value, if the
* field is permitted to be NULL or not, and the collation options).
*
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* default
* Text value to be used as default for this field.
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
* charset
* Text value with the default CHARACTER SET for this field.
* collation
* Text value with the default COLLATION for this field.
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field's options.
* @access protected
*/
function _getDeclarationOptions($field)
{
$charset = empty($field['charset']) ? '' :
' '.$this->_getCharsetFieldDeclaration($field['charset']);
$notnull = empty($field['notnull']) ? ' NULL' : ' NOT NULL';
$default = '';
if (array_key_exists('default', $field)) {
if ($field['default'] === '') {
$db = $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
$valid_default_values = $this->getValidTypes();
$field['default'] = $valid_default_values[$field['type']];
if ($field['default'] === '' && ($db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)) {
$field['default'] = ' ';
}
}
if (null !== $field['default']) {
$default = ' DEFAULT ' . $this->quote($field['default'], $field['type']);
}
}
$collation = empty($field['collation']) ? '' :
' '.$this->_getCollationFieldDeclaration($field['collation']);
return $charset.$default.$notnull.$collation;
}
// }}} // }}}
// {{{ _doQuery() // {{{ _doQuery()