Now handling of BYTEA (blobs) under PostgreSQL are working properly

(delegating to ADOdb to perform the correct escaping and so on)
This commit is contained in:
stronk7
2007-08-10 16:10:36 +00:00
parent d402153a54
commit 3955fd588a
+27 -22
View File
@@ -1212,26 +1212,26 @@ function set_field_select($table, $newfield, $newvalue, $select, $localcall = fa
$dataobject = new StdClass;
$dataobject->{$newfield} = $newvalue;
// Oracle DIRTY HACK -
// Oracle DIRTY HACK -
if ($CFG->dbfamily == 'oracle') {
oracle_dirty_hack($table, $dataobject); // Convert object to the correct "empty" values for Oracle DB
$newvalue = $dataobject->{$newfield};
}
// End DIRTY HACK
/// Under Oracle and MSSQL we have our own set field process
/// Under Oracle, MSSQL and PostgreSQL we have our own set field process
/// If the field being updated is clob/blob, we use our alternate update here
/// They will be updated later
if (($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql') && !empty($select)) {
if (($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql' || $CFG->dbfamily == 'postgres') && !empty($select)) {
/// Detect lobs
$foundclobs = array();
$foundblobs = array();
db_detect_lobs($table, $dataobject, $foundclobs, $foundblobs);
}
/// Under Oracle and MSSQL, finally, Update all the Clobs and Blobs present in the record
/// Under Oracle, MSSQL and PostgreSQL, finally, update all the Clobs and Blobs present in the record
/// if we know we have some of them in the query
if (($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql') && !empty($select) &&
if (($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql' || $CFG->dbfamily == 'postgres') && !empty($select) &&
(!empty($foundclobs) || !empty($foundblobs))) {
if (!db_update_lobs($table, $select, $foundclobs, $foundblobs)) {
return false; //Some error happened while updating LOBs
@@ -1386,11 +1386,11 @@ function insert_record($table, $dataobject, $returnid=true, $primarykey='id') {
}
/// End DIRTY HACK
/// Under Oracle and MSSQL we have our own insert record process
/// Under Oracle, MSSQL and PostgreSQL we have our own insert record process
/// detect all the clob/blob fields and change their contents to @#CLOB#@ and @#BLOB#@
/// saving them into $foundclobs and $foundblobs [$fieldname]->contents
/// Same for mssql (only processing blobs - image fields)
if ($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql') {
if ($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql' || $CFG->dbfamily == 'postgres') {
$foundclobs = array();
$foundblobs = array();
db_detect_lobs($table, $dataobject, $foundclobs, $foundblobs);
@@ -1425,9 +1425,9 @@ function insert_record($table, $dataobject, $returnid=true, $primarykey='id') {
return false;
}
/// Under Oracle and MSSQL, replace all the '@#CLOB#@' and '@#BLOB#@' ocurrences to proper default values
/// Under Oracle, MSSQL and PostgreSQL, replace all the '@#CLOB#@' and '@#BLOB#@' ocurrences to proper default values
/// if we know we have some of them in the query
if (($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql') &&
if (($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql' || $CFG->dbfamily == 'postgres') &&
(!empty($foundclobs) || !empty($foundblobs))) {
/// Initial configuration, based on DB
switch ($CFG->dbfamily) {
@@ -1436,6 +1436,7 @@ function insert_record($table, $dataobject, $returnid=true, $primarykey='id') {
$blobdefault = 'empty_blob()'; //Value of empty default blobs for this DB
break;
case 'mssql':
case 'postgres':
$clobdefault = 'null'; //Value of empty default clobs for this DB (under mssql this won't be executed
$blobdefault = 'null'; //Value of empty default blobs for this DB
break;
@@ -1454,9 +1455,9 @@ function insert_record($table, $dataobject, $returnid=true, $primarykey='id') {
return false;
}
/// Under Oracle, finally, Update all the Clobs and Blobs present in the record
/// Under Oracle and PostgreSQL, finally, update all the Clobs and Blobs present in the record
/// if we know we have some of them in the query
if ($CFG->dbfamily == 'oracle' &&
if (($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'postgres') &&
!empty($dataobject->{$primarykey}) &&
(!empty($foundclobs) || !empty($foundblobs))) {
if (!db_update_lobs($table, $dataobject->{$primarykey}, $foundclobs, $foundblobs)) {
@@ -1551,11 +1552,11 @@ function update_record($table, $dataobject) {
}
/// End DIRTY HACK
/// Under Oracle and MSSQL we have our own update record process
/// Under Oracle, MSSQL and PostgreSQL we have our own update record process
/// detect all the clob/blob fields and delete them from the record being updated
/// saving them into $foundclobs and $foundblobs [$fieldname]->contents
/// They will be updated later
if (($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql')
if (($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql' || $CFG->dbfamily == 'postgres')
&& !empty($dataobject->id)) {
/// Detect lobs
$foundclobs = array();
@@ -1576,10 +1577,6 @@ function update_record($table, $dataobject) {
foreach ($columns as $column) {
if ($column->name <> 'id' and array_key_exists($column->name, $data)) {
$ddd[$column->name] = $data[$column->name];
// PostgreSQL bytea support
if ($CFG->dbfamily == 'postgres' && $column->type == 'bytea') {
$ddd[$column->name] = $db->BlobEncode($ddd[$column->name]);
}
}
}
@@ -1613,9 +1610,9 @@ function update_record($table, $dataobject) {
}
}
/// Under Oracle AND MSSQL, finally, Update all the Clobs and Blobs present in the record
/// Under Oracle, MSSQL and PostgreSQL, finally, update all the Clobs and Blobs present in the record
/// if we know we have some of them in the query
if (($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql') &&
if (($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql' || $CFG->dbfamily == 'postgres') &&
!empty($dataobject->id) &&
(!empty($foundclobs) || !empty($foundblobs))) {
if (!db_update_lobs($table, $dataobject->id, $foundclobs, $foundblobs)) {
@@ -2207,6 +2204,10 @@ function db_detect_lobs ($table, &$dataobject, &$clobs, &$blobs, $unset = false,
$clobdbtype = 'NOTPROCESSES'; //Name of clobs for this DB (under mssql flavours we don't process CLOBS)
$blobdbtype = 'IMAGE'; //Name of blobs for this DB
break;
case 'postgres':
$clobdbtype = 'NOTPROCESSES'; //Name of clobs for this DB (under postgres flavours we don't process CLOBS)
$blobdbtype = 'BYTEA'; //Name of blobs for this DB
break;
default:
return; //Other DB doesn't need this two step to happen, prevent continue
}
@@ -2242,7 +2243,7 @@ function db_detect_lobs ($table, &$dataobject, &$clobs, &$blobs, $unset = false,
continue;
}
/// If the field is BLOB OR IMAGE, update its value to '@#BLOB#@' and store it in the $blobs array
/// If the field is BLOB OR IMAGE OR BYTEA, update its value to '@#BLOB#@' and store it in the $blobs array
if (strtoupper($columns[strtolower($fieldname)]->type) == $blobdbtype) {
$blobs[$fieldname] = $dataobject->$fieldname;
if ($unset) {
@@ -2286,6 +2287,10 @@ function db_update_lobs ($table, $sqlcondition, &$clobs, &$blobs) {
$clobdbtype = 'NOTPROCESSES'; //Name of clobs for this DB (under mssql flavours we don't process CLOBS)
$blobdbtype = 'IMAGE'; //Name of blobs for this DB
break;
case 'postgres':
$clobdbtype = 'NOTPROCESSES'; //Name of clobs for this DB (under postgres flavours we don't process CLOBS)
$blobdbtype = 'BYTEA'; //Name of blobs for this DB
break;
default:
return; //Other DB doesn't need this two step to happen, prevent continue
}
@@ -2325,8 +2330,8 @@ function db_update_lobs ($table, $sqlcondition, &$clobs, &$blobs) {
if (defined('MDL_PERFDB')) { global $PERF ; $PERF->dbqueries++; }; /// Count the extra updates in PERF
/// Oracle and MSSQL BLOBs doesn't like quoted strings (are inserted via prepared statemets)
if ($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql') {
/// Oracle, MSSQL and PostgreSQL BLOBs doesn't like quoted strings (are inserted via prepared statemets)
if ($CFG->dbfamily == 'oracle' || $CFG->dbfamily == 'mssql' || $CFG->dbfamily == 'postgres') {
$value = stripslashes_safe($value);
}