getting a list of users

Started by Eric Smithalmost 17 years ago21 messagesgeneral
Jump to latest
#1Eric Smith
eric_h_smith@mac.com

All,

How do I get a list of database usernames using the postgres C API?

Thanks,
Eric

#2Eric Smith
eric_h_smith@mac.com
In reply to: Eric Smith (#1)
Re: getting a list of users

Never mind, everyone. I figured it out.

On May 7, 2009, at 8:05 PM, Eric Smith wrote:

Show quoted text

All,

How do I get a list of database usernames using the postgres C API?

Thanks,
Eric

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#3Laurenz Albe
laurenz.albe@cybertec.at
In reply to: Eric Smith (#1)
Re: getting a list of users

Eric Smith wrote:

How do I get a list of database usernames using the postgres C API?

Execute this query:

SELECT usename FROM pg_catalog.pg_user

and read the results.

Yours,
Laurenz Albe

#4Eric Smith
eric_h_smith@mac.com
In reply to: Laurenz Albe (#3)
Re: getting a list of users

All,

When I try the command below, I get the very familiar error: "expected
just one rule action"

I'm running 8.3.5 on Mac OS 10.5.6.

Any ideas?

Thanks,
Eric

On May 7, 2009, at 11:24 PM, Albe Laurenz wrote:

Show quoted text

Eric Smith wrote:

How do I get a list of database usernames using the postgres C API?

Execute this query:

SELECT usename FROM pg_catalog.pg_user

and read the results.

Yours,
Laurenz Albe

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Eric Smith (#4)
Re: getting a list of users

Eric Smith <eric_h_smith@mac.com> writes:

When I try the command below, I get the very familiar error: "expected
just one rule action"

You mean this?

regression=# SELECT usename FROM pg_catalog.pg_user;
usename
----------
postgres
(1 row)

If you're getting that sort of error from standard views then there is
something exceedingly broken about your Postgres build. We have
occasionally heard from people who got similar errors after installing
nonstandard hacks that modify the representation of query trees ...
so is this a completely vanilla build? Where did you get it from?

regards, tom lane

#6Eric Smith
eric_h_smith@mac.com
In reply to: Tom Lane (#5)
Re: getting a list of users

Yep, using that command gives me the error.

I'm using a build that came from the postgres website, and just uses
the config that comes with it.

Eric

On May 9, 2009, at 5:16 PM, Tom Lane wrote:

Show quoted text

Eric Smith <eric_h_smith@mac.com> writes:

When I try the command below, I get the very familiar error:
"expected
just one rule action"

You mean this?

regression=# SELECT usename FROM pg_catalog.pg_user;
usename
----------
postgres
(1 row)

If you're getting that sort of error from standard views then there is
something exceedingly broken about your Postgres build. We have
occasionally heard from people who got similar errors after installing
nonstandard hacks that modify the representation of query trees ...
so is this a completely vanilla build? Where did you get it from?

regards, tom lane

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Eric Smith (#6)
Re: getting a list of users

Eric Smith <eric_h_smith@mac.com> writes:

Yep, using that command gives me the error.
I'm using a build that came from the postgres website, and just uses
the config that comes with it.

Hmm, you mean the EDB one-click installer? I don't offhand see another
binary distro for OSX there.

It seems unlikely that the EDB build would be that broken on its own
terms, but maybe you've run into some incompatibility between different
releases of their build, or maybe you're trying to use their build
against a database that was initdb'd with some other build. Have you
upgraded Postgres since you ran initdb? If so, which version exactly
did you initdb with?

regards, tom lane

#8Eric Smith
eric_h_smith@mac.com
In reply to: Tom Lane (#7)
Re: getting a list of users

I actually started with the source: postgresql-8.3.5.tar.gz, from the
source download location. I just build straight from that source...
no mucking around with any of the sources.

Eric

On May 9, 2009, at 5:44 PM, Tom Lane wrote:

Show quoted text

Eric Smith <eric_h_smith@mac.com> writes:

Yep, using that command gives me the error.
I'm using a build that came from the postgres website, and just uses
the config that comes with it.

Hmm, you mean the EDB one-click installer? I don't offhand see
another
binary distro for OSX there.

It seems unlikely that the EDB build would be that broken on its own
terms, but maybe you've run into some incompatibility between
different
releases of their build, or maybe you're trying to use their build
against a database that was initdb'd with some other build. Have you
upgraded Postgres since you ran initdb? If so, which version exactly
did you initdb with?

regards, tom lane

#9Tom Lane
tgl@sss.pgh.pa.us
In reply to: Eric Smith (#8)
Re: getting a list of users

Eric Smith <eric_h_smith@mac.com> writes:

I actually started with the source: postgresql-8.3.5.tar.gz, from the
source download location. I just build straight from that source...
no mucking around with any of the sources.

Hmph, now I'm really mystified. If the straight source build were
this broken we'd surely have noticed (we have multiple Mac buildfarm
machines, not to mention various developers including me who test
regularly on Macs). Have you tried running the regression tests
against your build? Could you provide the output of pg_config?

regards, tom lane

#10Eric Smith
eric_h_smith@mac.com
In reply to: Tom Lane (#9)
Re: getting a list of users

You bet... here you go.

Thanks,
Eric

Attachments:

config.txttext/plain; name=config.txt; x-unix-mode=0644Download
#11Tom Lane
tgl@sss.pgh.pa.us
In reply to: Eric Smith (#10)
Re: getting a list of users

Eric Smith <eric_h_smith@mac.com> writes:

You bet... here you go.

Hmm, I see you are trying to build universal binaries:

CFLAGS=-arch i386 -arch ppc ...

That isn't exactly a trivial thing to do, because the pg_config.h data
differs for the two arches. It will *not* work to just run a basic
configure and build with CFLAGS set like that. (If you troll the
pgsql-archives archives for "universal binary" you can probably
find some discussions of what's needed to make it work. I seem to
recall that we simplified it in the last year or so, but that was
very possibly post-8.3.)

I'm not immediately sure that the symptom you mention would be the most
obvious failure, but I'm suspicious. Did you take measures to try to
make the universal build actually work, or did you just build with
these switches? Which arch are you actually building and/or
running on?

regards, tom lane

#12Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#11)
Re: getting a list of users

I wrote:

That isn't exactly a trivial thing to do, because the pg_config.h data
differs for the two arches. It will *not* work to just run a basic
configure and build with CFLAGS set like that. (If you troll the
pgsql-archives archives for "universal binary" you can probably
find some discussions of what's needed to make it work. I seem to
recall that we simplified it in the last year or so, but that was
very possibly post-8.3.)

er ... s/pgsql-archives/pgsql-hackers/ of course ... a bit of trolling
later, it seems that this message has the best summary of what you have
to do with 8.3 or older branches to get working universal binaries:

http://archives.postgresql.org/pgsql-general/2008-02/msg00200.php

Things will be less ugly with 8.4:

http://archives.postgresql.org/pgsql-hackers/2008-07/msg00884.php

but still not just a quick CFLAGS setting away.

But it remains to be determined whether that's actually the cause of the
view problem you're complaining about. Did you configure/build on a
different arch than you're running on now?

regards, tom lane

#13Eric Smith
eric_h_smith@mac.com
In reply to: Tom Lane (#11)
Re: getting a list of users

Tom,

You are correct. On an Intel, the failed command I mentioned earlier
works just fine.

I'm building for, and running on, both PPC and Intel. I've been able
to avoid these snags in the past, but I'm now adding user management
to the app, and I'm dead in the water on the PPC. I'll look through
the archives as you suggest.

Regards,
Eric

On May 9, 2009, at 6:37 PM, Tom Lane wrote:

Show quoted text

Eric Smith <eric_h_smith@mac.com> writes:

You bet... here you go.

Hmm, I see you are trying to build universal binaries:

CFLAGS=-arch i386 -arch ppc ...

That isn't exactly a trivial thing to do, because the pg_config.h data
differs for the two arches. It will *not* work to just run a basic
configure and build with CFLAGS set like that. (If you troll the
pgsql-archives archives for "universal binary" you can probably
find some discussions of what's needed to make it work. I seem to
recall that we simplified it in the last year or so, but that was
very possibly post-8.3.)

I'm not immediately sure that the symptom you mention would be the
most
obvious failure, but I'm suspicious. Did you take measures to try to
make the universal build actually work, or did you just build with
these switches? Which arch are you actually building and/or
running on?

regards, tom lane

#14Eric Smith
eric_h_smith@mac.com
In reply to: Tom Lane (#12)
Re: getting a list of users

Tom,

Thanks for the detailed info... makes my life a lot easier!

Eric

On May 9, 2009, at 7:07 PM, Tom Lane wrote:

Show quoted text

I wrote:

That isn't exactly a trivial thing to do, because the pg_config.h
data
differs for the two arches. It will *not* work to just run a basic
configure and build with CFLAGS set like that. (If you troll the
pgsql-archives archives for "universal binary" you can probably
find some discussions of what's needed to make it work. I seem to
recall that we simplified it in the last year or so, but that was
very possibly post-8.3.)

er ... s/pgsql-archives/pgsql-hackers/ of course ... a bit of trolling
later, it seems that this message has the best summary of what you
have
to do with 8.3 or older branches to get working universal binaries:

http://archives.postgresql.org/pgsql-general/2008-02/msg00200.php

Things will be less ugly with 8.4:

http://archives.postgresql.org/pgsql-hackers/2008-07/msg00884.php

but still not just a quick CFLAGS setting away.

But it remains to be determined whether that's actually the cause of
the
view problem you're complaining about. Did you configure/build on a
different arch than you're running on now?

regards, tom lane

#15Tom Lane
tgl@sss.pgh.pa.us
In reply to: Eric Smith (#13)
Re: getting a list of users

Eric Smith <eric_h_smith@mac.com> writes:

You are correct. On an Intel, the failed command I mentioned earlier
works just fine.

I'm building for, and running on, both PPC and Intel. I've been able
to avoid these snags in the past, but I'm now adding user management
to the app, and I'm dead in the water on the PPC.

Just for fun, I tried to reproduce this. I couldn't figure out what
you'd done to build a dual-arch version of 8.3 --- it certainly would
take more than just passing some funny FLAGS settings to configure.
With CVS HEAD though, the build *does* go through with only a couple
of minor bleats from ranlib, given

CFLAGS='-arch i386 -arch ppc' LDFLAGS='-arch i386 -arch ppc' configure ...

Building this way on x86 OSX 10.5.6, the resulting binaries work just
fine (of course) on x86. Not so much on PPC --- I'm surprised it even
gets through initdb, but it does, and I was able to reproduce your
"expected just one rule action". The regression tests fail rather
miserably though.

Comparing the configure output files, it seems that Apple's compiler
uses the same alignment rules for x86 and ppc, so that the only actual
pg_config.h difference is WORDS_BIGENDIAN. Which means this probably
would have worked all right in pre-8.3 versions of PG. But the rules
for short datum headers in 8.3+ will not work at all if the machine
doesn't have the endianness the code thinks. It looks like the reason
for "expected just one rule action" is that most of the
pg_rewrite.ev_action entries read out as empty C strings --- they are
really text datums of more than 127 bytes and the tuple disaassembly
code is misinterpreting their length words. I suppose if your app
doesn't deal in fields that are wider than 127 bytes on-disk, you
might have managed to miss realizing that the build was entirely
busted...

So the bottom line seems to be that you need to modify your custom build
procedure to allow for architecture-specific pg_config.h.

regards, tom lane

#16Dave Page
dpage@pgadmin.org
In reply to: Tom Lane (#15)
Re: getting a list of users

Fyi, this is exactly what i saw in my first attempts to build a
universal binary. Running configure for each architecture and hacking
up pg_config.h (per one of the archives links you posted previously)
does fix it, though iirc, 32 & 64 bit builds in the same binary will
take some more work.

On 5/10/09, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Eric Smith <eric_h_smith@mac.com> writes:

You are correct. On an Intel, the failed command I mentioned earlier
works just fine.

I'm building for, and running on, both PPC and Intel. I've been able
to avoid these snags in the past, but I'm now adding user management
to the app, and I'm dead in the water on the PPC.

Just for fun, I tried to reproduce this. I couldn't figure out what
you'd done to build a dual-arch version of 8.3 --- it certainly would
take more than just passing some funny FLAGS settings to configure.
With CVS HEAD though, the build *does* go through with only a couple
of minor bleats from ranlib, given

CFLAGS='-arch i386 -arch ppc' LDFLAGS='-arch i386 -arch ppc' configure ...

Building this way on x86 OSX 10.5.6, the resulting binaries work just
fine (of course) on x86. Not so much on PPC --- I'm surprised it even
gets through initdb, but it does, and I was able to reproduce your
"expected just one rule action". The regression tests fail rather
miserably though.

Comparing the configure output files, it seems that Apple's compiler
uses the same alignment rules for x86 and ppc, so that the only actual
pg_config.h difference is WORDS_BIGENDIAN. Which means this probably
would have worked all right in pre-8.3 versions of PG. But the rules
for short datum headers in 8.3+ will not work at all if the machine
doesn't have the endianness the code thinks. It looks like the reason
for "expected just one rule action" is that most of the
pg_rewrite.ev_action entries read out as empty C strings --- they are
really text datums of more than 127 bytes and the tuple disaassembly
code is misinterpreting their length words. I suppose if your app
doesn't deal in fields that are wider than 127 bytes on-disk, you
might have managed to miss realizing that the build was entirely
busted...

So the bottom line seems to be that you need to modify your custom build
procedure to allow for architecture-specific pg_config.h.

regards, tom lane

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

--
Dave Page
EnterpriseDB UK: http://www.enterprisedb.com

#17Eric Smith
eric_h_smith@mac.com
In reply to: Tom Lane (#15)
Re: getting a list of users

OK,

So I gave up on the universal binary, and just built a PPC version of
postgres. If I execute the command:

SELECT usename FROM pg_catalog.pg_user;

from within psql, I get:

usename
-------------
esmith
radiovision
(2 rows)

Seems to work just fine. If, on the other hand, I issue the same
command from within the C API:

NSString* query = [NSString stringWithFormat:@"SELECT usename FROM
pg_catalog.pg_user"];
postgresResult = PQexec(myConnection, [query UTF8String]);

I get an error, extracted via:

PQresultErrorMessage(postgresResult)

and the error message is:

status=PGRES_FATAL_ERROR error=<>

I'm connecting to the database through a host IP address, not through
localhost. So, why does this break?

Thanks,
Eric

On May 10, 2009, at 8:39 AM, Tom Lane wrote:

Show quoted text

Eric Smith <eric_h_smith@mac.com> writes:

You are correct. On an Intel, the failed command I mentioned earlier
works just fine.

I'm building for, and running on, both PPC and Intel. I've been able
to avoid these snags in the past, but I'm now adding user management
to the app, and I'm dead in the water on the PPC.

Just for fun, I tried to reproduce this. I couldn't figure out what
you'd done to build a dual-arch version of 8.3 --- it certainly would
take more than just passing some funny FLAGS settings to configure.
With CVS HEAD though, the build *does* go through with only a couple
of minor bleats from ranlib, given

CFLAGS='-arch i386 -arch ppc' LDFLAGS='-arch i386 -arch ppc'
configure ...

Building this way on x86 OSX 10.5.6, the resulting binaries work just
fine (of course) on x86. Not so much on PPC --- I'm surprised it even
gets through initdb, but it does, and I was able to reproduce your
"expected just one rule action". The regression tests fail rather
miserably though.

Comparing the configure output files, it seems that Apple's compiler
uses the same alignment rules for x86 and ppc, so that the only actual
pg_config.h difference is WORDS_BIGENDIAN. Which means this probably
would have worked all right in pre-8.3 versions of PG. But the rules
for short datum headers in 8.3+ will not work at all if the machine
doesn't have the endianness the code thinks. It looks like the reason
for "expected just one rule action" is that most of the
pg_rewrite.ev_action entries read out as empty C strings --- they are
really text datums of more than 127 bytes and the tuple disaassembly
code is misinterpreting their length words. I suppose if your app
doesn't deal in fields that are wider than 127 bytes on-disk, you
might have managed to miss realizing that the build was entirely
busted...

So the bottom line seems to be that you need to modify your custom
build
procedure to allow for architecture-specific pg_config.h.

regards, tom lane

#18Tom Lane
tgl@sss.pgh.pa.us
In reply to: Eric Smith (#17)
Re: getting a list of users

Eric Smith <eric_h_smith@mac.com> writes:

Seems to work just fine. If, on the other hand, I issue the same
command from within the C API:

NSString* query = [NSString stringWithFormat:@"SELECT usename FROM
pg_catalog.pg_user"];
postgresResult = PQexec(myConnection, [query UTF8String]);

I get an error, extracted via:

You sure that thing is sending the string you think it is? I'd
try turning on log_statement and looking in the postmaster log
to see what it thinks it's getting.

regards, tom lane

#19Eric Smith
eric_h_smith@mac.com
In reply to: Tom Lane (#18)
Re: getting a list of users

Alrighty.... so, how do I turn on log_statement?

Thanks,
Eric

On May 25, 2009, at 5:31 PM, Tom Lane wrote:

Show quoted text

Eric Smith <eric_h_smith@mac.com> writes:

Seems to work just fine. If, on the other hand, I issue the same
command from within the C API:

NSString* query = [NSString stringWithFormat:@"SELECT usename FROM
pg_catalog.pg_user"];
postgresResult = PQexec(myConnection, [query UTF8String]);

I get an error, extracted via:

You sure that thing is sending the string you think it is? I'd
try turning on log_statement and looking in the postmaster log
to see what it thinks it's getting.

regards, tom lane

#20Eric Smith
eric_h_smith@mac.com
In reply to: Tom Lane (#18)
Re: getting a list of users

Very interesting.

when I set log_statement='all', I see entries for various queries, but
I see nothing for the query I list below. If I just use printf() to
print out the c-string, it looks just like all the other queries.

Eric

On May 25, 2009, at 5:31 PM, Tom Lane wrote:

Show quoted text

Eric Smith <eric_h_smith@mac.com> writes:

Seems to work just fine. If, on the other hand, I issue the same
command from within the C API:

NSString* query = [NSString stringWithFormat:@"SELECT usename FROM
pg_catalog.pg_user"];
postgresResult = PQexec(myConnection, [query UTF8String]);

I get an error, extracted via:

You sure that thing is sending the string you think it is? I'd
try turning on log_statement and looking in the postmaster log
to see what it thinks it's getting.

regards, tom lane

#21Eric Smith
eric_h_smith@mac.com
In reply to: Tom Lane (#18)