Re: database session variables

From: "Mark Wilson" <mark(at)mediasculpt(dot)com>
To: <pgsql-general(at)postgresql(dot)org>
Subject: Re: database session variables
Date: 2002-10-03 00:01:46
Message-ID: 00b301c26a70$13cfebb0$3301a8c0@merl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Mike, Thanks heaps for your help here. I'll try that (although I'm a bit of
a freebsd/c newbie).

My system didn't have postgres.h, so I'm using postgres_fe.h instead. In
addition, I don't have fmgr.h. I downloaded version 1.18 of it from
http://developer.postgresql.org/cvsweb.cgi/pgsql-server/src/include/fmgr.h?s
ortby=date&only_with_tag=REL7_2_STABLE, but the first gcc line produced a
number of compiler errors and warnings, starting with:
fmgr.h:30: syntax error before `*'
fmgr.h:30: `Datum' declared as function returning a function

line 30 of fmgr.h is
typedef Datum (*PGFunction) (FunctionCallInfo fcinfo);

Do you know what is causing this? (gcc version:gcc-2.95.3)

Thanks in advance,
Mark

----- Original Message -----
From: "Mike Mascari" <mascarm(at)mascari(dot)com>
To: "Mark Wilson" <mark(at)mediasculpt(dot)com>
Cc: <pgsql-general(at)postgresql(dot)org>
Sent: Thursday, October 03, 2002 10:46 AM
Subject: Re: [GENERAL] database session variables

> Mark Wilson wrote:
> > Ok,
> >
> > Perhaps I'd better explain a bit more about what I am wanting to do with
the
> > session variables.
> >
> > I want to create a separation layer between business logic and
application
> > logic, by putting business logic in the database. To do this, all
> > application layer access will be limited to views and stored procedures.
In
> > addition, I want each database connection to be selected from a common
pool
> > (e.g., all user 'web_user'). So every database connection will be made
by
> > user 'web_user'.
>
> Again, server-side C will allow you to do what you want. You'd
> actually be setting an environmental variable in the backend and
> referencing it later...
>
> C Source:
> ---------
>
> #include "postgres.h"
> #include "fmgr.h"
>
> /* Routine to set the session id. Might want to change to
> actually authenticate the user here with a password parameter */
>
> PG_FUNCTION_INFO_V1(setwebuser);
>
> Datum setwebuser(PG_FUNCTION_ARGS) {
>
> char *buffer;
> int len;
>
> text *t = (text *) PG_GETARG_TEXT_P(0);
> len = VARSIZE(t) - VARHDRSZ;
> buffer = (char *) malloc(len + 1);
> memcpy(buffer, VARDATA(t), len);
> buffer[len] = 0;
>
> if (setenv("WEBUSER", buffer, 1) != 0) {
> free(buffer);
> elog(ERROR, "Unable to set session id");
> }
> free(buffer);
>
> PG_RETURN_INT32(1);
>
> };
>
> /* Routine to get the session webuser id */
>
> PG_FUNCTION_INFO_V1(getwebuser);
>
> Datum getwebuser(PG_FUNCTION_ARGS) {
>
> text *t;
> char *result;
> int len;
>
> result = getenv("WEBUSER");
> if (result == NULL) {
> elog(ERROR, "Session id not set");
> }
>
> len = strlen(result) + VARHDRSZ;
> t = (text *) palloc(len);
> VARATT_SIZEP(t) = len;
> memcpy(VARDATA(t), result, len - VARHDRSZ);
>
> PG_RETURN_TEXT_P(t);
>
> }
>
> Compile:
> -------
> gcc -c test.c -I/usr/include/pgsql/server
> gcc -shared -o test.so test.o
>
> Create the functions:
> --------------------
>
> CREATE OR REPLACE FUNCTION setwebuser(text) RETURNS int4
> AS '/tmp/test.so'
> LANGUAGE 'C' WITH (isStrict);
>
> CREATE OR REPLACE FUNCTION getwebuser() RETURNS text
> AS '/tmp/test.so'
> LANGUAGE 'C' WITH (isStrict);
>
> Example:
> -------
>
> create table salaries (
> key integer not null,
> salary float8 not null,
> owner text not null
> );
>
> create view v_salaries as
> select * from salaries where owner = getwebuser();
>
> insert into salaries values (1, 10000, 'Mike');
> insert into salaries values (2, 20000, 'Joe');
>
> select setwebuser('Mike');
>
> test=# select * from v_salaries;
> key | salary | owner
> -----+--------+-------
> 1 | 10000 | Mike
>
>
> HTH,
>
> Mike Mascari
> mascarm(at)mascari(dot)com
>
>
>
>
>
>

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Rod Taylor 2002-10-03 00:14:00 Re: [HACKERS] Anyone want to assist with the translation of the
Previous Message Michael Paesold 2002-10-02 23:36:30 Re: [HACKERS] Anyone want to assist with the translation of the Advocacy site?