summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Treat2014-02-22 18:45:37 +0000
committerRobert Treat2014-03-02 04:51:55 +0000
commit738651a4a9aca7b61b5ca7057ebb22b6657ff717 (patch)
tree37933fa79404af6a410a5c243d294bda16c6e8a9
parent3e1604e7bf337911bc7646724a9a82b9effc61c7 (diff)
Improve support for handling IN / named params in functions
Based on work by Bert Thomas <[email protected]>
-rwxr-xr-xclasses/database/Postgres.php9
-rw-r--r--classes/database/Postgres83.php33
-rw-r--r--functions.php32
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] . '" ';