Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1VRGwq-0006gs-Tx for pgsql-interfaces@arkaria.postgresql.org; Wed, 02 Oct 2013 07:34:17 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.80) (envelope-from ) id 1VRGwq-0003ez-DT for pgsql-interfaces@arkaria.postgresql.org; Wed, 02 Oct 2013 07:34:16 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1VRGwp-0003et-Nb for pgsql-interfaces@postgresql.org; Wed, 02 Oct 2013 07:34:15 +0000 Received: from mail-lb0-f170.google.com ([209.85.217.170]) by magus.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1VRGwm-0007aM-9Y for pgsql-interfaces@postgresql.org; Wed, 02 Oct 2013 07:34:14 +0000 Received: by mail-lb0-f170.google.com with SMTP id w7so423223lbi.1 for ; Wed, 02 Oct 2013 00:34:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:date:from:reply-to:organization :message-id:to:cc:subject:in-reply-to:references:mime-version :content-type:content-transfer-encoding; bh=yEXmsLFh9pq0V+5WK/hajr3dFC3J+qSVqxLb4uQg17k=; b=Z4Ika3ncc3lGAsk+MEo+n9p/KI+c5SQz9uADXGELcsWuo07fO+KCuO/WHluKF8CZmQ bVhUKKemgf0weV6JCPztzcNB+hYZ1HI0ZsjaUHiNbyhgl3KJ5Y5xLQi5szdNyZsFSCUX nr5KOxDNlu9KVPVWmg4H3+6dHOx+utz3uZjT2N2Wu2EucYlRY2cdNgDatyHOoSsJTb9/ x1Xk0ApGibVzumPQ59HJoSp8p0og5mbYGLBb3qEGJzBQPfn2Q9LVJqZX2MNpi24yMB3e JnZ7TZEcKR51K1Z+fZQmn1UGjsQ430DK5NC4Hn5nhEUP3vzhdqrfJ9TjJ8gHp4obBM6a KYPg== X-Gm-Message-State: ALoCoQk9E9hEMz1McioJF4CZPUWJvQXHJzcrfF0mPvPdfX1lzIKw6RXCaL+Yck7Vkn/EhJmHNqZB X-Received: by 10.112.159.166 with SMTP id xd6mr1120314lbb.22.1380699250452; Wed, 02 Oct 2013 00:34:10 -0700 (PDT) Received: from [192.168.1.102] (134-20-133-95.pool.ukrtel.net. [95.133.20.134]) by mx.google.com with ESMTPSA id b1sm272322lah.6.1969.12.31.16.00.00 (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 02 Oct 2013 00:34:09 -0700 (PDT) Date: Wed, 2 Oct 2013 10:34:12 +0300 From: Pavel Golub Reply-To: Pavel Golub Organization: Microolap X-Priority: 3 (Normal) Message-ID: <3810480384.20131002103412@gf.microolap.com> To: Sebastien FLAESCH CC: pgsql-interfaces@postgresql.org Subject: Re: libpq compatibility policy across versions In-Reply-To: <524AE9DC.4020407@4js.com> References: <522F0B6B.1040006@4js.com> <113082781.20131001152820@gf.microolap.com> <524AC850.7000109@4js.com> <807955869.20131001173851@gf.microolap.com> <524AE9DC.4020407@4js.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Pg-Spam-Score: -2.6 (--) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-interfaces Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Hello, Sebastien. You wrote: SF> Thank you Pavel, I appreciate your help, but I would however prefer a clear SF> statement from the PostgreSQL C API developpers, written in the doc... ;-) Fare enough. :) SF> We have a commercial software: not sure we can deliver the PostgreSQL client SF> library in our packages, regarding open source license policy. We don't want SF> to make the sources of our product public. We have commercial software too. And we ship it with client library. It's all OK woth license. SF> Further, I don't like to ship other software libs in our product, typically SF> you want to use what is installed on the system. SF> If there is a bug in the PostgreSQL client lib, it's up to the user to install SF> the new lib that fixes the bug, without asking us to rebuild a package with SF> the new pgs lib. SF> Nothing new here, just traditional shared lib usage and dependency. SF> Yes, my instinct is also to use the C headers matching the lib version used SF> at runtime, we do this for now... SF> But some people think it's possible to provide a unique binary for all versions SF> of PostgreSQL, so I ask for a clear rule for the PostgreSQL C API. SF> Note also that we want to use the latest version, to get the latest features SF> with new C structures and defines... SF> So typically, we would compile with PostgreSQL 9.3 headers... SF> Seb SF> On 10/01/2013 04:38 PM, Pavel Golub wrote: >> Hello, Sebastien. >> >> You wrote: >> >> SF> Thank you Pavel, >> >> SF> On 10/01/2013 02:28 PM, Pavel Golub wrote: >> >> Yes, you should use the latest client library. It's compatible with >> >> all prior versions. >> >> SF> Just to be clear: >> >> SF> We deliver our product without any PostgreSQL lib included. >> >> Well, I prefer to deploy products with the latest lib included. Thus >> I'm absolutely sure in the environment used. >> >> SF> Our product installs beside an existing PostgreSQL install, typically >> SF> on an application server, where both PostgreSQL client and server are >> SF> installed in the same directory. >> >> That's possible of course, but there are a lot of issues you may face >> with IMHO >> >> SF> Imagine for ex a machine with PostgreSQL 8.3 installed. >> >> SF> I am asking how I must compile my source code and how to link, to build >> SF> my binary, to be sure that it's compatible with PostgreSQL 8.3, and >> SF> any in fact any existing PostgreSQL versions. >> >> SF> Can I for ex, use the V 9.3 headers and library on my dev platform >> SF> and then deliver this binary for any PostgreSQL version? >> >> SF> In other words, is the PostgreSQL client C API backward compatible? >> >> I'm not sure it is. >> >> >> SF> Today the lib is stamped with 5 (libpq.so.5), will this never change >> SF> in future versions? >> >> SF> Is there a way to detect dynamically the version of the PostgreSQL server? >> >> "SELECT version()" will do the trick using direct SQL. >> http://www.postgresql.org/docs/9.3/static/functions-info.html >> >> PQserverVersion - will help you if you need an integer representing the backend version. >> http://www.postgresql.org/docs/9.3/static/libpq-status.html >> >> >> >> SF> Thanks! >> SF> Seb >> >> >> SF> On 10/01/2013 02:28 PM, Pavel Golub wrote: >>>> Hello, Sebastien. >>>> >>>> You wrote: >>>> >>>> SF> Hi all, >>>> >>>> SF> We have a libpq client application written in C. >>>> >>>> SF> We want to deliver the software so that can it be used with different >>>> SF> PostgreSQL client versions, from 8.3 to 9.3 (and future versions). >>>> >>>> SF> So far, we build (compile and link) a binary with each major version >>>> SF> of PostgreSQL (8.3, 8.4, 9.0, 9.1, 9.2, 9.3) - in fact we have shared >>>> SF> libraries (database driver) for each PostgreSQL version. >>>> >>>> SF> Is this the proper way, or could we just compile/link with a given >>>> SF> version (9.3) and assume that it's backward compatible with any >>>> SF> prior version such as 8.3 ? >>>> >>>> Yes, you should use the latest client library. It's compatible with >>>> all prior versions. >>>> >>>> SF> Assuming that we could dynamically load the libpq.so client, search >>>> SF> for existing API symbols and only use them if present? >>>> >>>> SF> Is this risky? Do the C headers define C structures that are compatible >>>> SF> between newer and older versions? >>>> >>>> SF> I would expect some note about libpq compatibility policy here: >>>> >>>> SF> http://www.postgresql.org/docs/9.3/static/libpq-build.html >>>> >>>> SF> I can see that the lib version number of libpq.so.x.y changes >>>> SF> for each major version: >>>> >>>> SF> /opt3/dbs/pgs/9.2/lib/libpq.so -> libpq.so.5.5 >>>> SF> /opt3/dbs/pgs/9.2/lib/libpq.so.5 -> libpq.so.5.5 >>>> SF> /opt3/dbs/pgs/9.2/lib/libpq.so.5.5 >>>> SF> /opt3/dbs/pgs/9.3.0/lib/libpq.so -> libpq.so.5.6 >>>> SF> /opt3/dbs/pgs/9.3.0/lib/libpq.so.5 -> libpq.so.5.6 >>>> SF> /opt3/dbs/pgs/9.3.0/lib/libpq.so.5.6 >>>> >>>> SF> The binaries are dependent from libpq.so.5: >>>> >>>> SF> $ ldd -r dbmpgs92x.so >>>> SF> ... >>>> SF> libpq.so.5 => /opt3/dbs/pgs/9.2.3/lib/libpq.so.5 (0xb77bb000) >>>> SF> ... >>>> >>>> SF> What does this mean? >>>> >>>> SF> Theoritically, a binary linked in a 9.3 env can use le libpq.so version >>>> SF> of a prior version down to 8.2 ... (8.1 has libpq.so.4) >>>> >>>> SF> The main question is about C header compatibility: >>>> >>>> SF> - Compile + link with PostgreSQL client version X.Y.? >>>> SF> - What PostgreSQL client version can be used at runtime? >>>> >>>> SF> Thanks. >>>> SF> Seb >>>> >>>> >>>> >>>> >>>> >> >> >> >> >> >> -- With best wishes, Pavel mailto:pavel@gf.microolap.com -- Sent via pgsql-interfaces mailing list (pgsql-interfaces@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-interfaces