Re: Client's variables - Mailing list pgsql-general

From Richard Huxton
Subject Re: Client's variables
Date
Msg-id 41F01D47.9080205@archonet.com
Whole thread Raw
In response to Re: Client's variables  (Marek Lewczuk <newsy@lewczuk.com>)
List pgsql-general
Marek Lewczuk wrote:
> fryk napisał(a):
>
>> Hi,
>>
>> How to set such variable after (during?) client connection (PHP)?
>>
>> I want to use it in view - so view could depends on it:
>>
>> If I could set client's variable i.e. MY_VAR='hello' then I could do
>> something like this:
>>
>> CREATE VIEW my_view AS SELECT * FROM pg_tables WHERE tablename ~* (SELECT
>> MY_VAR FROM ???)
>
>
> You have (at least) two choices. First is to use temporary table, where
> you can store anything you wish and it will be visible and available for
> current connection/session.
>
> Read more:
> http://www.postgresql.org/docs/8.0/interactive/sql-createtable.html
>
> Another solution is to use plperl - this is more flexible then the first
> one. plperl supports global values - go to:
> http://www.postgresql.org/docs/8.0/interactive/plperl-global.html
> and see examples set_var and get_var.

Or, in the attached file, I've used pltcl. Again, it uses global
variables to store session data. If you know TCL you may be able to
improve on these functions since I more or less cut and paste these
together.

--
   Richard Huxton
   Archonet Ltd
-- app_session(VARNAME, VALUE)
--    Defines a text variable and sets its value.
--    If you try to set the same VARNAME twice in one session, an error is returned.
--    If VALUE is null, just returns the value.
--
CREATE OR REPLACE FUNCTION app_session(text, text) RETURNS text AS '
    upvar app_sess_vars a
    if {![ argisnull 2 ]} {
        if {[ info exists a($1) ]} {
            elog ERROR "app_session(): Already set var $1 this session"
        }
        set a($1) $2
    }

    return $a($1)
' LANGUAGE pltcl;


-- app_session(VARNAME)
--    Returns the value of VARNAME (if set) or "UNDEFINED"
--    NOTE - this function is marked IMMUTABLE - do not use as a DEFAULT source
--  in a table definition
--
CREATE OR REPLACE FUNCTION app_session(text) RETURNS text AS '
    upvar app_sess_vars a
    if {![ info exists a($1) ]} {
        return "UNDEFINED"
    }

    return $a($1)
' LANGUAGE pltcl IMMUTABLE;

-- app_session_int(VARNAME)
--    Returns the value of VARNAME (if set) or 0
--    NOTE - this function is marked IMMUTABLE - do not use as a DEFAULT source
--  in a table definition
--
CREATE OR REPLACE FUNCTION app_session_int(text) RETURNS int4 AS '
    upvar app_sess_vars a
    if {![ info exists a($1) ]} {
        return 0
    }

    return $a($1)
' LANGUAGE pltcl IMMUTABLE;

pgsql-general by date:

Previous
From: Tino Wildenhain
Date:
Subject: Re: Unique Index
Next
From: Ian Barwick
Date:
Subject: Re: How to manually insert an UTF-8 character into an SQL statement?