diff options
author | Robert Treat | 2014-02-22 18:45:37 +0000 |
---|---|---|
committer | Robert Treat | 2014-03-02 04:51:55 +0000 |
commit | 738651a4a9aca7b61b5ca7057ebb22b6657ff717 (patch) | |
tree | 37933fa79404af6a410a5c243d294bda16c6e8a9 | |
parent | 3e1604e7bf337911bc7646724a9a82b9effc61c7 (diff) |
Improve support for handling IN / named params in functions
Based on work by Bert Thomas <[email protected]>
-rwxr-xr-x | classes/database/Postgres.php | 9 | ||||
-rw-r--r-- | classes/database/Postgres83.php | 33 | ||||
-rw-r--r-- | functions.php | 32 |
3 files changed, 70 insertions, 4 deletions
diff --git a/classes/database/Postgres.php b/classes/database/Postgres.php index 4ab71646..1d72db0e 100755 --- a/classes/database/Postgres.php +++ b/classes/database/Postgres.php @@ -4112,14 +4112,19 @@ class Postgres extends ADODB_base { $sql = " SELECT - pc.oid AS prooid, proname, pg_catalog.pg_get_userbyid(proowner) AS proowner, + pc.oid AS prooid, proname, + pg_catalog.pg_get_userbyid(proowner) AS proowner, nspname as proschema, lanname as prolanguage, procost, prorows, pg_catalog.format_type(prorettype, NULL) as proresult, prosrc, probin, proretset, proisstrict, provolatile, prosecdef, pg_catalog.oidvectortypes(pc.proargtypes) AS proarguments, proargnames AS proargnames, pg_catalog.obj_description(pc.oid, 'pg_proc') AS procomment, - proconfig + proconfig, + (select array_agg( (select typname from pg_type pt + where pt.oid = p.oid) ) from unnest(proallargtypes) p) + AS proallarguments, + proargmodes FROM pg_catalog.pg_proc pc, pg_catalog.pg_language pl, pg_catalog.pg_namespace pn diff --git a/classes/database/Postgres83.php b/classes/database/Postgres83.php index 3ac4f789..ce0416b9 100644 --- a/classes/database/Postgres83.php +++ b/classes/database/Postgres83.php @@ -322,6 +322,39 @@ class Postgres83 extends Postgres84 { return 0; } + // Function functions + + /** + * Returns all details for a particular function + * @param $func The name of the function to retrieve + * @return Function info + */ + function getFunction($function_oid) { + $this->clean($function_oid); + + $sql = " + SELECT + pc.oid AS prooid, proname, pg_catalog.pg_get_userbyid(proowner) AS proowner, + nspname as proschema, lanname as prolanguage, procost, prorows, + pg_catalog.format_type(prorettype, NULL) as proresult, prosrc, + probin, proretset, proisstrict, provolatile, prosecdef, + pg_catalog.oidvectortypes(pc.proargtypes) AS proarguments, + proargnames AS proargnames, + pg_catalog.obj_description(pc.oid, 'pg_proc') AS procomment, + proconfig + FROM + pg_catalog.pg_proc pc, pg_catalog.pg_language pl, + pg_catalog.pg_namespace pn + WHERE + pc.oid = '{$function_oid}'::oid AND pc.prolang = pl.oid + AND pc.pronamespace = pn.oid + "; + + return $this->selectSet($sql); + } + + + // Capabilities function hasQueryKill() { return false; } function hasDatabaseCollation() { return false; } function hasAlterSequenceStart() { return false; } diff --git a/functions.php b/functions.php index 5aa853c7..e7517f12 100644 --- a/functions.php +++ b/functions.php @@ -83,12 +83,26 @@ // Deal with named parameters if ($data->hasNamedParams()) { - $args_arr = explode(', ', $fndata->fields['proarguments']); + if ( isset($fndata->fields['proallarguments']) ) { + $args_arr = $data->phpArray($fndata->fields['proallarguments']); + } else { + $args_arr = explode(', ', $fndata->fields['proarguments']); + } $names_arr = $data->phpArray($fndata->fields['proargnames']); + $modes_arr = $data->phpArray($fndata->fields['proargmodes']); $args = ''; $i = 0; for ($i = 0; $i < sizeof($args_arr); $i++) { if ($i != 0) $args .= ', '; + if (isset($modes_arr[$i])) { + switch($modes_arr[$i]) { + case 'i' : $args .= " IN "; break; + case 'o' : $args .= " OUT "; break; + case 'b' : $args .= " INOUT "; break; + case 'v' : $args .= " VARIADIC "; break; + case 't' : $args .= " TABLE "; break; + } + } if (isset($names_arr[$i]) && $names_arr[$i] != '') { $data->fieldClean($names_arr[$i]); $args .= '"' . $names_arr[$i] . '" '; @@ -241,12 +255,26 @@ if ($funcdata->recordCount() > 0) { // Deal with named parameters if ($data->hasNamedParams()) { - $args_arr = explode(', ', $funcdata->fields['proarguments']); + if ( isset($funcdata->fields['proallarguments']) ) { + $args_arr = $data->phpArray($funcdata->fields['proallarguments']); + } else { + $args_arr = explode(', ', $funcdata->fields['proarguments']); + } $names_arr = $data->phpArray($funcdata->fields['proargnames']); + $modes_arr = $data->phpArray($funcdata->fields['proargmodes']); $args = ''; $i = 0; for ($i = 0; $i < sizeof($args_arr); $i++) { if ($i != 0) $args .= ', '; + if (isset($modes_arr[$i])) { + switch($modes_arr[$i]) { + case 'i' : $args .= " IN "; break; + case 'o' : $args .= " OUT "; break; + case 'b' : $args .= " INOUT "; break; + case 'v' : $args .= " VARIADIC "; break; + case 't' : $args .= " TABLE "; break; + } + } if (isset($names_arr[$i]) && $names_arr[$i] != '') { $data->fieldClean($names_arr[$i]); $args .= '"' . $names_arr[$i] . '" '; |