Re: IDENTIFY_SYSTEM - Mailing list pgsql-sql

From Glyn Astill
Subject Re: IDENTIFY_SYSTEM
Date
Msg-id 1391611865.95042.YahooMailNeo@web133202.mail.ir2.yahoo.com
Whole thread Raw
In response to Re: IDENTIFY_SYSTEM  (Glyn Astill <glynastill@yahoo.co.uk>)
Responses Re: IDENTIFY_SYSTEM
List pgsql-sql
----- Original Message -----

> From: Glyn Astill <glynastill@yahoo.co.uk>
> To: Cezariusz Marek <cezariusz.marek@comarch.pl>; "pgsql-sql@postgresql.org" <pgsql-sql@postgresql.org>
> Cc:
> Sent: Wednesday, 5 February 2014, 14:45
> Subject: Re: [SQL] IDENTIFY_SYSTEM
>
> ----- Original Message -----
>
>>  From: Cezariusz Marek <cezariusz.marek@comarch.pl>
>>  To: pgsql-sql@postgresql.org
>>  Cc:
>>  Sent: Wednesday, 5 February 2014, 12:01
>>  Subject: Re: [SQL] IDENTIFY_SYSTEM
>>
>>>   That's part of the streaming replication protocol
>>>
>>>   http://www.postgresql.org/docs/9.3/static/protocol-replication.html
>>>   As long as you're using wal_level >= archive and the
> replication
>>  connection is enabled you can retrieve it via psql
>>
>>  Yes, I know, but there is no way to get the systemid value from a function
> using
>>  just SQL or plpgsql?
>>
>
> I don't think so no, but you may have better luck finding someone more
> knowledgable posting to pgsql-general.  You could do it by calling
> pg_controldata via an untrusted procedural language, not so sure how happy
> I'd be with that myself.  E.g. with plperlu:
>
> CREATE OR REPLACE FUNCTION get_system_identifier_unsafe(text)
> RETURNS text AS
> $BODY$
>     my $rv;
>     my $data;
>     my $pg_controldata_bin = $_[0];
>     my $sysid;
>    
>     $rv = spi_exec_query('SHOW data_directory', 1);
>     $data = $rv->{rows}[0]->{data_directory};
>    
>     open(FD,"$pg_controldata_bin $data | ");
>    
>     while(<FD>) {
>         if (/Database system identifier:/) {
>             $sysid = $_;
>             for ($sysid) {
>                 s/Database system identifier://;
>                 s/[^0-9]//g;
>             }
>             last;
>         }
>     }
>     close (FD);
>     return $sysid;   
>
> $BODY$
> LANGUAGE plperlu;
>
>

So if I actually ran that:

test=# select get_system_identifier_unsafe('pg_controldata');
 get_system_identifier_unsafe
------------------------------
 5667443312440565226

>
>>>   If it's just for licencing perhaps inet_server_addr() or a plperl
>>  function to grab the mac address of the machine might suffice?
>>
>>  I have to license each database, not just the whole machine. And the
> systemid is
>>  the only unique database identifier I've found.
>
> Is it each database or each postgresql instance / cluster?   How exactly do you
> want your licencing to work? There may be a better way.
>



pgsql-sql by date:

Previous
From: Glyn Astill
Date:
Subject: Re: IDENTIFY_SYSTEM
Next
From: bricklen
Date:
Subject: Re: IDENTIFY_SYSTEM