diff options
author | Tiziano Müller <dev-zero@gentoo.org> | 2008-06-14 11:49:55 +0000 |
---|---|---|
committer | Tiziano Müller <dev-zero@gentoo.org> | 2008-06-14 11:49:55 +0000 |
commit | e32c624a4774bacaf3cfe5e58d18662c0760011a (patch) | |
tree | bc3ba47df5de5dd9558f09c0474a15eb1dc56749 /dev-db/postgresql-server | |
parent | Bug #226505 - For compatibity with phase execution order in (diff) | |
download | historical-e32c624a4774bacaf3cfe5e58d18662c0760011a.tar.gz historical-e32c624a4774bacaf3cfe5e58d18662c0760011a.tar.bz2 historical-e32c624a4774bacaf3cfe5e58d18662c0760011a.zip |
Changed home-path for the postgresql from /var/lib to /var/lib/postgresql (bug #177085). Fixed elog for the location of postgresql.conf (bug #194701). Change to not install the html-docs since they're provided by postgresql-docs (bug #225629).
Package-Manager: portage-2.1.5.4
Diffstat (limited to 'dev-db/postgresql-server')
15 files changed, 3936 insertions, 124 deletions
diff --git a/dev-db/postgresql-server/ChangeLog b/dev-db/postgresql-server/ChangeLog index 9c551674c047..9aec081e51da 100644 --- a/dev-db/postgresql-server/ChangeLog +++ b/dev-db/postgresql-server/ChangeLog @@ -1,6 +1,25 @@ # ChangeLog for dev-db/postgresql-server # Copyright 1999-2008 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/ChangeLog,v 1.7 2008/06/04 21:44:07 dev-zero Exp $ +# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/ChangeLog,v 1.8 2008/06/14 11:49:54 dev-zero Exp $ + +*postgresql-server-8.3.3 (14 Jun 2008) +*postgresql-server-8.2.9 (14 Jun 2008) +*postgresql-server-8.1.13 (14 Jun 2008) +*postgresql-server-8.0.17 (14 Jun 2008) +*postgresql-server-7.4.21 (14 Jun 2008) + + 14 Jun 2008; Tiziano Müller <dev-zero@gentoo.org> + +files/postgresql-7.4.21-autoconf.patch, + +files/postgresql-8.0.15-common.patch, files/postgresql-8.0-common.patch, + +files/postgresql-8.3.1-server.patch, files/postgresql-8.3-server.patch, + +postgresql-server-7.4.21.ebuild, postgresql-server-8.0.15.ebuild, + +postgresql-server-8.0.17.ebuild, +postgresql-server-8.1.13.ebuild, + postgresql-server-8.2.7.ebuild, +postgresql-server-8.2.9.ebuild, + postgresql-server-8.3.1.ebuild, +postgresql-server-8.3.3.ebuild: + Changed home-path for the postgresql from /var/lib to /var/lib/postgresql + (bug #177085). Fixed elog for the location of postgresql.conf (bug + #194701). Change to not install the html-docs since they're provided by + postgresql-docs (bug #225629). 04 Jun 2008; Tiziano Müller <dev-zero@gentoo.org> postgresql-server-7.3.21.ebuild, postgresql-server-7.4.19.ebuild, diff --git a/dev-db/postgresql-server/Manifest b/dev-db/postgresql-server/Manifest index 777a24f6b711..ed0f6aa7bb9c 100644 --- a/dev-db/postgresql-server/Manifest +++ b/dev-db/postgresql-server/Manifest @@ -6,14 +6,17 @@ AUX postgresql-7.4-regress.patch 3337 RMD160 dcd1eef99595c5ae070a6778179a1b46118 AUX postgresql-7.4-server.patch 2811 RMD160 07a11c84497d7ddeaac1266821d2dd4a75f2ea01 SHA1 3d09b0cdffdddd93de0b97b626fc91772342f640 SHA256 d31c37a7821421e289e0dcc57b743e219fe97745053a2750703647f4e2a4bd5c AUX postgresql-7.4-vacuum-delay.patch 8918 RMD160 dcd4fc4774277b0bf4a2158584c18bae2dc04232 SHA1 fe701fd6ca6cc9519417ab1053ef61a50ca51281 SHA256 7112ea61b84ce5c6974cd74687039f2ef871e0b4b25a34b4394225c2695fc123 AUX postgresql-7.4.19-autoconf.patch 1870 RMD160 92e49d3bc82ebfce6c798b4d56008da5c8f46d33 SHA1 a42d03a9c4d7b5df7a69a3d23c9e527c6d901eba SHA256 dccd9553b9cfdc88ffe98e445e27d1714426b4f1e6f405af438243ba06b93b6e -AUX postgresql-8.0-common.patch 2294 RMD160 4f0028f6b5e95d74328f2c3981aa558420739181 SHA1 be649bf09bd5082e6e2af58c44cc470456e37780 SHA256 eca25d56bd157a3a7883d4c4305e4e0b7d22b8dd0cbca93da88add24da28b681 +AUX postgresql-7.4.21-autoconf.patch 1870 RMD160 24606231223419721fa9ee6844c685368564f20c SHA1 50577930b75b4690c510132cce00475d4f3a13ab SHA256 e943c4ef9cb14fa064879c273ef5a064b5ce01b1d6af36057f0807d52eec0396 +AUX postgresql-8.0-common.patch 2294 RMD160 bbf24d2f0278618ec8a0eafbcbc1787adf4ff343 SHA1 5e421092c2cb12c1bd1f9639bd1a9bf1120d1ab0 SHA256 53069c1e90fd3ca37704183417e9240eae805aa3ad44533fd83b24640c7765fd AUX postgresql-8.0-server.patch 6918 RMD160 de96cda82597098fbfb595fac5069164d7e4f30e SHA1 9f5b5e3bff058f75fe5e25e968e96c1c0147cc43 SHA256 5d8ff711ec83eb8660edc129519bd67ae76553fca22ced379439d31938173346 +AUX postgresql-8.0.15-common.patch 2294 RMD160 4f0028f6b5e95d74328f2c3981aa558420739181 SHA1 be649bf09bd5082e6e2af58c44cc470456e37780 SHA256 eca25d56bd157a3a7883d4c4305e4e0b7d22b8dd0cbca93da88add24da28b681 AUX postgresql-8.1-common.patch 2290 RMD160 ba1f803b045a8d3f430231b0c22b8817e2eb8cf6 SHA1 facf27b2c396fe9f2347eb4cec3b2714a8587b70 SHA256 f80c8dd5a31b88df330c15de4331db1600ae078a789650ab28d61620f27056f5 AUX postgresql-8.1-server.patch 6862 RMD160 94dc4c22f1f480bf5844f6e654d8a4e0534059eb SHA1 8fbf5d0b4d24b675f6812ff89465527263f51012 SHA256 97f3b3d889af08aeb92e6583dd970763cdc662621e34e13a5298fe9cd5ad4b4d AUX postgresql-8.2-common.patch 2640 RMD160 b25ba915d5d6ad9c12c1d51426363c196b830923 SHA1 7b946d57bfed34e2e7e1338c3ab3004341d7ab12 SHA256 36ca9cb4f26424c302fdd704b7c1a268e87612afa3006bf008d4594dabe080f8 AUX postgresql-8.2-server.patch 5319 RMD160 9aae5832defd2e43879246e773fd1aada0680716 SHA1 ea726704fc85118c27f511bfd9324b136ced3eb1 SHA256 2687fa5159a34da59e36af4c894f43b2136e8e88c965a682607cb48acb61d8ee AUX postgresql-8.3-common.patch 2641 RMD160 0822bf1512457e91d5f32f9d192de6f197db9c55 SHA1 e4bdbd5eee1023e8f0b42ef408b34b57495d1e2b SHA256 e416c26d9c3d266b306ddbc0a2b648054739b7ace35e2b4e449fbdaf094bc197 -AUX postgresql-8.3-server.patch 6823 RMD160 f9dcc246eca1251526b94aa81fc8f3d5a02c3b76 SHA1 7ae8c9764d662364392d98f686060e22da2dfa46 SHA256 0e3684ce6bb03f860501819985a295d72c7579e1e94ddd1239086a38c0f4a105 +AUX postgresql-8.3-server.patch 66296 RMD160 6acd5dec3b411d0439bab47a344406df25c08b7a SHA1 fca417c169d5de6c2ea036ab80a4ce02665ae881 SHA256 74684e07df2ff15f3c10d4f586cd72fba51c996ab9a97b6aee11f79987fc4de6 +AUX postgresql-8.3.1-server.patch 6823 RMD160 f9dcc246eca1251526b94aa81fc8f3d5a02c3b76 SHA1 7ae8c9764d662364392d98f686060e22da2dfa46 SHA256 0e3684ce6bb03f860501819985a295d72c7579e1e94ddd1239086a38c0f4a105 AUX postgresql.conf-7.3 1532 RMD160 fa088eb5742efbce852d6dcff1dba420857aa67e SHA1 22ac6f3632d6baa1a97017f27001951ccf6a224c SHA256 c0e2ae8c22895bde591302234735ceaddcf4c2a4b1e17ed8cee53b66dad32a24 AUX postgresql.conf-7.4 1532 RMD160 8897005145112dc1782174fcac512531a32ce88a SHA1 f7e1e1c6cac39d1c7ecc371c9391214d6a8c8055 SHA256 4084c99ad0fff027876c82375c4d99d1669090398137ef5ed19c8e74cecb6e0c AUX postgresql.conf-8.0 1532 RMD160 de03805c18ac079b830bcc412c838eb67cbf4f2b SHA1 a7e288d80b0fd24ddf55bdd560f1e8b216b1f540 SHA256 471cd40a0f9100789d238722e5e5efb923dd4f526b564341a5401b3df236721a @@ -28,15 +31,25 @@ AUX postgresql.init-8.2 2985 RMD160 2da04989bf124326a34a7fd718f06bf9fd9beae9 SHA AUX postgresql.init-8.3 2985 RMD160 62548136f7c06a419927eeaff2d991f9a1aa6528 SHA1 f1fc6f0dd69fa1fc327197856dde28a813ded024 SHA256 99cf6469c0175713252c4de19ade86deb860062fa91c4c74f9397aedb7851c88 DIST postgresql-7.3.21.tar.bz2 9284558 RMD160 f9de4676b4fbe3d96e6d1462b8bc3c05600d6525 SHA1 bdfa3bddc483c6642cc2ee271d076bfaa4c20c92 SHA256 bf44e0ac259e9f6e14ac102f2977496b6996ecea2fd227fbdcea5fa70e342888 DIST postgresql-7.4.19.tar.bz2 10307396 RMD160 c9a1c7dc8e7bf9ce93c3b4f061af0563b1cc2627 SHA1 19c563d47b0d5deeef03b5ca7707c9f1917853ce SHA256 447ac7070aa0a547f17a307e842734fc27e2716cb4a251fa9a810b178d44c389 +DIST postgresql-7.4.21.tar.bz2 10282778 RMD160 b4868ac2664353b8cef4c67d59770f357293c865 SHA1 813895863832b5512838b90b2ea2300b74b856f5 SHA256 2c62d112a7addd4333d14101e508d2222a639e1698b8e4958ce1b05138f76932 DIST postgresql-8.0.15.tar.bz2 11253897 RMD160 6aff5c63dce73eea609f0b6e013cd043ae8b7a37 SHA1 66a6fef7749afb91471200005511c04fc1ac2706 SHA256 59408a00db1c73e638a11af10438a827507b7a72b53916d58f2d44c477718714 +DIST postgresql-8.0.17.tar.bz2 11234855 RMD160 d22b26b38a91632b8840e9d0b1b96b4ad80eafed SHA1 d1c4530323a81b00a31003dea695875a8f87ff4f SHA256 e425602f60c034ecfd6ffe9b403d863cd99ff6fbc0891a8d59da33258a21a93b DIST postgresql-8.1.11.tar.bz2 11735420 RMD160 9fb98eadc4f1015205970f26b31b68ea0378bda9 SHA1 73c0f09754fc8e3c7f8d7de49d70244b76927416 SHA256 3e91cdfc1353fa9c6416d9fc8ae9d6ab3171565f00aeb6c882214c2f08a03e2e +DIST postgresql-8.1.13.tar.bz2 11744780 RMD160 fe9fab1b70fa93b4dc0bd19f63a590f75511e79e SHA1 6d4b771aa4011fa3e8aed726f1521b77cd91772a SHA256 a537734da80f85c51ef72dd2d28bb2f64b73f63a727ef53a90211ccac2dcb1d1 DIST postgresql-8.2.7.tar.bz2 12576126 RMD160 96700e91c3b9e733c686b0fe377c7ba661710942 SHA1 0be0dbaa488810ebcba77ac7246180c5b2a9b669 SHA256 39528d1ba50f5abc51569e8b9bdeb47d0d4650d289a2c2e465621864b1ff3584 +DIST postgresql-8.2.9.tar.bz2 12558265 RMD160 00fe295d928e77a2dff136795ba846ae3ac08569 SHA1 aeaf0487d031c56518af002f76f779c23baf6391 SHA256 95ea81e0fa00184a63dae960007be95200343b24dec6cdea41bc809db29f22c2 DIST postgresql-8.3.1.tar.bz2 13995572 RMD160 075efb67126f2b308d2a5fe4f9097fdbfbe94c89 SHA1 7397e0d8fd3c420ee845d9ae4995ae347bfaea1d SHA256 7ccf1e5c987920e4d6eb98b8589939e29d3a361d285055d5af35ddd8e1a2d992 +DIST postgresql-8.3.3.tar.bz2 14004538 RMD160 8cc31cae862e328c8372245c8f953a1773dcc1f8 SHA1 b933f26a70bef9a5971c0ff2f392e293eed138b2 SHA256 e9406b93794dc4fd15b21e10512d2b694236d79b018d29b9ca86311d5cca2437 EBUILD postgresql-server-7.3.21.ebuild 9021 RMD160 48af14ad1f0f5d9af1ab1bbee786c0c5185f2e1c SHA1 0a594f6bb163070d8a0af2fbd56fdadbaa2ad050 SHA256 52ac83e6038935db6f0edb8c7ee0fae61e68d77061c6b41bc99e155bc2d75321 EBUILD postgresql-server-7.4.19.ebuild 8951 RMD160 eaee743bc8574efe01a8cc30af04c41ed1215628 SHA1 0afad9d1fba84783849f999e17d823a3e3e88906 SHA256 15c7bd6c7d8c404bbd9461262067301dd9606eb0067b065347c03f17c0d9ef09 -EBUILD postgresql-server-8.0.15.ebuild 9147 RMD160 0132314ec71a1a15c260df2ec1286da9ce5f9e93 SHA1 8f84cb5656b52d649e6b593516fa6b36f26d21e7 SHA256 2497b1cc329889158fcd27169f428824ace2d36e16fa59baf0a0222527157eca +EBUILD postgresql-server-7.4.21.ebuild 8924 RMD160 de1d0e68b8ffaf453a6848c036e173c42cb456c9 SHA1 6b14b0a92cdc4c43f9c446ba52c5154e2c9996d7 SHA256 74ec07c96dce46f8a23d09ff676d583dd6362694deae001c79bfffb2d1bb017f +EBUILD postgresql-server-8.0.15.ebuild 9150 RMD160 7a732f8c7791976955ec0fcecec06b6b2705482b SHA1 a78f72197c4dc7169ef13e3bb12a6c79a40a46d0 SHA256 597f22ac4c4fe19a9e1fa300c77c7bea56bb6e5630e693a555e5a69df8450cb3 +EBUILD postgresql-server-8.0.17.ebuild 9120 RMD160 2db4b6c9d52685277ba0969ac953d10f557cebd4 SHA1 b8fc088e06554cc351d45d9088497c2e47fc8f98 SHA256 6607f91436dec28b28218cabd21eedc24d46769087ae5d8e629c6848d96ed442 EBUILD postgresql-server-8.1.11.ebuild 9268 RMD160 a1039e8ef27793419e2cfb11cd2fb29264ba7f3a SHA1 391677189aa5074f6b12bb427aa0292c8bafa69b SHA256 fdf24b21f596583c90ffdc4ffe9b4b7e9067aa13418dc3b0a884bedb75ddc690 -EBUILD postgresql-server-8.2.7.ebuild 9496 RMD160 ba02e7178eb65a990bfd14389e06edcbf1bd6040 SHA1 7c553387cc5319d01096e1edda896aec50b07dd6 SHA256 a533b0f4b8665dc21ee2b77819448cd95b8bb6787cdea87d4ce4662e55f4ff35 -EBUILD postgresql-server-8.3.1.ebuild 9727 RMD160 bbd102c646ea682d96c2135ca05b8d9cec73f840 SHA1 80887274991bb58721e3b3e618a3207b6a12e6bf SHA256 277188e7d784ad3d33ff81d31288414dc3fe10f8d9117e2fafabb734ad44d6c9 -MISC ChangeLog 9943 RMD160 e57361954ff4e6724da59bbc944f36758d71aa5f SHA1 4d42ec14c7d69b0f874ade33b3e72b8ed9c86407 SHA256 d7429db246a52e0947f48b1b1a00452ec9e0b7bd7780168abaa0f2c9e45c9588 +EBUILD postgresql-server-8.1.13.ebuild 9206 RMD160 1d4a8bee7bc396d0f45018ad02e14ee5b8ca633c SHA1 069b65dcbdad0a62db127829b1a69a06176ff056 SHA256 c331589472d7e142fb924235cea063b78923dbda797e392d4c872204510360ea +EBUILD postgresql-server-8.2.7.ebuild 9425 RMD160 28db4996485f7a18561bf6517de6ae619734bf75 SHA1 d46e82da13b7766895c890a0c09e98d53ad0a700 SHA256 701b49087e6632e71d9bcf42ec61df59cd81c692bdc5467c813b39aeca3b2b4d +EBUILD postgresql-server-8.2.9.ebuild 9505 RMD160 55374d201f8f7fcd5c856652216ca5ee6053b5fc SHA1 5d633cb7725758fc4b96053735952b1287fd388f SHA256 3cab96dae890fe4e47b843b43102f58fa328b5f3df84043bbe03c94974700be8 +EBUILD postgresql-server-8.3.1.ebuild 9729 RMD160 6d1ea7e0702abe3a950c99e12484d5dc8bbcb3d1 SHA1 2fc164f77f34b025c6be78c051c0579ce5722603 SHA256 a04c163a4418c827b29b4c610d407c1bea2eab0dfa58bf6c56e6c52a0db4bdf8 +EBUILD postgresql-server-8.3.3.ebuild 9665 RMD160 c11b3e133aa3f2262eaea9be32523190dc1cd41e SHA1 c81a6700027050723f8be5e4eb7bc36bb9342ed6 SHA256 715dc883693612605971bffff7b3bee607d8b66d8919e972546183e21851e270 +MISC ChangeLog 10915 RMD160 0400edb46365f1d68270e09990e8ca9ed98a0673 SHA1 4b55dd40b100d24f2ae508d2ef0b9e11829df9c3 SHA256 74649f13305e87ba0046e8c0f85c0b1abebda2f8bae644cd1676e5411208357e MISC metadata.xml 164 RMD160 becfe652663bd65719dd11fa6ffb588b3d5b4ecc SHA1 f67b7ac1c5e6e65ef5a19a589d4759c84918f86c SHA256 7e8e8126bc8701c4a42c7dfed8bb755ac6040fe3d0e3f994d888f8b2b4fa7d8b diff --git a/dev-db/postgresql-server/files/postgresql-7.4.21-autoconf.patch b/dev-db/postgresql-server/files/postgresql-7.4.21-autoconf.patch new file mode 100644 index 000000000000..9411a22f9020 --- /dev/null +++ b/dev-db/postgresql-server/files/postgresql-7.4.21-autoconf.patch @@ -0,0 +1,48 @@ +diff --git a/config/programs.m4 b/config/programs.m4 +index ae3b91a..6af24d2 100644 +--- a/config/programs.m4 ++++ b/config/programs.m4 +@@ -153,13 +153,13 @@ AC_DEFUN([PGAC_CHECK_GETTEXT], + dnl FIXME: We should probably check for version >=0.10.36. + AC_CHECK_PROGS(XGETTEXT, xgettext) + +- # Note: share/locale is always the default, independent of $datadir +- localedir='${prefix}/share/locale' +- if test x"$prefix" = x"NONE"; then +- exp_localedir="$ac_default_prefix/share/locale" +- else +- exp_localedir="$prefix/share/locale" +- fi ++ # Note: share/locale *WAS* always the default, independent of $datadir ++ AC_ARG_WITH([locale-dir], ++ AC_HELP_STRING([--with-locale-dir],[Set path to locale files]), ++ [ localedir="${withval}" ], ++ [ localedir='${prefix}/share/locale' ] ++ ) ++ exp_localedir="${localedir}" + + AC_SUBST(localedir) + AC_DEFINE_UNQUOTED(LOCALEDIR, ["$exp_localedir"], +diff --git a/configure.in b/configure.in +index f7bdec3..c8b5b7e 100644 +--- a/configure.in ++++ b/configure.in +@@ -19,17 +19,8 @@ m4_pattern_forbid(^PGAC_)dnl to catch undefined macros + dnl + dnl The GNU folks apparently haven't heard that some people don't use + dnl Texinfo. Use this sorcery to use "docdir" instead of "infodir". +-m4_define([info], [doc]) +-m4_define([infodir], [docdir]) + AC_INIT([PostgreSQL], [7.4.21], [pgsql-bugs@postgresql.org]) +-m4_undefine([infodir]) +-m4_undefine([info]) +-AC_SUBST(docdir) +- +-m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.53], [], [m4_fatal([Autoconf version 2.53 is required. +-Untested combinations of 'autoconf' and PostgreSQL versions are not +-recommended. You can remove the check from 'configure.in' but it is then +-your responsibility whether the result works or not.])]) ++ + AC_COPYRIGHT([Copyright 2004 PostgreSQL Global Development Group]) + AC_CONFIG_SRCDIR([src/backend/access/common/heaptuple.c]) + AC_CONFIG_AUX_DIR(config) diff --git a/dev-db/postgresql-server/files/postgresql-8.0-common.patch b/dev-db/postgresql-server/files/postgresql-8.0-common.patch index 40932ecf4bc7..30cf06603d21 100644 --- a/dev-db/postgresql-server/files/postgresql-8.0-common.patch +++ b/dev-db/postgresql-server/files/postgresql-8.0-common.patch @@ -31,7 +31,7 @@ index c71b175..674036a 100644 AC_INIT([PostgreSQL], [8.0.15], [pgsql-bugs@postgresql.org]) --m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.53], [], [m4_fatal([Autoconf version 2.59 is required. +-m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.53], [], [m4_fatal([Autoconf version 2.53 is required. -Untested combinations of 'autoconf' and PostgreSQL versions are not -recommended. You can remove the check from 'configure.in' but it is then -your responsibility whether the result works or not.])]) diff --git a/dev-db/postgresql-server/files/postgresql-8.0.15-common.patch b/dev-db/postgresql-server/files/postgresql-8.0.15-common.patch new file mode 100644 index 000000000000..40932ecf4bc7 --- /dev/null +++ b/dev-db/postgresql-server/files/postgresql-8.0.15-common.patch @@ -0,0 +1,76 @@ +diff --git a/config/programs.m4 b/config/programs.m4 +index 3f87396..9c7fbf0 100644 +--- a/config/programs.m4 ++++ b/config/programs.m4 +@@ -153,13 +153,13 @@ AC_DEFUN([PGAC_CHECK_GETTEXT], + dnl FIXME: We should probably check for version >=0.10.36. + AC_CHECK_PROGS(XGETTEXT, xgettext) + +- # Note: share/locale is always the default, independent of $datadir +- localedir='${prefix}/share/locale' +- if test x"$prefix" = x"NONE"; then +- exp_localedir="$ac_default_prefix/share/locale" +- else +- exp_localedir="$prefix/share/locale" +- fi ++ # Note: share/locale *WAS* always the default, independent of $datadir ++ AC_ARG_WITH([locale-dir], ++ AC_HELP_STRING([--with-locale-dir],[Set path to locale files]), ++ [ localedir="${withval}" ], ++ [ localedir='${prefix}/share/locale' ] ++ ) ++ exp_localedir="${localedir}" + + AC_SUBST(localedir) + AC_DEFINE_UNQUOTED(LOCALEDIR, ["$exp_localedir"], +diff --git a/configure.in b/configure.in +index c71b175..674036a 100644 +--- a/configure.in ++++ b/configure.in +@@ -19,10 +19,6 @@ m4_pattern_forbid(^PGAC_)dnl to catch undefined macros + + AC_INIT([PostgreSQL], [8.0.15], [pgsql-bugs@postgresql.org]) + +-m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.53], [], [m4_fatal([Autoconf version 2.59 is required. +-Untested combinations of 'autoconf' and PostgreSQL versions are not +-recommended. You can remove the check from 'configure.in' but it is then +-your responsibility whether the result works or not.])]) + AC_COPYRIGHT([Copyright (c) 1996-2005, PostgreSQL Global Development Group]) + AC_CONFIG_SRCDIR([src/backend/access/common/heaptuple.c]) + AC_CONFIG_AUX_DIR(config) +diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h +index 0c2dff0..d548d4d 100644 +--- a/src/include/storage/s_lock.h ++++ b/src/include/storage/s_lock.h +@@ -239,6 +239,31 @@ tas(volatile slock_t *lock) + #endif /* __s390__ || __s390x__ */ + + ++#if defined(__sh__) ++#define HAS_TEST_AND_SET ++ ++typedef unsigned char slock_t; ++ ++#define TAS(lock) tas(lock) ++ ++static __inline__ int ++tas(volatile slock_t *lock) ++{ ++ register int _res = 1; ++ ++ __asm__ __volatile__( ++ "tas.b @%1\n\t" ++ "movt %0\n\t" ++ "xor #1,%0" ++: "=z"(_res) ++: "r"(lock) ++: "t","memory"); ++ return _res; ++} ++ ++#endif /* __sh__ */ ++ ++ + #if defined(__sparc__) + #define HAS_TEST_AND_SET + diff --git a/dev-db/postgresql-server/files/postgresql-8.3-server.patch b/dev-db/postgresql-server/files/postgresql-8.3-server.patch index da1e812e0b3d..270c07887871 100644 --- a/dev-db/postgresql-server/files/postgresql-8.3-server.patch +++ b/dev-db/postgresql-server/files/postgresql-8.3-server.patch @@ -1,31 +1,18 @@ -=== GNUmakefile.in -================================================================== ---- GNUmakefile.in (revision 14) -+++ GNUmakefile.in (local) -@@ -11,19 +11,16 @@ - all: - $(MAKE) -C doc all - $(MAKE) -C src all -- $(MAKE) -C config all - @echo "All of PostgreSQL successfully made. Ready to install." - - install: - $(MAKE) -C doc $@ - $(MAKE) -C src $@ -- $(MAKE) -C config $@ - @echo "PostgreSQL installation complete." - - installdirs uninstall: - $(MAKE) -C doc $@ - $(MAKE) -C src $@ -- $(MAKE) -C config $@ +diff -Naur postgresql-8.3.3.orig/contrib/adminpack/Makefile postgresql-8.3.3/contrib/adminpack/Makefile +--- postgresql-8.3.3.orig/contrib/adminpack/Makefile 2008-06-14 12:56:41.000000000 +0200 ++++ postgresql-8.3.3/contrib/adminpack/Makefile 2008-06-14 12:57:12.000000000 +0200 +@@ -1,7 +1,7 @@ + # $PostgreSQL: pgsql/contrib/adminpack/Makefile,v 1.6 2007/11/10 23:59:50 momjian Exp $ - distprep: - $(MAKE) -C doc $@ -=== contrib/Makefile -================================================================== ---- contrib/Makefile (revision 14) -+++ contrib/Makefile (local) + MODULE_big = adminpack +-PG_CPPFLAGS = -I$(libpq_srcdir) ++PG_CPPFLAGS = -I$(libpq_srcdir) -I../../src/include/ + DATA_built = adminpack.sql + DATA = uninstall_adminpack.sql + OBJS = adminpack.o +diff -Naur postgresql-8.3.3.orig/contrib/Makefile postgresql-8.3.3/contrib/Makefile +--- postgresql-8.3.3.orig/contrib/Makefile 2008-06-14 12:56:41.000000000 +0200 ++++ postgresql-8.3.3/contrib/Makefile 2008-06-14 12:57:12.000000000 +0200 @@ -20,22 +20,19 @@ isn \ lo \ @@ -50,23 +37,9 @@ ifeq ($(with_openssl),yes) WANTED_DIRS += sslinfo -=== contrib/adminpack/Makefile -================================================================== ---- contrib/adminpack/Makefile (revision 14) -+++ contrib/adminpack/Makefile (local) -@@ -1,7 +1,7 @@ - # $PostgreSQL: pgsql/contrib/adminpack/Makefile,v 1.6 2007/11/10 23:59:50 momjian Exp $ - - MODULE_big = adminpack --PG_CPPFLAGS = -I$(libpq_srcdir) -+PG_CPPFLAGS = -I$(libpq_srcdir) -I../../src/include/ - DATA_built = adminpack.sql - DATA = uninstall_adminpack.sql - OBJS = adminpack.o -=== contrib/uuid-ossp/Makefile -================================================================== ---- contrib/uuid-ossp/Makefile (revision 14) -+++ contrib/uuid-ossp/Makefile (local) +diff -Naur postgresql-8.3.3.orig/contrib/uuid-ossp/Makefile postgresql-8.3.3/contrib/uuid-ossp/Makefile +--- postgresql-8.3.3.orig/contrib/uuid-ossp/Makefile 2008-06-14 12:56:41.000000000 +0200 ++++ postgresql-8.3.3/contrib/uuid-ossp/Makefile 2008-06-14 12:57:12.000000000 +0200 @@ -1,11 +1,13 @@ # $PostgreSQL: pgsql/contrib/uuid-ossp/Makefile,v 1.4 2007/11/13 00:13:19 tgl Exp $ @@ -82,10 +55,83 @@ ifdef USE_PGXS PG_CONFIG = pg_config -=== src/Makefile -================================================================== ---- src/Makefile (revision 14) -+++ src/Makefile (local) +diff -Naur postgresql-8.3.3.orig/contrib/xml2/Makefile postgresql-8.3.3/contrib/xml2/Makefile +--- postgresql-8.3.3.orig/contrib/xml2/Makefile 2008-06-14 12:56:41.000000000 +0200 ++++ postgresql-8.3.3/contrib/xml2/Makefile 2008-06-14 13:21:32.000000000 +0200 +@@ -4,7 +4,8 @@ + + OBJS = $(if $(filter -lxslt, $(LIBS)), xpath.o xslt_proc.o, xpath.o) + +-SHLIB_LINK += $(filter -lxslt, $(LIBS)) $(filter -lxml2, $(LIBS)) ++PG_CPPFLAGS = $(shell xml2-config --cflags) ++SHLIB_LINK += $(shell xml2-config --libs) $(shell xslt-config --libs) + + DATA_built = pgxml.sql + DATA = uninstall_pgxml.sql +diff -Naur postgresql-8.3.3.orig/GNUmakefile.in postgresql-8.3.3/GNUmakefile.in +--- postgresql-8.3.3.orig/GNUmakefile.in 2008-06-14 12:56:41.000000000 +0200 ++++ postgresql-8.3.3/GNUmakefile.in 2008-06-14 12:57:12.000000000 +0200 +@@ -11,19 +11,16 @@ + all: + $(MAKE) -C doc all + $(MAKE) -C src all +- $(MAKE) -C config all + @echo "All of PostgreSQL successfully made. Ready to install." + + install: + $(MAKE) -C doc $@ + $(MAKE) -C src $@ +- $(MAKE) -C config $@ + @echo "PostgreSQL installation complete." + + installdirs uninstall: + $(MAKE) -C doc $@ + $(MAKE) -C src $@ +- $(MAKE) -C config $@ + + distprep: + $(MAKE) -C doc $@ +diff -Naur postgresql-8.3.3.orig/src/bin/initdb/Makefile postgresql-8.3.3/src/bin/initdb/Makefile +--- postgresql-8.3.3.orig/src/bin/initdb/Makefile 2008-06-14 12:56:40.000000000 +0200 ++++ postgresql-8.3.3/src/bin/initdb/Makefile 2008-06-14 12:57:12.000000000 +0200 +@@ -14,7 +14,7 @@ + top_builddir = ../../.. + include $(top_builddir)/src/Makefile.global + +-override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) $(CPPFLAGS) ++override CPPFLAGS := -DFRONTEND -I$(top_srcdir)/src/interfaces/libpq $(CPPFLAGS) + + OBJS= initdb.o encnames.o pqsignal.o $(WIN32RES) + +diff -Naur postgresql-8.3.3.orig/src/bin/Makefile postgresql-8.3.3/src/bin/Makefile +--- postgresql-8.3.3.orig/src/bin/Makefile 2008-06-14 12:56:40.000000000 +0200 ++++ postgresql-8.3.3/src/bin/Makefile 2008-06-14 12:57:12.000000000 +0200 +@@ -13,8 +13,8 @@ + top_builddir = ../.. + include $(top_builddir)/src/Makefile.global + +-DIRS = initdb ipcclean pg_ctl pg_dump \ +- psql scripts pg_config pg_controldata pg_resetxlog ++DIRS = initdb ipcclean pg_ctl \ ++ pg_controldata pg_resetxlog + ifeq ($(PORTNAME), win32) + DIRS+=pgevent + endif +diff -Naur postgresql-8.3.3.orig/src/include/pg_config_manual.h postgresql-8.3.3/src/include/pg_config_manual.h +--- postgresql-8.3.3.orig/src/include/pg_config_manual.h 2008-06-14 12:56:41.000000000 +0200 ++++ postgresql-8.3.3/src/include/pg_config_manual.h 2008-06-14 12:57:12.000000000 +0200 +@@ -184,7 +184,7 @@ + * here's where to twiddle it. You can also override this at runtime + * with the postmaster's -k switch. + */ +-#define DEFAULT_PGSOCKET_DIR "/tmp" ++#define DEFAULT_PGSOCKET_DIR "/var/run/postgresql" + + /* + * The random() function is expected to yield values between 0 and +diff -Naur postgresql-8.3.3.orig/src/Makefile postgresql-8.3.3/src/Makefile +--- postgresql-8.3.3.orig/src/Makefile 2008-06-14 12:56:40.000000000 +0200 ++++ postgresql-8.3.3/src/Makefile 2008-06-14 12:57:12.000000000 +0200 @@ -19,14 +19,11 @@ $(MAKE) -C backend $@ $(MAKE) -C backend/utils/mb/conversion_procs $@ @@ -102,10 +148,9 @@ install-local: installdirs-local $(INSTALL_DATA) Makefile.global '$(DESTDIR)$(pgxsdir)/$(subdir)/Makefile.global' -=== src/Makefile.global.in -================================================================== ---- src/Makefile.global.in (revision 14) -+++ src/Makefile.global.in (local) +diff -Naur postgresql-8.3.3.orig/src/Makefile.global.in postgresql-8.3.3/src/Makefile.global.in +--- postgresql-8.3.3.orig/src/Makefile.global.in 2008-06-14 12:56:41.000000000 +0200 ++++ postgresql-8.3.3/src/Makefile.global.in 2008-06-14 12:57:12.000000000 +0200 @@ -373,10 +373,8 @@ @@ -117,61 +162,18 @@ .PHONY: submake-libpq submake-libpgport -@@ -419,7 +417,9 @@ +@@ -419,6 +417,8 @@ LDFLAGS += $(PROFILE) endif +CFLAGS += -I${top_srcdir}/src/include - + + ########################################################################## # - # substitute implementations of C library routines (see src/port/) -=== src/bin/Makefile -================================================================== ---- src/bin/Makefile (revision 14) -+++ src/bin/Makefile (local) -@@ -13,8 +13,8 @@ - top_builddir = ../.. - include $(top_builddir)/src/Makefile.global - --DIRS = initdb ipcclean pg_ctl pg_dump \ -- psql scripts pg_config pg_controldata pg_resetxlog -+DIRS = initdb ipcclean pg_ctl \ -+ pg_controldata pg_resetxlog - ifeq ($(PORTNAME), win32) - DIRS+=pgevent - endif -=== src/bin/initdb/Makefile -================================================================== ---- src/bin/initdb/Makefile (revision 14) -+++ src/bin/initdb/Makefile (local) -@@ -14,7 +14,7 @@ - top_builddir = ../../.. - include $(top_builddir)/src/Makefile.global - --override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) $(CPPFLAGS) -+override CPPFLAGS := -DFRONTEND -I$(top_srcdir)/src/interfaces/libpq $(CPPFLAGS) - - OBJS= initdb.o encnames.o pqsignal.o $(WIN32RES) - -=== src/include/pg_config_manual.h -================================================================== ---- src/include/pg_config_manual.h (revision 14) -+++ src/include/pg_config_manual.h (local) -@@ -184,7 +184,7 @@ - * here's where to twiddle it. You can also override this at runtime - * with the postmaster's -k switch. - */ --#define DEFAULT_PGSOCKET_DIR "/tmp" -+#define DEFAULT_PGSOCKET_DIR "/var/run/postgresql" - - /* - * The random() function is expected to yield values between 0 and -=== src/port/Makefile -================================================================== ---- src/port/Makefile (revision 14) -+++ src/port/Makefile (local) +diff -Naur postgresql-8.3.3.orig/src/port/Makefile postgresql-8.3.3/src/port/Makefile +--- postgresql-8.3.3.orig/src/port/Makefile 2008-06-14 12:56:40.000000000 +0200 ++++ postgresql-8.3.3/src/port/Makefile 2008-06-14 12:57:12.000000000 +0200 @@ -35,11 +35,10 @@ # foo_srv.o and foo.o are both built from foo.c, but only foo.o has -DFRONTEND OBJS_SRV = $(OBJS:%.o=%_srv.o) @@ -186,10 +188,9 @@ installdirs: $(mkinstalldirs) '$(DESTDIR)$(libdir)' -=== src/test/regress/GNUmakefile -================================================================== ---- src/test/regress/GNUmakefile (revision 14) -+++ src/test/regress/GNUmakefile (local) +diff -Naur postgresql-8.3.3.orig/src/test/regress/GNUmakefile postgresql-8.3.3/src/test/regress/GNUmakefile +--- postgresql-8.3.3.orig/src/test/regress/GNUmakefile 2008-06-14 12:56:40.000000000 +0200 ++++ postgresql-8.3.3/src/test/regress/GNUmakefile 2008-06-14 12:57:12.000000000 +0200 @@ -141,7 +141,7 @@ ## @@ -199,10 +200,9 @@ installcheck: all ./pg_regress --psqldir=$(PSQLDIR) --schedule=$(srcdir)/serial_schedule --srcdir=$(abs_srcdir) --multibyte=$(MULTIBYTE) --load-language=plpgsql $(NOLOCALE) -=== src/test/regress/pg_regress.c -================================================================== ---- src/test/regress/pg_regress.c (revision 14) -+++ src/test/regress/pg_regress.c (local) +diff -Naur postgresql-8.3.3.orig/src/test/regress/pg_regress.c postgresql-8.3.3/src/test/regress/pg_regress.c +--- postgresql-8.3.3.orig/src/test/regress/pg_regress.c 2008-06-14 12:56:40.000000000 +0200 ++++ postgresql-8.3.3/src/test/regress/pg_regress.c 2008-06-14 12:57:12.000000000 +0200 @@ -781,9 +781,6 @@ sprintf(tmp, "%s/install/%s", temp_install, datadir); datadir = tmp; @@ -213,7 +213,7 @@ /* * Set up shared library paths to include the temp install. * -@@ -2053,7 +2050,7 @@ +@@ -2069,7 +2066,7 @@ */ snprintf(buf, sizeof(buf), SYSTEMQUOTE "\"%s/psql\" -X postgres <%s 2>%s" SYSTEMQUOTE, @@ -222,3 +222,2228 @@ for (i = 0; i < 60; i++) { /* Done if psql succeeds */ +diff -Naur postgresql-8.3.3.orig/src/test/regress/pg_regress.c.orig postgresql-8.3.3/src/test/regress/pg_regress.c.orig +--- postgresql-8.3.3.orig/src/test/regress/pg_regress.c.orig 1970-01-01 01:00:00.000000000 +0100 ++++ postgresql-8.3.3/src/test/regress/pg_regress.c.orig 2008-03-31 03:32:01.000000000 +0200 +@@ -0,0 +1,2221 @@ ++/*------------------------------------------------------------------------- ++ * ++ * pg_regress --- regression test driver ++ * ++ * This is a C implementation of the previous shell script for running ++ * the regression tests, and should be mostly compatible with it. ++ * Initial author of C translation: Magnus Hagander ++ * ++ * This code is released under the terms of the PostgreSQL License. ++ * ++ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group ++ * Portions Copyright (c) 1994, Regents of the University of California ++ * ++ * $PostgreSQL: pgsql/src/test/regress/pg_regress.c,v 1.41.2.2 2008/03/31 01:32:01 tgl Exp $ ++ * ++ *------------------------------------------------------------------------- ++ */ ++ ++#include "pg_regress.h" ++ ++#include <ctype.h> ++#include <sys/stat.h> ++#include <sys/wait.h> ++#include <signal.h> ++#include <unistd.h> ++ ++#ifdef HAVE_SYS_RESOURCE_H ++#include <sys/time.h> ++#include <sys/resource.h> ++#endif ++ ++#include "getopt_long.h" ++#include "pg_config_paths.h" ++ ++/* for resultmap we need a list of pairs of strings */ ++typedef struct _resultmap ++{ ++ char *test; ++ char *type; ++ char *resultfile; ++ struct _resultmap *next; ++} _resultmap; ++ ++/* ++ * Values obtained from pg_config_paths.h and Makefile. The PG installation ++ * paths are only used in temp_install mode: we use these strings to find ++ * out where "make install" will put stuff under the temp_install directory. ++ * In non-temp_install mode, the only thing we need is the location of psql, ++ * which we expect to find in psqldir, or in the PATH if psqldir isn't given. ++ */ ++char *bindir = PGBINDIR; ++char *libdir = LIBDIR; ++char *datadir = PGSHAREDIR; ++char *host_platform = HOST_TUPLE; ++ ++#ifndef WIN32_ONLY_COMPILER ++static char *makeprog = MAKEPROG; ++#endif ++ ++#ifndef WIN32 /* not used in WIN32 case */ ++static char *shellprog = SHELLPROG; ++#endif ++ ++/* currently we can use the same diff switches on all platforms */ ++const char *basic_diff_opts = "-w"; ++const char *pretty_diff_opts = "-w -C3"; ++ ++/* options settable from command line */ ++_stringlist *dblist = NULL; ++bool debug = false; ++char *inputdir = "."; ++char *outputdir = "."; ++char *psqldir = NULL; ++static _stringlist *loadlanguage = NULL; ++static int max_connections = 0; ++static char *encoding = NULL; ++static _stringlist *schedulelist = NULL; ++static _stringlist *extra_tests = NULL; ++static char *temp_install = NULL; ++static char *temp_config = NULL; ++static char *top_builddir = NULL; ++static int temp_port = 65432; ++static bool nolocale = false; ++static char *hostname = NULL; ++static int port = -1; ++static char *user = NULL; ++static char *srcdir = NULL; ++static _stringlist *extraroles = NULL; ++ ++/* internal variables */ ++static const char *progname; ++static char *logfilename; ++static FILE *logfile; ++static char *difffilename; ++ ++static _resultmap *resultmap = NULL; ++ ++static PID_TYPE postmaster_pid = INVALID_PID; ++static bool postmaster_running = false; ++ ++static int success_count = 0; ++static int fail_count = 0; ++static int fail_ignore_count = 0; ++ ++static bool directory_exists(const char *dir); ++static void make_directory(const char *dir); ++ ++static void ++header(const char *fmt,...) ++/* This extension allows gcc to check the format string for consistency with ++ the supplied arguments. */ ++__attribute__((format(printf, 1, 2))); ++static void ++status(const char *fmt,...) ++/* This extension allows gcc to check the format string for consistency with ++ the supplied arguments. */ ++__attribute__((format(printf, 1, 2))); ++static void ++psql_command(const char *database, const char *query,...) ++/* This extension allows gcc to check the format string for consistency with ++ the supplied arguments. */ ++__attribute__((format(printf, 2, 3))); ++ ++#ifdef WIN32 ++typedef BOOL(WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_ATTRIBUTES, DWORD, PLUID_AND_ATTRIBUTES, DWORD, PSID_AND_ATTRIBUTES, PHANDLE); ++ ++/* Windows API define missing from MingW headers */ ++#define DISABLE_MAX_PRIVILEGE 0x1 ++#endif ++ ++/* ++ * allow core files if possible. ++ */ ++#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_CORE) ++static void ++unlimit_core_size(void) ++{ ++ struct rlimit lim; ++ ++ getrlimit(RLIMIT_CORE, &lim); ++ if (lim.rlim_max == 0) ++ { ++ fprintf(stderr, ++ _("%s: cannot set core size,: disallowed by hard limit.\n"), ++ progname); ++ return; ++ } ++ else if (lim.rlim_max == RLIM_INFINITY || lim.rlim_cur < lim.rlim_max) ++ { ++ lim.rlim_cur = lim.rlim_max; ++ setrlimit(RLIMIT_CORE, &lim); ++ } ++} ++#endif ++ ++ ++/* ++ * Add an item at the end of a stringlist. ++ */ ++void ++add_stringlist_item(_stringlist ** listhead, const char *str) ++{ ++ _stringlist *newentry = malloc(sizeof(_stringlist)); ++ _stringlist *oldentry; ++ ++ newentry->str = strdup(str); ++ newentry->next = NULL; ++ if (*listhead == NULL) ++ *listhead = newentry; ++ else ++ { ++ for (oldentry = *listhead; oldentry->next; oldentry = oldentry->next) ++ /* skip */ ; ++ oldentry->next = newentry; ++ } ++} ++ ++/* ++ * Free a stringlist. ++ */ ++static void ++free_stringlist(_stringlist ** listhead) ++{ ++ if (listhead == NULL || *listhead == NULL) ++ return; ++ if ((*listhead)->next != NULL) ++ free_stringlist(&((*listhead)->next)); ++ free((*listhead)->str); ++ free(*listhead); ++ *listhead = NULL; ++} ++ ++/* ++ * Split a delimited string into a stringlist ++ */ ++static void ++split_to_stringlist(const char *s, const char *delim, _stringlist ** listhead) ++{ ++ char *sc = strdup(s); ++ char *token = strtok(sc, delim); ++ ++ while (token) ++ { ++ add_stringlist_item(listhead, token); ++ token = strtok(NULL, delim); ++ } ++ free(sc); ++} ++ ++/* ++ * Print a progress banner on stdout. ++ */ ++static void ++header(const char *fmt,...) ++{ ++ char tmp[64]; ++ va_list ap; ++ ++ va_start(ap, fmt); ++ vsnprintf(tmp, sizeof(tmp), fmt, ap); ++ va_end(ap); ++ ++ fprintf(stdout, "============== %-38s ==============\n", tmp); ++ fflush(stdout); ++} ++ ++/* ++ * Print "doing something ..." --- supplied text should not end with newline ++ */ ++static void ++status(const char *fmt,...) ++{ ++ va_list ap; ++ ++ va_start(ap, fmt); ++ vfprintf(stdout, fmt, ap); ++ fflush(stdout); ++ va_end(ap); ++ ++ if (logfile) ++ { ++ va_start(ap, fmt); ++ vfprintf(logfile, fmt, ap); ++ va_end(ap); ++ } ++} ++ ++/* ++ * Done "doing something ..." ++ */ ++static void ++status_end(void) ++{ ++ fprintf(stdout, "\n"); ++ fflush(stdout); ++ if (logfile) ++ fprintf(logfile, "\n"); ++} ++ ++/* ++ * shut down temp postmaster ++ */ ++static void ++stop_postmaster(void) ++{ ++ if (postmaster_running) ++ { ++ /* We use pg_ctl to issue the kill and wait for stop */ ++ char buf[MAXPGPATH * 2]; ++ ++ /* On Windows, system() seems not to force fflush, so... */ ++ fflush(stdout); ++ fflush(stderr); ++ ++ snprintf(buf, sizeof(buf), ++ SYSTEMQUOTE "\"%s/pg_ctl\" stop -D \"%s/data\" -s -m fast" SYSTEMQUOTE, ++ bindir, temp_install); ++ system(buf); /* ignore exit status */ ++ postmaster_running = false; ++ } ++} ++ ++/* ++ * Always exit through here, not through plain exit(), to ensure we make ++ * an effort to shut down a temp postmaster ++ */ ++void ++exit_nicely(int code) ++{ ++ stop_postmaster(); ++ exit(code); ++} ++ ++/* ++ * Check whether string matches pattern ++ * ++ * In the original shell script, this function was implemented using expr(1), ++ * which provides basic regular expressions restricted to match starting at ++ * the string start (in conventional regex terms, there's an implicit "^" ++ * at the start of the pattern --- but no implicit "$" at the end). ++ * ++ * For now, we only support "." and ".*" as non-literal metacharacters, ++ * because that's all that anyone has found use for in resultmap. This ++ * code could be extended if more functionality is needed. ++ */ ++static bool ++string_matches_pattern(const char *str, const char *pattern) ++{ ++ while (*str && *pattern) ++ { ++ if (*pattern == '.' && pattern[1] == '*') ++ { ++ pattern += 2; ++ /* Trailing .* matches everything. */ ++ if (*pattern == '\0') ++ return true; ++ ++ /* ++ * Otherwise, scan for a text position at which we can match the ++ * rest of the pattern. ++ */ ++ while (*str) ++ { ++ /* ++ * Optimization to prevent most recursion: don't recurse ++ * unless first pattern char might match this text char. ++ */ ++ if (*str == *pattern || *pattern == '.') ++ { ++ if (string_matches_pattern(str, pattern)) ++ return true; ++ } ++ ++ str++; ++ } ++ ++ /* ++ * End of text with no match. ++ */ ++ return false; ++ } ++ else if (*pattern != '.' && *str != *pattern) ++ { ++ /* ++ * Not the single-character wildcard and no explicit match? Then ++ * time to quit... ++ */ ++ return false; ++ } ++ ++ str++; ++ pattern++; ++ } ++ ++ if (*pattern == '\0') ++ return true; /* end of pattern, so declare match */ ++ ++ /* End of input string. Do we have matching pattern remaining? */ ++ while (*pattern == '.' && pattern[1] == '*') ++ pattern += 2; ++ if (*pattern == '\0') ++ return true; /* end of pattern, so declare match */ ++ ++ return false; ++} ++ ++/* ++ * Replace all occurances of a string in a string with a different string. ++ * NOTE: Assumes there is enough room in the target buffer! ++ */ ++void ++replace_string(char *string, char *replace, char *replacement) ++{ ++ char *ptr; ++ ++ while ((ptr = strstr(string, replace)) != NULL) ++ { ++ char *dup = strdup(string); ++ ++ strlcpy(string, dup, ptr - string + 1); ++ strcat(string, replacement); ++ strcat(string, dup + (ptr - string) + strlen(replace)); ++ free(dup); ++ } ++} ++ ++/* ++ * Convert *.source found in the "source" directory, replacing certain tokens ++ * in the file contents with their intended values, and put the resulting files ++ * in the "dest" directory, replacing the ".source" prefix in their names with ++ * the given suffix. ++ */ ++static void ++convert_sourcefiles_in(char *source, char *dest, char *suffix) ++{ ++ char abs_srcdir[MAXPGPATH]; ++ char abs_builddir[MAXPGPATH]; ++ char testtablespace[MAXPGPATH]; ++ char indir[MAXPGPATH]; ++ struct stat st; ++ int ret; ++ char **name; ++ char **names; ++ int count = 0; ++ ++#ifdef WIN32 ++ char *c; ++#endif ++ ++ if (!getcwd(abs_builddir, sizeof(abs_builddir))) ++ { ++ fprintf(stderr, _("%s: could not get current directory: %s\n"), ++ progname, strerror(errno)); ++ exit_nicely(2); ++ } ++ ++ /* ++ * in a VPATH build, use the provided source directory; otherwise, use the ++ * current directory. ++ */ ++ if (srcdir) ++ strlcpy(abs_srcdir, srcdir, MAXPGPATH); ++ else ++ strlcpy(abs_srcdir, abs_builddir, MAXPGPATH); ++ ++ snprintf(indir, MAXPGPATH, "%s/%s", abs_srcdir, source); ++ ++ /* Check that indir actually exists and is a directory */ ++ ret = stat(indir, &st); ++ if (ret != 0 || !S_ISDIR(st.st_mode)) ++ { ++ /* ++ * No warning, to avoid noise in tests that do not have ++ * these directories; for example, ecpg, contrib and src/pl. ++ */ ++ return; ++ } ++ ++ names = pgfnames(indir); ++ if (!names) ++ /* Error logged in pgfnames */ ++ exit_nicely(2); ++ ++#ifdef WIN32 ++ /* in Win32, replace backslashes with forward slashes */ ++ for (c = abs_builddir; *c; c++) ++ if (*c == '\\') ++ *c = '/'; ++ for (c = abs_srcdir; *c; c++) ++ if (*c == '\\') ++ *c = '/'; ++#endif ++ ++ snprintf(testtablespace, MAXPGPATH, "%s/testtablespace", abs_builddir); ++ ++#ifdef WIN32 ++ /* ++ * On Windows only, clean out the test tablespace dir, or create it if it ++ * doesn't exist. On other platforms we expect the Makefile to take ++ * care of that. (We don't migrate that functionality in here because ++ * it'd be harder to cope with platform-specific issues such as SELinux.) ++ * ++ * XXX it would be better if pg_regress.c had nothing at all to do with ++ * testtablespace, and this were handled by a .BAT file or similar on ++ * Windows. See pgsql-hackers discussion of 2008-01-18. ++ */ ++ if (directory_exists(testtablespace)) ++ rmtree(testtablespace, true); ++ make_directory(testtablespace); ++#endif ++ ++ /* finally loop on each file and do the replacement */ ++ for (name = names; *name; name++) ++ { ++ char srcfile[MAXPGPATH]; ++ char destfile[MAXPGPATH]; ++ char prefix[MAXPGPATH]; ++ FILE *infile, ++ *outfile; ++ char line[1024]; ++ ++ /* reject filenames not finishing in ".source" */ ++ if (strlen(*name) < 8) ++ continue; ++ if (strcmp(*name + strlen(*name) - 7, ".source") != 0) ++ continue; ++ ++ count++; ++ ++ /* build the full actual paths to open */ ++ snprintf(prefix, strlen(*name) - 6, "%s", *name); ++ snprintf(srcfile, MAXPGPATH, "%s/%s", indir, *name); ++ snprintf(destfile, MAXPGPATH, "%s/%s.%s", dest, prefix, suffix); ++ ++ infile = fopen(srcfile, "r"); ++ if (!infile) ++ { ++ fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), ++ progname, srcfile, strerror(errno)); ++ exit_nicely(2); ++ } ++ outfile = fopen(destfile, "w"); ++ if (!outfile) ++ { ++ fprintf(stderr, _("%s: could not open file \"%s\" for writing: %s\n"), ++ progname, destfile, strerror(errno)); ++ exit_nicely(2); ++ } ++ while (fgets(line, sizeof(line), infile)) ++ { ++ replace_string(line, "@abs_srcdir@", abs_srcdir); ++ replace_string(line, "@abs_builddir@", abs_builddir); ++ replace_string(line, "@testtablespace@", testtablespace); ++ replace_string(line, "@DLSUFFIX@", DLSUFFIX); ++ fputs(line, outfile); ++ } ++ fclose(infile); ++ fclose(outfile); ++ } ++ ++ /* ++ * If we didn't process any files, complain because it probably means ++ * somebody neglected to pass the needed --srcdir argument. ++ */ ++ if (count <= 0) ++ { ++ fprintf(stderr, _("%s: no *.source files found in %s\n"), ++ progname, indir); ++ exit_nicely(2); ++ } ++ ++ pgfnames_cleanup(names); ++} ++ ++/* Create the .sql and .out files from the .source files, if any */ ++static void ++convert_sourcefiles(void) ++{ ++ convert_sourcefiles_in("input", "sql", "sql"); ++ convert_sourcefiles_in("output", "expected", "out"); ++} ++ ++/* ++ * Scan resultmap file to find which platform-specific expected files to use. ++ * ++ * The format of each line of the file is ++ * testname/hostplatformpattern=substitutefile ++ * where the hostplatformpattern is evaluated per the rules of expr(1), ++ * namely, it is a standard regular expression with an implicit ^ at the start. ++ * (We currently support only a very limited subset of regular expressions, ++ * see string_matches_pattern() above.) What hostplatformpattern will be ++ * matched against is the config.guess output. (In the shell-script version, ++ * we also provided an indication of whether gcc or another compiler was in ++ * use, but that facility isn't used anymore.) ++ */ ++static void ++load_resultmap(void) ++{ ++ char buf[MAXPGPATH]; ++ FILE *f; ++ ++ /* scan the file ... */ ++ snprintf(buf, sizeof(buf), "%s/resultmap", inputdir); ++ f = fopen(buf, "r"); ++ if (!f) ++ { ++ /* OK if it doesn't exist, else complain */ ++ if (errno == ENOENT) ++ return; ++ fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), ++ progname, buf, strerror(errno)); ++ exit_nicely(2); ++ } ++ ++ while (fgets(buf, sizeof(buf), f)) ++ { ++ char *platform; ++ char *file_type; ++ char *expected; ++ int i; ++ ++ /* strip trailing whitespace, especially the newline */ ++ i = strlen(buf); ++ while (i > 0 && isspace((unsigned char) buf[i - 1])) ++ buf[--i] = '\0'; ++ ++ /* parse out the line fields */ ++ file_type = strchr(buf, ':'); ++ if (!file_type) ++ { ++ fprintf(stderr, _("incorrectly formatted resultmap entry: %s\n"), ++ buf); ++ exit_nicely(2); ++ } ++ *file_type++ = '\0'; ++ ++ platform = strchr(file_type, ':'); ++ if (!platform) ++ { ++ fprintf(stderr, _("incorrectly formatted resultmap entry: %s\n"), ++ buf); ++ exit_nicely(2); ++ } ++ *platform++ = '\0'; ++ expected = strchr(platform, '='); ++ if (!expected) ++ { ++ fprintf(stderr, _("incorrectly formatted resultmap entry: %s\n"), ++ buf); ++ exit_nicely(2); ++ } ++ *expected++ = '\0'; ++ ++ /* ++ * if it's for current platform, save it in resultmap list. Note: by ++ * adding at the front of the list, we ensure that in ambiguous cases, ++ * the last match in the resultmap file is used. This mimics the ++ * behavior of the old shell script. ++ */ ++ if (string_matches_pattern(host_platform, platform)) ++ { ++ _resultmap *entry = malloc(sizeof(_resultmap)); ++ ++ entry->test = strdup(buf); ++ entry->type = strdup(file_type); ++ entry->resultfile = strdup(expected); ++ entry->next = resultmap; ++ resultmap = entry; ++ } ++ } ++ fclose(f); ++} ++ ++/* ++ * Check in resultmap if we should be looking at a different file ++ */ ++static ++const char * ++get_expectfile(const char *testname, const char *file) ++{ ++ char *file_type; ++ _resultmap *rm; ++ ++ /* ++ * Determine the file type from the file name. This is just what is ++ * following the last dot in the file name. ++ */ ++ if (!file || !(file_type = strrchr(file, '.'))) ++ return NULL; ++ ++ file_type++; ++ ++ for (rm = resultmap; rm != NULL; rm = rm->next) ++ { ++ if (strcmp(testname, rm->test) == 0 && strcmp(file_type, rm->type) == 0) ++ { ++ return rm->resultfile; ++ } ++ } ++ ++ return NULL; ++} ++ ++/* ++ * Handy subroutine for setting an environment variable "var" to "val" ++ */ ++static void ++doputenv(const char *var, const char *val) ++{ ++ char *s = malloc(strlen(var) + strlen(val) + 2); ++ ++ sprintf(s, "%s=%s", var, val); ++ putenv(s); ++} ++ ++/* ++ * Set the environment variable "pathname", prepending "addval" to its ++ * old value (if any). ++ */ ++static void ++add_to_path(const char *pathname, char separator, const char *addval) ++{ ++ char *oldval = getenv(pathname); ++ char *newval; ++ ++ if (!oldval || !oldval[0]) ++ { ++ /* no previous value */ ++ newval = malloc(strlen(pathname) + strlen(addval) + 2); ++ sprintf(newval, "%s=%s", pathname, addval); ++ } ++ else ++ { ++ newval = malloc(strlen(pathname) + strlen(addval) + strlen(oldval) + 3); ++ sprintf(newval, "%s=%s%c%s", pathname, addval, separator, oldval); ++ } ++ putenv(newval); ++} ++ ++/* ++ * Prepare environment variables for running regression tests ++ */ ++static void ++initialize_environment(void) ++{ ++ char *tmp; ++ ++ /* ++ * Clear out any non-C locale settings ++ */ ++ unsetenv("LC_COLLATE"); ++ unsetenv("LC_CTYPE"); ++ unsetenv("LC_MONETARY"); ++ unsetenv("LC_MESSAGES"); ++ unsetenv("LC_NUMERIC"); ++ unsetenv("LC_TIME"); ++ unsetenv("LC_ALL"); ++ unsetenv("LANG"); ++ unsetenv("LANGUAGE"); ++ /* On Windows the default locale cannot be English, so force it */ ++#if defined(WIN32) || defined(__CYGWIN__) ++ putenv("LANG=en"); ++#endif ++ ++ /* ++ * Set multibyte as requested ++ */ ++ if (encoding) ++ doputenv("PGCLIENTENCODING", encoding); ++ else ++ unsetenv("PGCLIENTENCODING"); ++ ++ /* ++ * Set timezone and datestyle for datetime-related tests ++ */ ++ putenv("PGTZ=PST8PDT"); ++ putenv("PGDATESTYLE=Postgres, MDY"); ++ ++ if (temp_install) ++ { ++ /* ++ * Clear out any environment vars that might cause psql to connect to ++ * the wrong postmaster, or otherwise behave in nondefault ways. (Note ++ * we also use psql's -X switch consistently, so that ~/.psqlrc files ++ * won't mess things up.) Also, set PGPORT to the temp port, and set ++ * or unset PGHOST depending on whether we are using TCP or Unix ++ * sockets. ++ */ ++ unsetenv("PGDATABASE"); ++ unsetenv("PGUSER"); ++ unsetenv("PGSERVICE"); ++ unsetenv("PGSSLMODE"); ++ unsetenv("PGREQUIRESSL"); ++ unsetenv("PGCONNECT_TIMEOUT"); ++ unsetenv("PGDATA"); ++ if (hostname != NULL) ++ doputenv("PGHOST", hostname); ++ else ++ unsetenv("PGHOST"); ++ unsetenv("PGHOSTADDR"); ++ if (port != -1) ++ { ++ char s[16]; ++ ++ sprintf(s, "%d", port); ++ doputenv("PGPORT", s); ++ } ++ ++ /* ++ * Adjust path variables to point into the temp-install tree ++ */ ++ tmp = malloc(strlen(temp_install) + 32 + strlen(bindir)); ++ sprintf(tmp, "%s/install/%s", temp_install, bindir); ++ bindir = tmp; ++ ++ tmp = malloc(strlen(temp_install) + 32 + strlen(libdir)); ++ sprintf(tmp, "%s/install/%s", temp_install, libdir); ++ libdir = tmp; ++ ++ tmp = malloc(strlen(temp_install) + 32 + strlen(datadir)); ++ sprintf(tmp, "%s/install/%s", temp_install, datadir); ++ datadir = tmp; ++ ++ /* psql will be installed into temp-install bindir */ ++ psqldir = bindir; ++ ++ /* ++ * Set up shared library paths to include the temp install. ++ * ++ * LD_LIBRARY_PATH covers many platforms. DYLD_LIBRARY_PATH works on ++ * Darwin, and maybe other Mach-based systems. LIBPATH is for AIX. ++ * Windows needs shared libraries in PATH (only those linked into ++ * executables, not dlopen'ed ones). Feel free to account for others ++ * as well. ++ */ ++ add_to_path("LD_LIBRARY_PATH", ':', libdir); ++ add_to_path("DYLD_LIBRARY_PATH", ':', libdir); ++ add_to_path("LIBPATH", ':', libdir); ++#if defined(WIN32) || defined(__CYGWIN__) ++ add_to_path("PATH", ';', libdir); ++#endif ++ } ++ else ++ { ++ const char *pghost; ++ const char *pgport; ++ ++ /* ++ * When testing an existing install, we honor existing environment ++ * variables, except if they're overridden by command line options. ++ */ ++ if (hostname != NULL) ++ { ++ doputenv("PGHOST", hostname); ++ unsetenv("PGHOSTADDR"); ++ } ++ if (port != -1) ++ { ++ char s[16]; ++ ++ sprintf(s, "%d", port); ++ doputenv("PGPORT", s); ++ } ++ if (user != NULL) ++ doputenv("PGUSER", user); ++ ++ /* ++ * Report what we're connecting to ++ */ ++ pghost = getenv("PGHOST"); ++ pgport = getenv("PGPORT"); ++#ifndef HAVE_UNIX_SOCKETS ++ if (!pghost) ++ pghost = "localhost"; ++#endif ++ ++ if (pghost && pgport) ++ printf(_("(using postmaster on %s, port %s)\n"), pghost, pgport); ++ if (pghost && !pgport) ++ printf(_("(using postmaster on %s, default port)\n"), pghost); ++ if (!pghost && pgport) ++ printf(_("(using postmaster on Unix socket, port %s)\n"), pgport); ++ if (!pghost && !pgport) ++ printf(_("(using postmaster on Unix socket, default port)\n")); ++ } ++ ++ convert_sourcefiles(); ++ load_resultmap(); ++} ++ ++/* ++ * Issue a command via psql, connecting to the specified database ++ * ++ * Since we use system(), this doesn't return until the operation finishes ++ */ ++static void ++psql_command(const char *database, const char *query,...) ++{ ++ char query_formatted[1024]; ++ char query_escaped[2048]; ++ char psql_cmd[MAXPGPATH + 2048]; ++ va_list args; ++ char *s; ++ char *d; ++ ++ /* Generate the query with insertion of sprintf arguments */ ++ va_start(args, query); ++ vsnprintf(query_formatted, sizeof(query_formatted), query, args); ++ va_end(args); ++ ++ /* Now escape any shell double-quote metacharacters */ ++ d = query_escaped; ++ for (s = query_formatted; *s; s++) ++ { ++ if (strchr("\\\"$`", *s)) ++ *d++ = '\\'; ++ *d++ = *s; ++ } ++ *d = '\0'; ++ ++ /* And now we can build and execute the shell command */ ++ snprintf(psql_cmd, sizeof(psql_cmd), ++ SYSTEMQUOTE "\"%s%spsql\" -X -c \"%s\" \"%s\"" SYSTEMQUOTE, ++ psqldir ? psqldir : "", ++ psqldir ? "/" : "", ++ query_escaped, ++ database); ++ ++ if (system(psql_cmd) != 0) ++ { ++ /* psql probably already reported the error */ ++ fprintf(stderr, _("command failed: %s\n"), psql_cmd); ++ exit_nicely(2); ++ } ++} ++ ++/* ++ * Spawn a process to execute the given shell command; don't wait for it ++ * ++ * Returns the process ID (or HANDLE) so we can wait for it later ++ */ ++PID_TYPE ++spawn_process(const char *cmdline) ++{ ++#ifndef WIN32 ++ pid_t pid; ++ ++ /* ++ * Must flush I/O buffers before fork. Ideally we'd use fflush(NULL) here ++ * ... does anyone still care about systems where that doesn't work? ++ */ ++ fflush(stdout); ++ fflush(stderr); ++ if (logfile) ++ fflush(logfile); ++ ++ pid = fork(); ++ if (pid == -1) ++ { ++ fprintf(stderr, _("%s: could not fork: %s\n"), ++ progname, strerror(errno)); ++ exit_nicely(2); ++ } ++ if (pid == 0) ++ { ++ /* ++ * In child ++ * ++ * Instead of using system(), exec the shell directly, and tell it to ++ * "exec" the command too. This saves two useless processes per ++ * parallel test case. ++ */ ++ char *cmdline2 = malloc(strlen(cmdline) + 6); ++ ++ sprintf(cmdline2, "exec %s", cmdline); ++ execl(shellprog, shellprog, "-c", cmdline2, (char *) NULL); ++ fprintf(stderr, _("%s: could not exec \"%s\": %s\n"), ++ progname, shellprog, strerror(errno)); ++ exit(1); /* not exit_nicely here... */ ++ } ++ /* in parent */ ++ return pid; ++#else ++ char *cmdline2; ++ BOOL b; ++ STARTUPINFO si; ++ PROCESS_INFORMATION pi; ++ HANDLE origToken; ++ HANDLE restrictedToken; ++ SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY}; ++ SID_AND_ATTRIBUTES dropSids[2]; ++ __CreateRestrictedToken _CreateRestrictedToken = NULL; ++ HANDLE Advapi32Handle; ++ ++ ZeroMemory(&si, sizeof(si)); ++ si.cb = sizeof(si); ++ ++ Advapi32Handle = LoadLibrary("ADVAPI32.DLL"); ++ if (Advapi32Handle != NULL) ++ { ++ _CreateRestrictedToken = (__CreateRestrictedToken) GetProcAddress(Advapi32Handle, "CreateRestrictedToken"); ++ } ++ ++ if (_CreateRestrictedToken == NULL) ++ { ++ if (Advapi32Handle != NULL) ++ FreeLibrary(Advapi32Handle); ++ fprintf(stderr, "ERROR: cannot create restricted tokens on this platform\n"); ++ exit_nicely(2); ++ } ++ ++ /* Open the current token to use as base for the restricted one */ ++ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &origToken)) ++ { ++ fprintf(stderr, "could not open process token: %lu\n", GetLastError()); ++ exit_nicely(2); ++ } ++ ++ /* Allocate list of SIDs to remove */ ++ ZeroMemory(&dropSids, sizeof(dropSids)); ++ if (!AllocateAndInitializeSid(&NtAuthority, 2, ++ SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &dropSids[0].Sid) || ++ !AllocateAndInitializeSid(&NtAuthority, 2, ++ SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_POWER_USERS, 0, 0, 0, 0, 0, 0, &dropSids[1].Sid)) ++ { ++ fprintf(stderr, "could not allocate SIDs: %lu\n", GetLastError()); ++ exit_nicely(2); ++ } ++ ++ b = _CreateRestrictedToken(origToken, ++ DISABLE_MAX_PRIVILEGE, ++ sizeof(dropSids) / sizeof(dropSids[0]), ++ dropSids, ++ 0, NULL, ++ 0, NULL, ++ &restrictedToken); ++ ++ FreeSid(dropSids[1].Sid); ++ FreeSid(dropSids[0].Sid); ++ CloseHandle(origToken); ++ FreeLibrary(Advapi32Handle); ++ ++ if (!b) ++ { ++ fprintf(stderr, "could not create restricted token: %lu\n", GetLastError()); ++ exit_nicely(2); ++ } ++ ++ cmdline2 = malloc(strlen(cmdline) + 8); ++ sprintf(cmdline2, "cmd /c %s", cmdline); ++ ++ if (!CreateProcessAsUser(restrictedToken, ++ NULL, ++ cmdline2, ++ NULL, ++ NULL, ++ TRUE, ++ CREATE_SUSPENDED, ++ NULL, ++ NULL, ++ &si, ++ &pi)) ++ { ++ fprintf(stderr, _("could not start process for \"%s\": %lu\n"), ++ cmdline2, GetLastError()); ++ exit_nicely(2); ++ } ++ ++#ifndef __CYGWIN__ ++ AddUserToDacl(pi.hProcess); ++#endif ++ ++ free(cmdline2); ++ ++ ResumeThread(pi.hThread); ++ CloseHandle(pi.hThread); ++ return pi.hProcess; ++#endif ++} ++ ++/* ++ * Count bytes in file ++ */ ++static long ++file_size(const char *file) ++{ ++ long r; ++ FILE *f = fopen(file, "r"); ++ ++ if (!f) ++ { ++ fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), ++ progname, file, strerror(errno)); ++ return -1; ++ } ++ fseek(f, 0, SEEK_END); ++ r = ftell(f); ++ fclose(f); ++ return r; ++} ++ ++/* ++ * Count lines in file ++ */ ++static int ++file_line_count(const char *file) ++{ ++ int c; ++ int l = 0; ++ FILE *f = fopen(file, "r"); ++ ++ if (!f) ++ { ++ fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), ++ progname, file, strerror(errno)); ++ return -1; ++ } ++ while ((c = fgetc(f)) != EOF) ++ { ++ if (c == '\n') ++ l++; ++ } ++ fclose(f); ++ return l; ++} ++ ++static bool ++file_exists(const char *file) ++{ ++ FILE *f = fopen(file, "r"); ++ ++ if (!f) ++ return false; ++ fclose(f); ++ return true; ++} ++ ++static bool ++directory_exists(const char *dir) ++{ ++ struct stat st; ++ ++ if (stat(dir, &st) != 0) ++ return false; ++ if (S_ISDIR(st.st_mode)) ++ return true; ++ return false; ++} ++ ++/* Create a directory */ ++static void ++make_directory(const char *dir) ++{ ++ if (mkdir(dir, S_IRWXU | S_IRWXG | S_IRWXO) < 0) ++ { ++ fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"), ++ progname, dir, strerror(errno)); ++ exit_nicely(2); ++ } ++} ++ ++/* ++ * In: filename.ext, Return: filename_i.ext, where 0 < i <= 9 ++ */ ++static char * ++get_alternative_expectfile(const char *expectfile, int i) ++{ ++ char *last_dot; ++ int ssize = strlen(expectfile) + 2 + 1; ++ char *tmp = (char *) malloc(ssize); ++ char *s = (char *) malloc(ssize); ++ ++ strcpy(tmp, expectfile); ++ last_dot = strrchr(tmp, '.'); ++ if (!last_dot) ++ return NULL; ++ *last_dot = '\0'; ++ snprintf(s, ssize, "%s_%d.%s", tmp, i, last_dot + 1); ++ free(tmp); ++ return s; ++} ++ ++/* ++ * Run a "diff" command and also check that it didn't crash ++ */ ++static int ++run_diff(const char *cmd, const char *filename) ++{ ++ int r; ++ ++ r = system(cmd); ++ if (!WIFEXITED(r) || WEXITSTATUS(r) > 1) ++ { ++ fprintf(stderr, _("diff command failed with status %d: %s\n"), r, cmd); ++ exit_nicely(2); ++ } ++#ifdef WIN32 ++ ++ /* ++ * On WIN32, if the 'diff' command cannot be found, system() returns 1, ++ * but produces nothing to stdout, so we check for that here. ++ */ ++ if (WEXITSTATUS(r) == 1 && file_size(filename) <= 0) ++ { ++ fprintf(stderr, _("diff command not found: %s\n"), cmd); ++ exit_nicely(2); ++ } ++#endif ++ ++ return WEXITSTATUS(r); ++} ++ ++/* ++ * Check the actual result file for the given test against expected results ++ * ++ * Returns true if different (failure), false if correct match found. ++ * In the true case, the diff is appended to the diffs file. ++ */ ++static bool ++results_differ(const char *testname, const char *resultsfile, const char *default_expectfile) ++{ ++ char expectfile[MAXPGPATH]; ++ char diff[MAXPGPATH]; ++ char cmd[MAXPGPATH * 3]; ++ char best_expect_file[MAXPGPATH]; ++ FILE *difffile; ++ int best_line_count; ++ int i; ++ int l; ++ const char *platform_expectfile; ++ ++ /* ++ * We can pass either the resultsfile or the expectfile, they should have ++ * the same type (filename.type) anyway. ++ */ ++ platform_expectfile = get_expectfile(testname, resultsfile); ++ ++ strcpy(expectfile, default_expectfile); ++ if (platform_expectfile) ++ { ++ /* ++ * Replace everything afer the last slash in expectfile with what the ++ * platform_expectfile contains. ++ */ ++ char *p = strrchr(expectfile, '/'); ++ ++ if (p) ++ strcpy(++p, platform_expectfile); ++ } ++ ++ /* Name to use for temporary diff file */ ++ snprintf(diff, sizeof(diff), "%s.diff", resultsfile); ++ ++ /* OK, run the diff */ ++ snprintf(cmd, sizeof(cmd), ++ SYSTEMQUOTE "diff %s \"%s\" \"%s\" > \"%s\"" SYSTEMQUOTE, ++ basic_diff_opts, expectfile, resultsfile, diff); ++ ++ /* Is the diff file empty? */ ++ if (run_diff(cmd, diff) == 0) ++ { ++ unlink(diff); ++ return false; ++ } ++ ++ /* There may be secondary comparison files that match better */ ++ best_line_count = file_line_count(diff); ++ strcpy(best_expect_file, expectfile); ++ ++ for (i = 0; i <= 9; i++) ++ { ++ char *alt_expectfile; ++ ++ alt_expectfile = get_alternative_expectfile(expectfile, i); ++ if (!file_exists(alt_expectfile)) ++ continue; ++ ++ snprintf(cmd, sizeof(cmd), ++ SYSTEMQUOTE "diff %s \"%s\" \"%s\" > \"%s\"" SYSTEMQUOTE, ++ basic_diff_opts, alt_expectfile, resultsfile, diff); ++ ++ if (run_diff(cmd, diff) == 0) ++ { ++ unlink(diff); ++ return false; ++ } ++ ++ l = file_line_count(diff); ++ if (l < best_line_count) ++ { ++ /* This diff was a better match than the last one */ ++ best_line_count = l; ++ strcpy(best_expect_file, alt_expectfile); ++ } ++ free(alt_expectfile); ++ } ++ ++ /* ++ * fall back on the canonical results file if we haven't tried it yet and ++ * haven't found a complete match yet. ++ */ ++ ++ if (platform_expectfile) ++ { ++ snprintf(cmd, sizeof(cmd), ++ SYSTEMQUOTE "diff %s \"%s\" \"%s\" > \"%s\"" SYSTEMQUOTE, ++ basic_diff_opts, default_expectfile, resultsfile, diff); ++ ++ if (run_diff(cmd, diff) == 0) ++ { ++ /* No diff = no changes = good */ ++ unlink(diff); ++ return false; ++ } ++ ++ l = file_line_count(diff); ++ if (l < best_line_count) ++ { ++ /* This diff was a better match than the last one */ ++ best_line_count = l; ++ strcpy(best_expect_file, default_expectfile); ++ } ++ } ++ ++ /* ++ * Use the best comparison file to generate the "pretty" diff, which we ++ * append to the diffs summary file. ++ */ ++ snprintf(cmd, sizeof(cmd), ++ SYSTEMQUOTE "diff %s \"%s\" \"%s\" >> \"%s\"" SYSTEMQUOTE, ++ pretty_diff_opts, best_expect_file, resultsfile, difffilename); ++ run_diff(cmd, difffilename); ++ ++ /* And append a separator */ ++ difffile = fopen(difffilename, "a"); ++ if (difffile) ++ { ++ fprintf(difffile, ++ "\n======================================================================\n\n"); ++ fclose(difffile); ++ } ++ ++ unlink(diff); ++ return true; ++} ++ ++/* ++ * Wait for specified subprocesses to finish ++ * ++ * If names isn't NULL, report each subprocess as it finishes ++ * ++ * Note: it's OK to scribble on the pids array, but not on the names array ++ */ ++static void ++wait_for_tests(PID_TYPE * pids, char **names, int num_tests) ++{ ++ int tests_left; ++ int i; ++ ++#ifdef WIN32 ++ PID_TYPE *active_pids = malloc(num_tests * sizeof(PID_TYPE)); ++ ++ memcpy(active_pids, pids, num_tests * sizeof(PID_TYPE)); ++#endif ++ ++ tests_left = num_tests; ++ while (tests_left > 0) ++ { ++ PID_TYPE p; ++ ++#ifndef WIN32 ++ p = wait(NULL); ++ ++ if (p == INVALID_PID) ++ { ++ fprintf(stderr, _("failed to wait for subprocesses: %s\n"), ++ strerror(errno)); ++ exit_nicely(2); ++ } ++#else ++ int r; ++ ++ r = WaitForMultipleObjects(tests_left, active_pids, FALSE, INFINITE); ++ if (r < WAIT_OBJECT_0 || r >= WAIT_OBJECT_0 + tests_left) ++ { ++ fprintf(stderr, _("failed to wait for subprocesses: %lu\n"), ++ GetLastError()); ++ exit_nicely(2); ++ } ++ p = active_pids[r - WAIT_OBJECT_0]; ++ /* compact the active_pids array */ ++ active_pids[r - WAIT_OBJECT_0] = active_pids[tests_left - 1]; ++#endif /* WIN32 */ ++ ++ for (i = 0; i < num_tests; i++) ++ { ++ if (p == pids[i]) ++ { ++#ifdef WIN32 ++ CloseHandle(pids[i]); ++#endif ++ pids[i] = INVALID_PID; ++ if (names) ++ status(" %s", names[i]); ++ tests_left--; ++ break; ++ } ++ } ++ } ++ ++#ifdef WIN32 ++ free(active_pids); ++#endif ++} ++ ++/* ++ * Run all the tests specified in one schedule file ++ */ ++static void ++run_schedule(const char *schedule, test_function tfunc) ++{ ++#define MAX_PARALLEL_TESTS 100 ++ char *tests[MAX_PARALLEL_TESTS]; ++ _stringlist *resultfiles[MAX_PARALLEL_TESTS]; ++ _stringlist *expectfiles[MAX_PARALLEL_TESTS]; ++ _stringlist *tags[MAX_PARALLEL_TESTS]; ++ PID_TYPE pids[MAX_PARALLEL_TESTS]; ++ _stringlist *ignorelist = NULL; ++ char scbuf[1024]; ++ FILE *scf; ++ int line_num = 0; ++ ++ memset(resultfiles, 0, sizeof(_stringlist *) * MAX_PARALLEL_TESTS); ++ memset(expectfiles, 0, sizeof(_stringlist *) * MAX_PARALLEL_TESTS); ++ memset(tags, 0, sizeof(_stringlist *) * MAX_PARALLEL_TESTS); ++ ++ scf = fopen(schedule, "r"); ++ if (!scf) ++ { ++ fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), ++ progname, schedule, strerror(errno)); ++ exit_nicely(2); ++ } ++ ++ while (fgets(scbuf, sizeof(scbuf), scf)) ++ { ++ char *test = NULL; ++ char *c; ++ int num_tests; ++ bool inword; ++ int i; ++ ++ line_num++; ++ ++ for (i = 0; i < MAX_PARALLEL_TESTS; i++) ++ { ++ if (resultfiles[i] == NULL) ++ break; ++ free_stringlist(&resultfiles[i]); ++ free_stringlist(&expectfiles[i]); ++ free_stringlist(&tags[i]); ++ } ++ ++ /* strip trailing whitespace, especially the newline */ ++ i = strlen(scbuf); ++ while (i > 0 && isspace((unsigned char) scbuf[i - 1])) ++ scbuf[--i] = '\0'; ++ ++ if (scbuf[0] == '\0' || scbuf[0] == '#') ++ continue; ++ if (strncmp(scbuf, "test: ", 6) == 0) ++ test = scbuf + 6; ++ else if (strncmp(scbuf, "ignore: ", 8) == 0) ++ { ++ c = scbuf + 8; ++ while (*c && isspace((unsigned char) *c)) ++ c++; ++ add_stringlist_item(&ignorelist, c); ++ ++ /* ++ * Note: ignore: lines do not run the test, they just say that ++ * failure of this test when run later on is to be ignored. A bit ++ * odd but that's how the shell-script version did it. ++ */ ++ continue; ++ } ++ else ++ { ++ fprintf(stderr, _("syntax error in schedule file \"%s\" line %d: %s\n"), ++ schedule, line_num, scbuf); ++ exit_nicely(2); ++ } ++ ++ num_tests = 0; ++ inword = false; ++ for (c = test; *c; c++) ++ { ++ if (isspace((unsigned char) *c)) ++ { ++ *c = '\0'; ++ inword = false; ++ } ++ else if (!inword) ++ { ++ if (num_tests >= MAX_PARALLEL_TESTS) ++ { ++ /* can't print scbuf here, it's already been trashed */ ++ fprintf(stderr, _("too many parallel tests in schedule file \"%s\", line %d\n"), ++ schedule, line_num); ++ exit_nicely(2); ++ } ++ tests[num_tests] = c; ++ num_tests++; ++ inword = true; ++ } ++ } ++ ++ if (num_tests == 0) ++ { ++ fprintf(stderr, _("syntax error in schedule file \"%s\" line %d: %s\n"), ++ schedule, line_num, scbuf); ++ exit_nicely(2); ++ } ++ ++ if (num_tests == 1) ++ { ++ status(_("test %-20s ... "), tests[0]); ++ pids[0] = (tfunc) (tests[0], &resultfiles[0], &expectfiles[0], &tags[0]); ++ wait_for_tests(pids, NULL, 1); ++ /* status line is finished below */ ++ } ++ else if (max_connections > 0 && max_connections < num_tests) ++ { ++ int oldest = 0; ++ ++ status(_("parallel group (%d tests, in groups of %d): "), ++ num_tests, max_connections); ++ for (i = 0; i < num_tests; i++) ++ { ++ if (i - oldest >= max_connections) ++ { ++ wait_for_tests(pids + oldest, tests + oldest, i - oldest); ++ oldest = i; ++ } ++ pids[i] = (tfunc) (tests[i], &resultfiles[i], &expectfiles[i], &tags[i]); ++ } ++ wait_for_tests(pids + oldest, tests + oldest, i - oldest); ++ status_end(); ++ } ++ else ++ { ++ status(_("parallel group (%d tests): "), num_tests); ++ for (i = 0; i < num_tests; i++) ++ { ++ pids[i] = (tfunc) (tests[i], &resultfiles[i], &expectfiles[i], &tags[i]); ++ } ++ wait_for_tests(pids, tests, num_tests); ++ status_end(); ++ } ++ ++ /* Check results for all tests */ ++ for (i = 0; i < num_tests; i++) ++ { ++ _stringlist *rl, ++ *el, ++ *tl; ++ bool differ = false; ++ ++ if (num_tests > 1) ++ status(_(" %-20s ... "), tests[i]); ++ ++ /* ++ * Advance over all three lists simultaneously. ++ * ++ * Compare resultfiles[j] with expectfiles[j] always. Tags are ++ * optional but if there are tags, the tag list has the same ++ * length as the other two lists. ++ */ ++ for (rl = resultfiles[i], el = expectfiles[i], tl = tags[i]; ++ rl != NULL; /* rl and el have the same length */ ++ rl = rl->next, el = el->next) ++ { ++ bool newdiff; ++ ++ if (tl) ++ tl = tl->next; /* tl has the same lengt has rl and el ++ * if it exists */ ++ ++ newdiff = results_differ(tests[i], rl->str, el->str); ++ if (newdiff && tl) ++ { ++ printf("%s ", tl->str); ++ } ++ differ |= newdiff; ++ } ++ ++ if (differ) ++ { ++ bool ignore = false; ++ _stringlist *sl; ++ ++ for (sl = ignorelist; sl != NULL; sl = sl->next) ++ { ++ if (strcmp(tests[i], sl->str) == 0) ++ { ++ ignore = true; ++ break; ++ } ++ } ++ if (ignore) ++ { ++ status(_("failed (ignored)")); ++ fail_ignore_count++; ++ } ++ else ++ { ++ status(_("FAILED")); ++ fail_count++; ++ } ++ } ++ else ++ { ++ status(_("ok")); ++ success_count++; ++ } ++ ++ status_end(); ++ } ++ } ++ ++ fclose(scf); ++} ++ ++/* ++ * Run a single test ++ */ ++static void ++run_single_test(const char *test, test_function tfunc) ++{ ++ PID_TYPE pid; ++ _stringlist *resultfiles = NULL; ++ _stringlist *expectfiles = NULL; ++ _stringlist *tags = NULL; ++ _stringlist *rl, ++ *el, ++ *tl; ++ bool differ = false; ++ ++ status(_("test %-20s ... "), test); ++ pid = (tfunc) (test, &resultfiles, &expectfiles, &tags); ++ wait_for_tests(&pid, NULL, 1); ++ ++ /* ++ * Advance over all three lists simultaneously. ++ * ++ * Compare resultfiles[j] with expectfiles[j] always. Tags are optional ++ * but if there are tags, the tag list has the same length as the other ++ * two lists. ++ */ ++ for (rl = resultfiles, el = expectfiles, tl = tags; ++ rl != NULL; /* rl and el have the same length */ ++ rl = rl->next, el = el->next) ++ { ++ bool newdiff; ++ ++ if (tl) ++ tl = tl->next; /* tl has the same lengt has rl and el if it ++ * exists */ ++ ++ newdiff = results_differ(test, rl->str, el->str); ++ if (newdiff && tl) ++ { ++ printf("%s ", tl->str); ++ } ++ differ |= newdiff; ++ } ++ ++ if (differ) ++ { ++ status(_("FAILED")); ++ fail_count++; ++ } ++ else ++ { ++ status(_("ok")); ++ success_count++; ++ } ++ status_end(); ++} ++ ++/* ++ * Create the summary-output files (making them empty if already existing) ++ */ ++static void ++open_result_files(void) ++{ ++ char file[MAXPGPATH]; ++ FILE *difffile; ++ ++ /* create the log file (copy of running status output) */ ++ snprintf(file, sizeof(file), "%s/regression.out", outputdir); ++ logfilename = strdup(file); ++ logfile = fopen(logfilename, "w"); ++ if (!logfile) ++ { ++ fprintf(stderr, _("%s: could not open file \"%s\" for writing: %s\n"), ++ progname, logfilename, strerror(errno)); ++ exit_nicely(2); ++ } ++ ++ /* create the diffs file as empty */ ++ snprintf(file, sizeof(file), "%s/regression.diffs", outputdir); ++ difffilename = strdup(file); ++ difffile = fopen(difffilename, "w"); ++ if (!difffile) ++ { ++ fprintf(stderr, _("%s: could not open file \"%s\" for writing: %s\n"), ++ progname, difffilename, strerror(errno)); ++ exit_nicely(2); ++ } ++ /* we don't keep the diffs file open continuously */ ++ fclose(difffile); ++ ++ /* also create the output directory if not present */ ++ snprintf(file, sizeof(file), "%s/results", outputdir); ++ if (!directory_exists(file)) ++ make_directory(file); ++} ++ ++static void ++drop_database_if_exists(const char *dbname) ++{ ++ header(_("dropping database \"%s\""), dbname); ++ psql_command("postgres", "DROP DATABASE IF EXISTS \"%s\"", dbname); ++} ++ ++static void ++create_database(const char *dbname) ++{ ++ _stringlist *sl; ++ ++ /* ++ * We use template0 so that any installation-local cruft in template1 will ++ * not mess up the tests. ++ */ ++ header(_("creating database \"%s\""), dbname); ++ if (encoding) ++ psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=template0 ENCODING='%s'", dbname, encoding); ++ else ++ psql_command("postgres", "CREATE DATABASE \"%s\" TEMPLATE=template0", dbname); ++ psql_command(dbname, ++ "ALTER DATABASE \"%s\" SET lc_messages TO 'C';" ++ "ALTER DATABASE \"%s\" SET lc_monetary TO 'C';" ++ "ALTER DATABASE \"%s\" SET lc_numeric TO 'C';" ++ "ALTER DATABASE \"%s\" SET lc_time TO 'C';" ++ "ALTER DATABASE \"%s\" SET timezone_abbreviations TO 'Default';", ++ dbname, dbname, dbname, dbname, dbname); ++ ++ /* ++ * Install any requested procedural languages ++ */ ++ for (sl = loadlanguage; sl != NULL; sl = sl->next) ++ { ++ header(_("installing %s"), sl->str); ++ psql_command(dbname, "CREATE LANGUAGE \"%s\"", sl->str); ++ } ++} ++ ++static void ++drop_role_if_exists(const char *rolename) ++{ ++ header(_("dropping role \"%s\""), rolename); ++ psql_command("postgres", "DROP ROLE IF EXISTS \"%s\"", rolename); ++} ++ ++static void ++create_role(const char *rolename, const _stringlist * granted_dbs) ++{ ++ header(_("creating role \"%s\""), rolename); ++ psql_command("postgres", "CREATE ROLE \"%s\" WITH LOGIN", rolename); ++ for (; granted_dbs != NULL; granted_dbs = granted_dbs->next) ++ { ++ psql_command("postgres", "GRANT ALL ON DATABASE \"%s\" TO \"%s\"", ++ granted_dbs->str, rolename); ++ } ++} ++ ++static void ++help(void) ++{ ++ printf(_("PostgreSQL regression test driver\n")); ++ printf(_("\n")); ++ printf(_("Usage: %s [options...] [extra tests...]\n"), progname); ++ printf(_("\n")); ++ printf(_("Options:\n")); ++ printf(_(" --dbname=DB use database DB (default \"regression\")\n")); ++ printf(_(" --debug turn on debug mode in programs that are run\n")); ++ printf(_(" --inputdir=DIR take input files from DIR (default \".\")\n")); ++ printf(_(" --load-language=lang load the named language before running the\n")); ++ printf(_(" tests; can appear multiple times\n")); ++ printf(_(" --create-role=ROLE create the specified role before testing\n")); ++ printf(_(" --max-connections=N maximum number of concurrent connections\n")); ++ printf(_(" (default is 0 meaning unlimited)\n")); ++ printf(_(" --multibyte=ENCODING use ENCODING as the multibyte encoding\n")); ++ printf(_(" --outputdir=DIR place output files in DIR (default \".\")\n")); ++ printf(_(" --schedule=FILE use test ordering schedule from FILE\n")); ++ printf(_(" (can be used multiple times to concatenate)\n")); ++ printf(_(" --srcdir=DIR absolute path to source directory (for VPATH builds)\n")); ++ printf(_(" --temp-install=DIR create a temporary installation in DIR\n")); ++ printf(_("\n")); ++ printf(_("Options for \"temp-install\" mode:\n")); ++ printf(_(" --no-locale use C locale\n")); ++ printf(_(" --top-builddir=DIR (relative) path to top level build directory\n")); ++ printf(_(" --temp-port=PORT port number to start temp postmaster on\n")); ++ printf(_(" --temp-config=PATH append contents of PATH to temporary config\n")); ++ printf(_("\n")); ++ printf(_("Options for using an existing installation:\n")); ++ printf(_(" --host=HOST use postmaster running on HOST\n")); ++ printf(_(" --port=PORT use postmaster running at PORT\n")); ++ printf(_(" --user=USER connect as USER\n")); ++ printf(_(" --psqldir=DIR use psql in DIR (default: find in PATH)\n")); ++ printf(_("\n")); ++ printf(_("The exit status is 0 if all tests passed, 1 if some tests failed, and 2\n")); ++ printf(_("if the tests could not be run for some reason.\n")); ++ printf(_("\n")); ++ printf(_("Report bugs to <pgsql-bugs@postgresql.org>.\n")); ++} ++ ++int ++regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc) ++{ ++ _stringlist *sl; ++ int c; ++ int i; ++ int option_index; ++ char buf[MAXPGPATH * 4]; ++ ++ static struct option long_options[] = { ++ {"help", no_argument, NULL, 'h'}, ++ {"version", no_argument, NULL, 'V'}, ++ {"dbname", required_argument, NULL, 1}, ++ {"debug", no_argument, NULL, 2}, ++ {"inputdir", required_argument, NULL, 3}, ++ {"load-language", required_argument, NULL, 4}, ++ {"max-connections", required_argument, NULL, 5}, ++ {"multibyte", required_argument, NULL, 6}, ++ {"outputdir", required_argument, NULL, 7}, ++ {"schedule", required_argument, NULL, 8}, ++ {"temp-install", required_argument, NULL, 9}, ++ {"no-locale", no_argument, NULL, 10}, ++ {"top-builddir", required_argument, NULL, 11}, ++ {"temp-port", required_argument, NULL, 12}, ++ {"host", required_argument, NULL, 13}, ++ {"port", required_argument, NULL, 14}, ++ {"user", required_argument, NULL, 15}, ++ {"psqldir", required_argument, NULL, 16}, ++ {"srcdir", required_argument, NULL, 17}, ++ {"create-role", required_argument, NULL, 18}, ++ {"temp-config", required_argument, NULL, 19}, ++ {NULL, 0, NULL, 0} ++ }; ++ ++ progname = get_progname(argv[0]); ++ set_pglocale_pgservice(argv[0], "pg_regress"); ++ ++#ifndef HAVE_UNIX_SOCKETS ++ /* no unix domain sockets available, so change default */ ++ hostname = "localhost"; ++#endif ++ ++ /* ++ * We call the initialization function here because that way we can set ++ * default parameters and let them be overwritten by the commandline. ++ */ ++ ifunc(); ++ ++ while ((c = getopt_long(argc, argv, "hV", long_options, &option_index)) != -1) ++ { ++ switch (c) ++ { ++ case 'h': ++ help(); ++ exit_nicely(0); ++ case 'V': ++ printf("pg_regress (PostgreSQL %s)\n", PG_VERSION); ++ exit_nicely(0); ++ case 1: ++ ++ /* ++ * If a default database was specified, we need to remove it ++ * before we add the specified one. ++ */ ++ free_stringlist(&dblist); ++ split_to_stringlist(strdup(optarg), ", ", &dblist); ++ break; ++ case 2: ++ debug = true; ++ break; ++ case 3: ++ inputdir = strdup(optarg); ++ break; ++ case 4: ++ add_stringlist_item(&loadlanguage, optarg); ++ break; ++ case 5: ++ max_connections = atoi(optarg); ++ break; ++ case 6: ++ encoding = strdup(optarg); ++ break; ++ case 7: ++ outputdir = strdup(optarg); ++ break; ++ case 8: ++ add_stringlist_item(&schedulelist, optarg); ++ break; ++ case 9: ++ /* temp_install must be absolute path */ ++ if (is_absolute_path(optarg)) ++ temp_install = strdup(optarg); ++ else ++ { ++ char cwdbuf[MAXPGPATH]; ++ ++ if (!getcwd(cwdbuf, sizeof(cwdbuf))) ++ { ++ fprintf(stderr, _("could not get current working directory: %s\n"), strerror(errno)); ++ exit_nicely(2); ++ } ++ temp_install = malloc(strlen(cwdbuf) + strlen(optarg) + 2); ++ sprintf(temp_install, "%s/%s", cwdbuf, optarg); ++ } ++ canonicalize_path(temp_install); ++ break; ++ case 10: ++ nolocale = true; ++ break; ++ case 11: ++ top_builddir = strdup(optarg); ++ break; ++ case 12: ++ { ++ int p = atoi(optarg); ++ ++ /* Since Makefile isn't very bright, check port range */ ++ if (p >= 1024 && p <= 65535) ++ temp_port = p; ++ } ++ break; ++ case 13: ++ hostname = strdup(optarg); ++ break; ++ case 14: ++ port = atoi(optarg); ++ break; ++ case 15: ++ user = strdup(optarg); ++ break; ++ case 16: ++ /* "--psqldir=" should mean to use PATH */ ++ if (strlen(optarg)) ++ psqldir = strdup(optarg); ++ break; ++ case 17: ++ srcdir = strdup(optarg); ++ break; ++ case 18: ++ split_to_stringlist(strdup(optarg), ", ", &extraroles); ++ break; ++ case 19: ++ temp_config = strdup(optarg); ++ break; ++ default: ++ /* getopt_long already emitted a complaint */ ++ fprintf(stderr, _("\nTry \"%s -h\" for more information.\n"), ++ progname); ++ exit_nicely(2); ++ } ++ } ++ ++ /* ++ * if we still have arguments, they are extra tests to run ++ */ ++ while (argc - optind >= 1) ++ { ++ add_stringlist_item(&extra_tests, argv[optind]); ++ optind++; ++ } ++ ++ if (temp_install) ++ port = temp_port; ++ ++ /* ++ * Initialization ++ */ ++ open_result_files(); ++ ++ initialize_environment(); ++ ++#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_CORE) ++ unlimit_core_size(); ++#endif ++ ++ if (temp_install) ++ { ++ /* ++ * Prepare the temp installation ++ */ ++ if (!top_builddir) ++ { ++ fprintf(stderr, _("--top-builddir must be specified when using --temp-install\n")); ++ exit_nicely(2); ++ } ++ ++ if (directory_exists(temp_install)) ++ { ++ header(_("removing existing temp installation")); ++ rmtree(temp_install, true); ++ } ++ ++ header(_("creating temporary installation")); ++ ++ /* make the temp install top directory */ ++ make_directory(temp_install); ++ ++ /* and a directory for log files */ ++ snprintf(buf, sizeof(buf), "%s/log", outputdir); ++ if (!directory_exists(buf)) ++ make_directory(buf); ++ ++ /* "make install" */ ++#ifndef WIN32_ONLY_COMPILER ++ snprintf(buf, sizeof(buf), ++ SYSTEMQUOTE "\"%s\" -C \"%s\" DESTDIR=\"%s/install\" install with_perl=no with_python=no > \"%s/log/install.log\" 2>&1" SYSTEMQUOTE, ++ makeprog, top_builddir, temp_install, outputdir); ++#else ++ snprintf(buf, sizeof(buf), ++ SYSTEMQUOTE "perl \"%s/src/tools/msvc/install.pl\" \"%s/install\" >\"%s/log/install.log\" 2>&1" SYSTEMQUOTE, ++ top_builddir, temp_install, outputdir); ++#endif ++ if (system(buf)) ++ { ++ fprintf(stderr, _("\n%s: installation failed\nExamine %s/log/install.log for the reason.\nCommand was: %s\n"), progname, outputdir, buf); ++ exit_nicely(2); ++ } ++ ++ /* initdb */ ++ header(_("initializing database system")); ++ snprintf(buf, sizeof(buf), ++ SYSTEMQUOTE "\"%s/initdb\" -D \"%s/data\" -L \"%s\" --noclean%s%s > \"%s/log/initdb.log\" 2>&1" SYSTEMQUOTE, ++ bindir, temp_install, datadir, ++ debug ? " --debug" : "", ++ nolocale ? " --no-locale" : "", ++ outputdir); ++ if (system(buf)) ++ { ++ fprintf(stderr, _("\n%s: initdb failed\nExamine %s/log/initdb.log for the reason.\nCommand was: %s\n"), progname, outputdir, buf); ++ exit_nicely(2); ++ } ++ ++ /* add any extra config specified to the postgresql.conf */ ++ if (temp_config != NULL) ++ { ++ FILE *extra_conf; ++ FILE *pg_conf; ++ char line_buf[1024]; ++ ++ snprintf(buf, sizeof(buf), "%s/data/postgresql.conf", temp_install); ++ pg_conf = fopen(buf, "a"); ++ if (pg_conf == NULL) ++ { ++ fprintf(stderr, _("\n%s: could not open %s for adding extra config:\nError was %s\n"), progname, buf, strerror(errno)); ++ exit_nicely(2); ++ } ++ extra_conf = fopen(temp_config, "r"); ++ if (extra_conf == NULL) ++ { ++ fprintf(stderr, _("\n%s: could not open %s to read extra config:\nError was %s\n"), progname, buf, strerror(errno)); ++ exit_nicely(2); ++ } ++ while (fgets(line_buf, sizeof(line_buf), extra_conf) != NULL) ++ fputs(line_buf, pg_conf); ++ fclose(extra_conf); ++ fclose(pg_conf); ++ } ++ ++ /* ++ * Start the temp postmaster ++ */ ++ header(_("starting postmaster")); ++ snprintf(buf, sizeof(buf), ++ SYSTEMQUOTE "\"%s/postgres\" -D \"%s/data\" -F%s -c \"listen_addresses=%s\" > \"%s/log/postmaster.log\" 2>&1" SYSTEMQUOTE, ++ bindir, temp_install, ++ debug ? " -d 5" : "", ++ hostname ? hostname : "", ++ outputdir); ++ postmaster_pid = spawn_process(buf); ++ if (postmaster_pid == INVALID_PID) ++ { ++ fprintf(stderr, _("\n%s: could not spawn postmaster: %s\n"), ++ progname, strerror(errno)); ++ exit_nicely(2); ++ } ++ ++ /* ++ * Wait till postmaster is able to accept connections (normally only a ++ * second or so, but Cygwin is reportedly *much* slower). Don't wait ++ * forever, however. ++ */ ++ snprintf(buf, sizeof(buf), ++ SYSTEMQUOTE "\"%s/psql\" -X postgres <%s 2>%s" SYSTEMQUOTE, ++ bindir, DEVNULL, DEVNULL); ++ for (i = 0; i < 60; i++) ++ { ++ /* Done if psql succeeds */ ++ if (system(buf) == 0) ++ break; ++ ++ /* ++ * Fail immediately if postmaster has exited ++ */ ++#ifndef WIN32 ++ if (kill(postmaster_pid, 0) != 0) ++#else ++ if (WaitForSingleObject(postmaster_pid, 0) == WAIT_OBJECT_0) ++#endif ++ { ++ fprintf(stderr, _("\n%s: postmaster failed\nExamine %s/log/postmaster.log for the reason\n"), progname, outputdir); ++ exit_nicely(2); ++ } ++ ++ pg_usleep(1000000L); ++ } ++ if (i >= 60) ++ { ++ fprintf(stderr, _("\n%s: postmaster did not respond within 60 seconds\nExamine %s/log/postmaster.log for the reason\n"), progname, outputdir); ++ ++ /* ++ * If we get here, the postmaster is probably wedged somewhere in ++ * startup. Try to kill it ungracefully rather than leaving a ++ * stuck postmaster that might interfere with subsequent test ++ * attempts. ++ */ ++#ifndef WIN32 ++ if (kill(postmaster_pid, SIGKILL) != 0 && ++ errno != ESRCH) ++ fprintf(stderr, _("\n%s: could not kill failed postmaster: %s\n"), ++ progname, strerror(errno)); ++#else ++ if (TerminateProcess(postmaster_pid, 255) == 0) ++ fprintf(stderr, _("\n%s: could not kill failed postmaster: %lu\n"), ++ progname, GetLastError()); ++#endif ++ ++ exit_nicely(2); ++ } ++ ++ postmaster_running = true; ++ ++ printf(_("running on port %d with pid %lu\n"), ++ temp_port, (unsigned long) postmaster_pid); ++ } ++ else ++ { ++ /* ++ * Using an existing installation, so may need to get rid of ++ * pre-existing database(s) and role(s) ++ */ ++ for (sl = dblist; sl; sl = sl->next) ++ drop_database_if_exists(sl->str); ++ for (sl = extraroles; sl; sl = sl->next) ++ drop_role_if_exists(sl->str); ++ } ++ ++ /* ++ * Create the test database(s) and role(s) ++ */ ++ for (sl = dblist; sl; sl = sl->next) ++ create_database(sl->str); ++ for (sl = extraroles; sl; sl = sl->next) ++ create_role(sl->str, dblist); ++ ++ /* ++ * Ready to run the tests ++ */ ++ header(_("running regression test queries")); ++ ++ for (sl = schedulelist; sl != NULL; sl = sl->next) ++ { ++ run_schedule(sl->str, tfunc); ++ } ++ ++ for (sl = extra_tests; sl != NULL; sl = sl->next) ++ { ++ run_single_test(sl->str, tfunc); ++ } ++ ++ /* ++ * Shut down temp installation's postmaster ++ */ ++ if (temp_install) ++ { ++ header(_("shutting down postmaster")); ++ stop_postmaster(); ++ } ++ ++ fclose(logfile); ++ ++ /* ++ * Emit nice-looking summary message ++ */ ++ if (fail_count == 0 && fail_ignore_count == 0) ++ snprintf(buf, sizeof(buf), ++ _(" All %d tests passed. "), ++ success_count); ++ else if (fail_count == 0) /* fail_count=0, fail_ignore_count>0 */ ++ snprintf(buf, sizeof(buf), ++ _(" %d of %d tests passed, %d failed test(s) ignored. "), ++ success_count, ++ success_count + fail_ignore_count, ++ fail_ignore_count); ++ else if (fail_ignore_count == 0) /* fail_count>0 && fail_ignore_count=0 */ ++ snprintf(buf, sizeof(buf), ++ _(" %d of %d tests failed. "), ++ fail_count, ++ success_count + fail_count); ++ else ++ /* fail_count>0 && fail_ignore_count>0 */ ++ snprintf(buf, sizeof(buf), ++ _(" %d of %d tests failed, %d of these failures ignored. "), ++ fail_count + fail_ignore_count, ++ success_count + fail_count + fail_ignore_count, ++ fail_ignore_count); ++ ++ putchar('\n'); ++ for (i = strlen(buf); i > 0; i--) ++ putchar('='); ++ printf("\n%s\n", buf); ++ for (i = strlen(buf); i > 0; i--) ++ putchar('='); ++ putchar('\n'); ++ putchar('\n'); ++ ++ if (file_size(difffilename) > 0) ++ { ++ printf(_("The differences that caused some tests to fail can be viewed in the\n" ++ "file \"%s\". A copy of the test summary that you see\n" ++ "above is saved in the file \"%s\".\n\n"), ++ difffilename, logfilename); ++ } ++ else ++ { ++ unlink(difffilename); ++ unlink(logfilename); ++ } ++ ++ if (fail_count != 0) ++ exit_nicely(1); ++ ++ return 0; ++} diff --git a/dev-db/postgresql-server/files/postgresql-8.3.1-server.patch b/dev-db/postgresql-server/files/postgresql-8.3.1-server.patch new file mode 100644 index 000000000000..da1e812e0b3d --- /dev/null +++ b/dev-db/postgresql-server/files/postgresql-8.3.1-server.patch @@ -0,0 +1,224 @@ +=== GNUmakefile.in +================================================================== +--- GNUmakefile.in (revision 14) ++++ GNUmakefile.in (local) +@@ -11,19 +11,16 @@ + all: + $(MAKE) -C doc all + $(MAKE) -C src all +- $(MAKE) -C config all + @echo "All of PostgreSQL successfully made. Ready to install." + + install: + $(MAKE) -C doc $@ + $(MAKE) -C src $@ +- $(MAKE) -C config $@ + @echo "PostgreSQL installation complete." + + installdirs uninstall: + $(MAKE) -C doc $@ + $(MAKE) -C src $@ +- $(MAKE) -C config $@ + + distprep: + $(MAKE) -C doc $@ +=== contrib/Makefile +================================================================== +--- contrib/Makefile (revision 14) ++++ contrib/Makefile (local) +@@ -20,22 +20,19 @@ + isn \ + lo \ + ltree \ +- oid2name \ + pageinspect \ + pg_buffercache \ + pg_freespacemap \ + pg_standby \ + pg_trgm \ +- pgbench \ + pgcrypto \ + pgrowlocks \ + pgstattuple \ + seg \ + spi \ + tablefunc \ +- test_parser \ + tsearch2 \ +- vacuumlo ++ test_parser + + ifeq ($(with_openssl),yes) + WANTED_DIRS += sslinfo +=== contrib/adminpack/Makefile +================================================================== +--- contrib/adminpack/Makefile (revision 14) ++++ contrib/adminpack/Makefile (local) +@@ -1,7 +1,7 @@ + # $PostgreSQL: pgsql/contrib/adminpack/Makefile,v 1.6 2007/11/10 23:59:50 momjian Exp $ + + MODULE_big = adminpack +-PG_CPPFLAGS = -I$(libpq_srcdir) ++PG_CPPFLAGS = -I$(libpq_srcdir) -I../../src/include/ + DATA_built = adminpack.sql + DATA = uninstall_adminpack.sql + OBJS = adminpack.o +=== contrib/uuid-ossp/Makefile +================================================================== +--- contrib/uuid-ossp/Makefile (revision 14) ++++ contrib/uuid-ossp/Makefile (local) +@@ -1,11 +1,13 @@ + # $PostgreSQL: pgsql/contrib/uuid-ossp/Makefile,v 1.4 2007/11/13 00:13:19 tgl Exp $ + ++PG_CPPFLAGS += "-DHAVE_OSSP_UUID_H" ++ + MODULE_big = uuid-ossp + OBJS = uuid-ossp.o + DATA_built = uuid-ossp.sql + DATA = uninstall_uuid-ossp.sql + +-SHLIB_LINK += $(OSSP_UUID_LIBS) ++SHLIB_LINK += -lossp-uuid + + ifdef USE_PGXS + PG_CONFIG = pg_config +=== src/Makefile +================================================================== +--- src/Makefile (revision 14) ++++ src/Makefile (local) +@@ -19,14 +19,11 @@ + $(MAKE) -C backend $@ + $(MAKE) -C backend/utils/mb/conversion_procs $@ + $(MAKE) -C backend/snowball $@ +- $(MAKE) -C include $@ +- $(MAKE) -C interfaces $@ + $(MAKE) -C bin $@ + $(MAKE) -C pl $@ +- $(MAKE) -C makefiles $@ + $(MAKE) -C test/regress $@ + +-install: install-local ++install: + + install-local: installdirs-local + $(INSTALL_DATA) Makefile.global '$(DESTDIR)$(pgxsdir)/$(subdir)/Makefile.global' +=== src/Makefile.global.in +================================================================== +--- src/Makefile.global.in (revision 14) ++++ src/Makefile.global.in (local) +@@ -373,10 +373,8 @@ + + + submake-libpq: +- $(MAKE) -C $(libpq_builddir) all + + submake-libpgport: +- $(MAKE) -C $(top_builddir)/src/port all + + .PHONY: submake-libpq submake-libpgport + +@@ -419,7 +417,9 @@ + LDFLAGS += $(PROFILE) + endif + ++CFLAGS += -I${top_srcdir}/src/include + ++ + ########################################################################## + # + # substitute implementations of C library routines (see src/port/) +=== src/bin/Makefile +================================================================== +--- src/bin/Makefile (revision 14) ++++ src/bin/Makefile (local) +@@ -13,8 +13,8 @@ + top_builddir = ../.. + include $(top_builddir)/src/Makefile.global + +-DIRS = initdb ipcclean pg_ctl pg_dump \ +- psql scripts pg_config pg_controldata pg_resetxlog ++DIRS = initdb ipcclean pg_ctl \ ++ pg_controldata pg_resetxlog + ifeq ($(PORTNAME), win32) + DIRS+=pgevent + endif +=== src/bin/initdb/Makefile +================================================================== +--- src/bin/initdb/Makefile (revision 14) ++++ src/bin/initdb/Makefile (local) +@@ -14,7 +14,7 @@ + top_builddir = ../../.. + include $(top_builddir)/src/Makefile.global + +-override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) $(CPPFLAGS) ++override CPPFLAGS := -DFRONTEND -I$(top_srcdir)/src/interfaces/libpq $(CPPFLAGS) + + OBJS= initdb.o encnames.o pqsignal.o $(WIN32RES) + +=== src/include/pg_config_manual.h +================================================================== +--- src/include/pg_config_manual.h (revision 14) ++++ src/include/pg_config_manual.h (local) +@@ -184,7 +184,7 @@ + * here's where to twiddle it. You can also override this at runtime + * with the postmaster's -k switch. + */ +-#define DEFAULT_PGSOCKET_DIR "/tmp" ++#define DEFAULT_PGSOCKET_DIR "/var/run/postgresql" + + /* + * The random() function is expected to yield values between 0 and +=== src/port/Makefile +================================================================== +--- src/port/Makefile (revision 14) ++++ src/port/Makefile (local) +@@ -35,11 +35,10 @@ + # foo_srv.o and foo.o are both built from foo.c, but only foo.o has -DFRONTEND + OBJS_SRV = $(OBJS:%.o=%_srv.o) + +-all: libpgport.a libpgport_srv.a ++all: libpgport_srv.a + + # libpgport is needed by some contrib +-install: all installdirs +- $(INSTALL_STLIB) libpgport.a '$(DESTDIR)$(libdir)/libpgport.a' ++install: + + installdirs: + $(mkinstalldirs) '$(DESTDIR)$(libdir)' +=== src/test/regress/GNUmakefile +================================================================== +--- src/test/regress/GNUmakefile (revision 14) ++++ src/test/regress/GNUmakefile (local) +@@ -141,7 +141,7 @@ + ## + + check: all +- ./pg_regress --temp-install=./tmp_check --top-builddir=$(top_builddir) --srcdir=$(abs_srcdir) --temp-port=$(TEMP_PORT) --schedule=$(srcdir)/parallel_schedule --multibyte=$(MULTIBYTE) --load-language=plpgsql $(MAXCONNOPT) $(NOLOCALE) $(TEMP_CONF) ++ ./pg_regress --temp-install=./tmp_check --top-builddir=$(top_builddir) --srcdir=$(abs_srcdir) --temp-port=$(TEMP_PORT) --schedule=$(srcdir)/parallel_schedule --multibyte=$(MULTIBYTE) --load-language=plpgsql $(MAXCONNOPT) $(NOLOCALE) $(TEMP_CONF) --psqldir=/usr/lib/postgresql-${SLOT}/bin/ + + installcheck: all + ./pg_regress --psqldir=$(PSQLDIR) --schedule=$(srcdir)/serial_schedule --srcdir=$(abs_srcdir) --multibyte=$(MULTIBYTE) --load-language=plpgsql $(NOLOCALE) +=== src/test/regress/pg_regress.c +================================================================== +--- src/test/regress/pg_regress.c (revision 14) ++++ src/test/regress/pg_regress.c (local) +@@ -781,9 +781,6 @@ + sprintf(tmp, "%s/install/%s", temp_install, datadir); + datadir = tmp; + +- /* psql will be installed into temp-install bindir */ +- psqldir = bindir; +- + /* + * Set up shared library paths to include the temp install. + * +@@ -2053,7 +2050,7 @@ + */ + snprintf(buf, sizeof(buf), + SYSTEMQUOTE "\"%s/psql\" -X postgres <%s 2>%s" SYSTEMQUOTE, +- bindir, DEVNULL, DEVNULL); ++ psqldir, DEVNULL, DEVNULL); + for (i = 0; i < 60; i++) + { + /* Done if psql succeeds */ diff --git a/dev-db/postgresql-server/postgresql-server-7.4.21.ebuild b/dev-db/postgresql-server/postgresql-server-7.4.21.ebuild new file mode 100644 index 000000000000..ddce09eff9eb --- /dev/null +++ b/dev-db/postgresql-server/postgresql-server-7.4.21.ebuild @@ -0,0 +1,235 @@ +# Copyright 1999-2008 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/postgresql-server-7.4.21.ebuild,v 1.1 2008/06/14 11:49:54 dev-zero Exp $ + +EAPI="1" + +WANT_AUTOCONF="latest" +WANT_AUTOMAKE="none" +inherit eutils multilib toolchain-funcs versionator autotools + +KEYWORDS="~amd64 ~x86" + +DESCRIPTION="PostgreSQL server" +HOMEPAGE="http://www.postgresql.org/" +SRC_URI="mirror://postgresql/source/v${PV}/postgresql-${PV}.tar.bz2" +LICENSE="POSTGRESQL" +SLOT="$(get_version_component_range 1-2)" +IUSE_LINGUAS=" + linguas_cs linguas_de linguas_es linguas_fr linguas_hr linguas_hu + linguas_it linguas_nb linguas_pt_BR linguas_ru linguas_sl linguas_sv + linguas_tr linguas_zh_CN linguas_zh_TW" +IUSE="doc perl python selinux tcl xml nls kernel_linux ${IUSE_LINGUAS}" + +wanted_languages() { + for u in ${IUSE_LINGUAS} ; do + use $u && echo -n "${u#linguas_} " + done +} + +RDEPEND="~dev-db/postgresql-base-${PV}:${SLOT} + perl? ( >=dev-lang/perl-5.6.1-r2 ) + python? ( >=dev-lang/python-2.2 dev-python/egenix-mx-base ) + selinux? ( sec-policy/selinux-postgresql ) + tcl? ( >=dev-lang/tcl-8 ) + xml? ( dev-libs/libxml2 dev-libs/libxslt )" +DEPEND="${RDEPEND} + sys-devel/flex + xml? ( dev-util/pkgconfig )" +PDEPEND="doc? ( dev-db/postgresql-docs:${SLOT} )" + +S="${WORKDIR}/postgresql-${PV}" + +pkg_setup() { + enewgroup postgres 70 + enewuser postgres 70 /bin/bash /var/lib/postgresql postgres +} + +src_unpack() { + unpack ${A} + cd "${S}" + + epatch "${FILESDIR}/postgresql-${PV}-autoconf.patch" \ + "${FILESDIR}/postgresql-${SLOT}-vacuum-delay.patch" \ + "${FILESDIR}/postgresql-${SLOT}-server.patch" + + if hasq test ${FEATURES}; then + epatch "${FILESDIR}/postgresql-${SLOT}-regress.patch" + fi + + eautoreconf +} + +src_compile() { + + # eval is needed to get along with pg_config quotation of space-rich entities. + eval econf "$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --configure)" \ + $(use_with perl) \ + $(use_with python) \ + $(use_with tcl) \ + --with-includes="/usr/include/postgresql-${SLOT}/" \ + --with-libs="/usr/$(get_libdir)/postgresql-${SLOT}/$(get_libdir)/" \ + "$(built_with_use ~dev-db/postgresql-base-${PV} nls && use_enable nls nls "$(wanted_languages)")" \ + "CFLAGS='${CFLAGS} $(use xml && pkg-config --cflags libxml-2.0)'" \ + "LIBS='${LIBS} -lpq $(use xml && pkg-config --libs libxml-2.0) -L/usr/$(get_libdir)/postgresql-${SLOT}/$(get_libdir)'" \ + || die "configure failed" + + for bd in . contrib $(use xml && echo contrib/xml) ; do + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake -C $bd -j1 LD="$(tc-getLD) $(get_abi_LDFLAGS)" \ + docdir=/usr/share/doc/${PF} SLOT=${SLOT} || die "emake in $bd failed" + done +} + +src_install() { + if use perl ; then + mv -f "${S}/src/pl/plperl/GNUmakefile" "${S}/src/pl/plperl/GNUmakefile_orig" + sed -e "s:\$(DESTDIR)\$(plperl_installdir):\$(plperl_installdir):" \ + "${S}/src/pl/plperl/GNUmakefile_orig" > "${S}/src/pl/plperl/GNUmakefile" + fi + + for bd in . contrib $(use xml && echo contrib/xml) ; do + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake install -C $bd -j1 DESTDIR="${D}" \ + docdir=/usr/share/doc/${PF} SLOT=${SLOT} || die "emake install in $bd failed" + done + + rm -rf "${D}/usr/share/postgresql-${SLOT}/man/man7/" "${D}/usr/share/doc/${PF}/html" + rm "${D}"/usr/share/postgresql-${SLOT}/man/man1/{clusterdb,create{db,lang,user},drop{db,lang,user},ecpg,pg_{config,dump,dumpall,restore},psql,vacuumdb,pgtksh,pgtclsh}.1 + + dodoc README HISTORY doc/{README.*,TODO,bug.template} + + dodir /etc/eselect/postgresql/slots/${SLOT} + cat >"${D}/etc/eselect/postgresql/slots/${SLOT}/service" <<-__EOF__ + postgres_ebuilds="\${postgres_ebuilds} ${PF}" + postgres_service="postgresql-${SLOT}" + __EOF__ + + newinitd "${FILESDIR}/postgresql.init-${SLOT}" postgresql-${SLOT} || die "Inserting init.d-file failed" + newconfd "${FILESDIR}/postgresql.conf-${SLOT}" postgresql-${SLOT} || die "Inserting conf.d-file failed" + + keepdir /var/run/postgresql + fperms 0770 /var/run/postgresql + fowners postgres:postgres /var/run/postgresql +} + +pkg_postinst() { + eselect postgresql update + [[ "$(eselect postgresql show)" = "(none)" ]] && eselect postgresql set ${SLOT} + [[ "$(eselect postgresql show-service)" = "(none)" ]] && eselect postgresql set-service ${SLOT} + + ewarn "Please note that the standard location of the socket has changed from /tmp" + ewarn "to /var/run/postgresql and you have to be in the 'postgres' group to access" + ewarn "the socket." + ewarn "This can break applications which have the standard location hard-coded." + ewarn "If such an application links against the libpq, please re-emerge it," + ewarn "if that doesn't help or the application accesses the socket without using libpq," + ewarn "please file a bug-report." + ewarn "You can set PGOPTS='-k /tmp' in /etc/conf.d/postgresql-${SLOT} to restore the original location." + + elog "Execute the following command to setup the initial database environment:" + elog + elog "emerge --config =${CATEGORY}/${PF}" + elog +} + +pkg_postrm() { + eselect postgresql update +} + +pkg_config() { + [[ -z "${PGDATA}" ]] && PGDATA="/var/lib/postgresql/${SLOT}/data" + + einfo "You can pass options to initdb by setting the PG_INITDB_OPTS variable." + einfo "More information can be found here:" + einfo " http://www.postgresql.org/docs/${SLOT}/static/creating-cluster.html" + einfo " http://www.postgresql.org/docs/${SLOT}/static/app-initdb.html" + einfo "Simply add the options you would have added to initdb to the PG_INITDB_OPTS variable." + einfo + einfo "You can change the directory where the database cluster is being created by setting" + einfo "the PGDATA variable." + einfo + einfo "PG_INITDB_OPTS is currently set to:" + einfo " \"${PG_INITDB_OPTS}\"" + einfo "and the database cluster will be created in:" + einfo " \"${PGDATA}\"" + einfo "Are you ready to continue? (Y/n)" + read answer + [ -z $answer ] && answer=Y + [ "$answer" == "Y" ] || [ "$answer" == "y" ] || die "aborted" + + if [[ -f "${PGDATA}/PG_VERSION" ]] ; then + eerror "The given directory \"${PGDATA}\" already contains a database cluster." + die "cluster already exists" + fi + + [ -z "${PG_MAX_CONNECTIONS}" ] && PG_MAX_CONNECTIONS="128" + einfo "Checking system parameters..." + + if ! use kernel_linux ; then + SKIP_SYSTEM_TESTS=yes + einfo " Tests not supported on this OS (yet)" + fi + + if [ -z ${SKIP_SYSTEM_TESTS} ] ; then + einfo "Checking whether your system supports at least ${PG_MAX_CONNECTIONS} connections..." + + local SEMMSL=$(sysctl -n kernel.sem | cut -f1) + local SEMMNS=$(sysctl -n kernel.sem | cut -f2) + local SEMMNI=$(sysctl -n kernel.sem | cut -f4) + local SHMMAX=$(sysctl -n kernel.shmmax) + + local SEMMSL_MIN=17 + local SEMMNS_MIN=$(( ( ${PG_MAX_CONNECTIONS}/16 ) * 17 )) + local SEMMNI_MIN=$(( ( ${PG_MAX_CONNECTIONS}+15 ) / 16 )) + local SHMMAX_MIN=$(( 500000 + ( 30600 * ${PG_MAX_CONNECTIONS} ) )) + + for p in SEMMSL SEMMNS SEMMNI SHMMAX ; do + if [ $(eval echo \$$p) -lt $(eval echo \$${p}_MIN) ] ; then + eerror "The value for ${p} $(eval echo \$$p) is below the recommended value $(eval echo \$${p}_MIN)" + eerror "You have now several options:" + eerror " - Change the mentioned system parameter" + eerror " - Lower the number of max.connections by setting PG_MAX_CONNECTIONS to a value lower than ${PG_MAX_CONNECTIONS}" + eerror " - Set SKIP_SYSTEM_TESTS in case you want to ignore this test completely" + eerror "More information can be found here:" + eerror " http://www.postgresql.org/docs/${SLOT}/static/kernel-resources.html" + die "system test failed" + fi + done + einfo "Passed." + else + einfo "Skipped." + fi + + einfo "Creating the data directory ..." + mkdir -p "${PGDATA}" + chown -Rf postgres:postgres "${PGDATA}" + chmod 0700 "${PGDATA}" + + einfo "Initializing the database ..." + + su postgres -c "/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb --pgdata \"${PGDATA}\" ${PG_INITDB_OPTS}" + + einfo + einfo "You can use the '${ROOT}/etc/init.d/postgresql-${SLOT}' script to run PostgreSQL instead of 'pg_ctl'." + einfo + + if [ "${PGDATA}" != "/var/lib/postgresql/${SLOT}/data" ] ; then + ewarn "You didn't install the database cluster in the standard location, please make sure that you set" + ewarn "PGDATA=\"${PGDATA}\" in the appropriate conf.d file (probably /etc/conf.d/postgresql-${SLOT})" + fi +} + +src_test() { + einfo ">>> Test phase [check]: ${CATEGORY}/${PF}" + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake -j1 check \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + NO_PGXS=0 USE_PGXS=1 SLOT=${SLOT} || die "Make check failed. See above for details." + + einfo "Yes, there are other tests which could be run." + einfo "... and no, we don't plan to add/support them." + einfo "For now, the main regressions tests will suffice." + einfo "If you think other tests are necessary, please submit a" + einfo "bug including a patch for this ebuild to enable them." +} diff --git a/dev-db/postgresql-server/postgresql-server-8.0.15.ebuild b/dev-db/postgresql-server/postgresql-server-8.0.15.ebuild index 56a5c2df5ab3..58ab757535af 100644 --- a/dev-db/postgresql-server/postgresql-server-8.0.15.ebuild +++ b/dev-db/postgresql-server/postgresql-server-8.0.15.ebuild @@ -1,6 +1,6 @@ # Copyright 1999-2008 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/postgresql-server-8.0.15.ebuild,v 1.3 2008/06/04 21:44:07 dev-zero Exp $ +# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/postgresql-server-8.0.15.ebuild,v 1.4 2008/06/14 11:49:54 dev-zero Exp $ EAPI="1" @@ -50,7 +50,7 @@ src_unpack() { unpack ${A} cd "${S}" - epatch "${FILESDIR}/postgresql-${SLOT}-common.patch" \ + epatch "${FILESDIR}/postgresql-${SLOT}.15-common.patch" \ "${FILESDIR}/postgresql-${SLOT}-server.patch" if hasq test ${FEATURES}; then diff --git a/dev-db/postgresql-server/postgresql-server-8.0.17.ebuild b/dev-db/postgresql-server/postgresql-server-8.0.17.ebuild new file mode 100644 index 000000000000..0b4b1f71218f --- /dev/null +++ b/dev-db/postgresql-server/postgresql-server-8.0.17.ebuild @@ -0,0 +1,240 @@ +# Copyright 1999-2008 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/postgresql-server-8.0.17.ebuild,v 1.1 2008/06/14 11:49:54 dev-zero Exp $ + +EAPI="1" + +WANT_AUTOCONF="latest" +WANT_AUTOMAKE="none" +inherit eutils multilib toolchain-funcs versionator autotools + +KEYWORDS="~amd64 ~x86" + +DESCRIPTION="PostgreSQL server" +HOMEPAGE="http://www.postgresql.org/" +SRC_URI="mirror://postgresql/source/v${PV}/postgresql-${PV}.tar.bz2" +LICENSE="POSTGRESQL" +SLOT="$(get_version_component_range 1-2)" +IUSE_LINGUAS=" + linguas_af linguas_cs linguas_de linguas_es linguas_fa linguas_fr + linguas_hr linguas_hu linguas_it linguas_ko linguas_nb linguas_pl + linguas_pt_BR linguas_ro linguas_ru linguas_sk linguas_sl linguas_sv + linguas_tr linguas_zh_CN linguas_zh_TW" +IUSE="doc perl python selinux tcl xml nls kernel_linux ${IUSE_LINGUAS}" + +wanted_languages() { + for u in ${IUSE_LINGUAS} ; do + use $u && echo -n "${u#linguas_} " + done +} + +RDEPEND="~dev-db/postgresql-base-${PV}:${SLOT} + perl? ( >=dev-lang/perl-5.6.1-r2 ) + python? ( >=dev-lang/python-2.2 dev-python/egenix-mx-base ) + selinux? ( sec-policy/selinux-postgresql ) + tcl? ( >=dev-lang/tcl-8 ) + xml? ( dev-libs/libxml2 dev-libs/libxslt )" +DEPEND="${RDEPEND} + sys-devel/flex + xml? ( dev-util/pkgconfig )" +PDEPEND="doc? ( dev-db/postgresql-docs:${SLOT} )" + +S="${WORKDIR}/postgresql-${PV}" + +pkg_setup() { + enewgroup postgres 70 + enewuser postgres 70 /bin/bash /var/lib/postgresql postgres +} + +src_unpack() { + unpack ${A} + cd "${S}" + + epatch "${FILESDIR}/postgresql-${SLOT}-common.patch" \ + "${FILESDIR}/postgresql-${SLOT}-server.patch" + + if hasq test ${FEATURES}; then + sed -e "s|/no/such/location|${S}/src/test/regress/tmp_check/no/such/location|g" -i src/test/regress/{input,output}/tablespace.source + fi + + eautoconf +} + +src_compile() { + # TODO: test if PPC really cannot work with other CFLAGS settings + # use ppc && CFLAGS="-pipe -fsigned-char" + + # eval is needed to get along with pg_config quotation of space-rich entities. + eval econf "$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --configure)" \ + $(use_with perl) \ + $(use_with python) \ + $(use_with tcl) \ + --with-includes="/usr/include/postgresql-${SLOT}/" \ + "$(built_with_use ~dev-db/postgresql-base-${PV} nls && use_enable nls nls "$(wanted_languages)")" \ + || die "configure failed" + + for bd in . contrib $(use xml && echo contrib/xml2) ; do + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake -C $bd -j1 LD="$(tc-getLD) $(get_abi_LDFLAGS)" \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + NO_PGXS=0 USE_PGXS=1 docdir=/usr/share/doc/${PF} || die "emake in $bd failed" + done +} + +src_install() { + if use perl ; then + mv -f "${S}/src/pl/plperl/GNUmakefile" "${S}/src/pl/plperl/GNUmakefile_orig" + sed -e "s:\$(DESTDIR)\$(plperl_installdir):\$(plperl_installdir):" \ + "${S}/src/pl/plperl/GNUmakefile_orig" > "${S}/src/pl/plperl/GNUmakefile" + fi + + for bd in . contrib $(use xml && echo contrib/xml2) ; do + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake install -C $bd -j1 DESTDIR="${D}" \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + NO_PGXS=0 USE_PGXS=1 docdir=/usr/share/doc/${PF} || die "emake install in $bd failed" + done + + rm -rf "${D}/usr/share/postgresql-${SLOT}/man/man7/" "${D}/usr/share/doc/${PF}/html" + rm "${D}"/usr/share/postgresql-${SLOT}/man/man1/{clusterdb,create{db,lang,user},drop{db,lang,user},ecpg,pg_{config,dump,dumpall,restore},psql,vacuumdb}.1 + + dodoc README HISTORY doc/{README.*,TODO,bug.template} + + dodir /etc/eselect/postgresql/slots/${SLOT} + cat >"${D}/etc/eselect/postgresql/slots/${SLOT}/service" <<-__EOF__ + postgres_ebuilds="\${postgres_ebuilds} ${PF}" + postgres_service="postgresql-${SLOT}" + __EOF__ + + newinitd "${FILESDIR}/postgresql.init-${SLOT}" postgresql-${SLOT} || die "Inserting init.d-file failed" + newconfd "${FILESDIR}/postgresql.conf-${SLOT}" postgresql-${SLOT} || die "Inserting conf.d-file failed" + + keepdir /var/run/postgresql + fperms 0770 /var/run/postgresql + fowners postgres:postgres /var/run/postgresql +} + +pkg_postinst() { + eselect postgresql update + [[ "$(eselect postgresql show)" = "(none)" ]] && eselect postgresql set ${SLOT} + [[ "$(eselect postgresql show-service)" = "(none)" ]] && eselect postgresql set-service ${SLOT} + + ewarn "Please note that the standard location of the socket has changed from /tmp" + ewarn "to /var/run/postgresql and you have to be in the 'postgres' group to access" + ewarn "the socket." + ewarn "This can break applications which have the standard location hard-coded." + ewarn "If such an application links against the libpq, please re-emerge it," + ewarn "if that doesn't help or the application accesses the socket without using libpq," + ewarn "please file a bug-report." + ewarn "You can set PGOPTS='-k /tmp' in /etc/conf.d/postgresql-${SLOT} to restore the original location." + + elog "Execute the following command to setup the initial database environment:" + elog + elog "emerge --config =${CATEGORY}/${PF}" + elog +} + +pkg_postrm() { + eselect postgresql update +} + +pkg_config() { + [[ -z "${PGDATA}" ]] && PGDATA="/var/lib/postgresql/${SLOT}/data" + + einfo "You can pass options to initdb by setting the PG_INITDB_OPTS variable." + einfo "More information can be found here:" + einfo " http://www.postgresql.org/docs/${SLOT}/static/creating-cluster.html" + einfo " http://www.postgresql.org/docs/${SLOT}/static/app-initdb.html" + einfo "Simply add the options you would have added to initdb to the PG_INITDB_OPTS variable." + einfo + einfo "You can change the directory where the database cluster is being created by setting" + einfo "the PGDATA variable." + einfo + einfo "PG_INITDB_OPTS is currently set to:" + einfo " \"${PG_INITDB_OPTS}\"" + einfo "and the database cluster will be created in:" + einfo " \"${PGDATA}\"" + einfo "Are you ready to continue? (Y/n)" + read answer + [ -z $answer ] && answer=Y + [ "$answer" == "Y" ] || [ "$answer" == "y" ] || die "aborted" + + if [[ -f "${PGDATA}/PG_VERSION" ]] ; then + eerror "The given directory \"${PGDATA}\" already contains a database cluster." + die "cluster already exists" + fi + + [ -z "${PG_MAX_CONNECTIONS}" ] && PG_MAX_CONNECTIONS="128" + einfo "Checking system parameters..." + + if ! use kernel_linux ; then + SKIP_SYSTEM_TESTS=yes + einfo " Tests not supported on this OS (yet)" + fi + + if [ -z ${SKIP_SYSTEM_TESTS} ] ; then + einfo "Checking whether your system supports at least ${PG_MAX_CONNECTIONS} connections..." + + local SEMMSL=$(sysctl -n kernel.sem | cut -f1) + local SEMMNS=$(sysctl -n kernel.sem | cut -f2) + local SEMMNI=$(sysctl -n kernel.sem | cut -f4) + local SHMMAX=$(sysctl -n kernel.shmmax) + + local SEMMSL_MIN=17 + local SEMMNS_MIN=$(( ( ${PG_MAX_CONNECTIONS}/16 ) * 17 )) + local SEMMNI_MIN=$(( ( ${PG_MAX_CONNECTIONS}+15 ) / 16 )) + local SHMMAX_MIN=$(( 500000 + ( 30600 * ${PG_MAX_CONNECTIONS} ) )) + + for p in SEMMSL SEMMNS SEMMNI SHMMAX ; do + if [ $(eval echo \$$p) -lt $(eval echo \$${p}_MIN) ] ; then + eerror "The value for ${p} $(eval echo \$$p) is below the recommended value $(eval echo \$${p}_MIN)" + eerror "You have now several options:" + eerror " - Change the mentioned system parameter" + eerror " - Lower the number of max.connections by setting PG_MAX_CONNECTIONS to a value lower than ${PG_MAX_CONNECTIONS}" + eerror " - Set SKIP_SYSTEM_TESTS in case you want to ignore this test completely" + eerror "More information can be found here:" + eerror " http://www.postgresql.org/docs/${SLOT}/static/kernel-resources.html" + die "system test failed" + fi + done + einfo "Passed." + else + einfo "Skipped." + fi + + einfo "Creating the data directory ..." + mkdir -p "${PGDATA}" + chown -Rf postgres:postgres "${PGDATA}" + chmod 0700 "${PGDATA}" + + einfo "Initializing the database ..." + + su postgres -c "/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb --pgdata \"${PGDATA}\" ${PG_INITDB_OPTS}" + + einfo + einfo "You can use the '${ROOT}/etc/init.d/postgresql-${SLOT}' script to run PostgreSQL instead of 'pg_ctl'." + einfo + + if [ "${PGDATA}" != "/var/lib/postgresql/${SLOT}/data" ] ; then + ewarn "You didn't install the database cluster in the standard location, please make sure that you set" + ewarn "PGDATA=\"${PGDATA}\" in the appropriate conf.d file (probably /etc/conf.d/postgresql-${SLOT})" + fi +} + +src_test() { + sed -i \ + -e '/test: horology/d' \ + src/test/regress/{parallel_schedule,serial_schedule} || die "sed failed" + + einfo ">>> Test phase [check]: ${CATEGORY}/${PF}" + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake -j1 check \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + NO_PGXS=0 USE_PGXS=1 SLOT=${SLOT} || die "Make check failed. See above for details." + + einfo "Yes, there are other tests which could be run." + einfo "... and no, we don't plan to add/support them." + einfo "For now, the main regressions tests will suffice." + einfo "If you think other tests are necessary, please submit a" + einfo "bug including a patch for this ebuild to enable them." +} diff --git a/dev-db/postgresql-server/postgresql-server-8.1.13.ebuild b/dev-db/postgresql-server/postgresql-server-8.1.13.ebuild new file mode 100644 index 000000000000..8e4f4a3e6ac6 --- /dev/null +++ b/dev-db/postgresql-server/postgresql-server-8.1.13.ebuild @@ -0,0 +1,239 @@ +# Copyright 1999-2008 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/postgresql-server-8.1.13.ebuild,v 1.1 2008/06/14 11:49:54 dev-zero Exp $ + +EAPI="1" + +WANT_AUTOCONF="latest" +WANT_AUTOMAKE="none" +inherit eutils multilib toolchain-funcs versionator autotools + +KEYWORDS="~amd64 ~x86" + +DESCRIPTION="PostgreSQL server" +HOMEPAGE="http://www.postgresql.org/" +SRC_URI="mirror://postgresql/source/v${PV}/postgresql-${PV}.tar.bz2" +LICENSE="POSTGRESQL" +SLOT="$(get_version_component_range 1-2)" +IUSE_LINGUAS=" + linguas_af linguas_cs linguas_de linguas_es linguas_fa linguas_fr + linguas_hr linguas_hu linguas_it linguas_ko linguas_nb linguas_pl + linguas_pt_BR linguas_ro linguas_ru linguas_sk linguas_sl linguas_sv + linguas_tr linguas_zh_CN linguas_zh_TW" +IUSE="doc perl python selinux tcl xml nls kernel_linux ${IUSE_LINGUAS}" + +wanted_languages() { + for u in ${IUSE_LINGUAS} ; do + use $u && echo -n "${u#linguas_} " + done +} + +RDEPEND="~dev-db/postgresql-base-${PV}:${SLOT} + perl? ( >=dev-lang/perl-5.6.1-r2 ) + python? ( >=dev-lang/python-2.2 dev-python/egenix-mx-base ) + selinux? ( sec-policy/selinux-postgresql ) + tcl? ( >=dev-lang/tcl-8 ) + xml? ( dev-libs/libxml2 dev-libs/libxslt )" +DEPEND="${RDEPEND} + sys-devel/flex + xml? ( dev-util/pkgconfig )" +PDEPEND="doc? ( dev-db/postgresql-docs:${SLOT} )" + +S="${WORKDIR}/postgresql-${PV}" + +pkg_setup() { + enewgroup postgres 70 + enewuser postgres 70 /bin/bash /var/lib/postgresql postgres +} + +src_unpack() { + unpack ${A} + cd "${S}" + + epatch "${FILESDIR}/postgresql-${SLOT}-common.patch" \ + "${FILESDIR}/postgresql-${SLOT}-server.patch" + + if hasq test ${FEATURES}; then + sed -e "s|/no/such/location|${S}/src/test/regress/tmp_check/no/such/location|g" -i src/test/regress/{input,output}/tablespace.source + fi + + eautoconf +} + +src_compile() { + # TODO: test if PPC really cannot work with other CFLAGS settings + # use ppc && CFLAGS="-pipe -fsigned-char" + + # eval is needed to get along with pg_config quotation of space-rich entities. + eval econf "$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --configure)" \ + $(use_with perl) \ + $(use_with python) \ + $(use_with tcl) \ + --with-includes="/usr/include/postgresql-${SLOT}/" \ + "$(built_with_use ~dev-db/postgresql-base-${PV} nls && use_enable nls nls "$(wanted_languages)")" \ + || die "configure failed" + + for bd in . contrib $(use xml && echo contrib/xml2) ; do + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake -C $bd -j1 LD="$(tc-getLD) $(get_abi_LDFLAGS)" \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + NO_PGXS=0 USE_PGXS=1 docdir=/usr/share/doc/${PF} || die "emake in $bd failed" + done +} + +src_install() { + if use perl ; then + mv -f "${S}/src/pl/plperl/GNUmakefile" "${S}/src/pl/plperl/GNUmakefile_orig" + sed -e "s:\$(DESTDIR)\$(plperl_installdir):\$(plperl_installdir):" \ + "${S}/src/pl/plperl/GNUmakefile_orig" > "${S}/src/pl/plperl/GNUmakefile" + fi + + for bd in . contrib $(use xml && echo contrib/xml2) ; do + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake install -C $bd -j1 DESTDIR="${D}" \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + NO_PGXS=0 USE_PGXS=1 docdir=/usr/share/doc/${PF} || die "emake install in $bd failed" + done + + rm -rf "${D}/usr/share/postgresql-${SLOT}/man/man7/" "${D}/usr/share/doc/${PF}/html" + rm "${D}"/usr/share/postgresql-${SLOT}/man/man1/{clusterdb,create{db,lang,user},drop{db,lang,user},ecpg,pg_{config,dump,dumpall,restore},psql,reindexdb,vacuumdb}.1 + + dodoc README HISTORY doc/{README.*,TODO,bug.template} + + dodir /etc/eselect/postgresql/slots/${SLOT} + cat >"${D}/etc/eselect/postgresql/slots/${SLOT}/service" <<-__EOF__ + postgres_ebuilds="\${postgres_ebuilds} ${PF}" + postgres_service="postgresql-${SLOT}" + __EOF__ + + newinitd "${FILESDIR}/postgresql.init-${SLOT}" postgresql-${SLOT} || die "Inserting init.d-file failed" + newconfd "${FILESDIR}/postgresql.conf-${SLOT}" postgresql-${SLOT} || die "Inserting conf.d-file failed" + + keepdir /var/run/postgresql + fperms 0770 /var/run/postgresql + fowners postgres:postgres /var/run/postgresql +} + +pkg_postinst() { + eselect postgresql update + [[ "$(eselect postgresql show)" = "(none)" ]] && eselect postgresql set ${SLOT} + [[ "$(eselect postgresql show-service)" = "(none)" ]] && eselect postgresql set-service ${SLOT} + + ewarn "Please note that the standard location of the socket has changed from /tmp" + ewarn "to /var/run/postgresql and you have to be in the 'postgres' group to access" + ewarn "the socket." + ewarn "This can break applications which have the standard location hard-coded." + ewarn "If such an application links against the libpq, please re-emerge it," + ewarn "if that doesn't help or the application accesses the socket without using libpq," + ewarn "please file a bug-report." + ewarn "You can set PGOPTS='-k /tmp' in /etc/conf.d/postgresql-${SLOT} to restore the original location." + + elog "Execute the following command to setup the initial database environment:" + elog + elog "emerge --config =${CATEGORY}/${PF}" + elog + elog "The autovacuum function, which was in contrib, has been moved to the main" + elog "PostgreSQL functions starting with 8.1." + elog "You can enable it in the clusters postgresql.conf." +} + +pkg_postrm() { + eselect postgresql update +} + +pkg_config() { + [[ -z "${PGDATA}" ]] && PGDATA="/var/lib/postgresql/${SLOT}/data" + + einfo "You can pass options to initdb by setting the PG_INITDB_OPTS variable." + einfo "More information can be found here:" + einfo " http://www.postgresql.org/docs/${SLOT}/static/creating-cluster.html" + einfo " http://www.postgresql.org/docs/${SLOT}/static/app-initdb.html" + einfo "Simply add the options you would have added to initdb to the PG_INITDB_OPTS variable." + einfo + einfo "You can change the directory where the database cluster is being created by setting" + einfo "the PGDATA variable." + einfo + einfo "PG_INITDB_OPTS is currently set to:" + einfo " \"${PG_INITDB_OPTS}\"" + einfo "and the database cluster will be created in:" + einfo " \"${PGDATA}\"" + einfo "Are you ready to continue? (Y/n)" + read answer + [ -z $answer ] && answer=Y + [ "$answer" == "Y" ] || [ "$answer" == "y" ] || die "aborted" + + if [[ -f "${PGDATA}/PG_VERSION" ]] ; then + eerror "The given directory \"${PGDATA}\" already contains a database cluster." + die "cluster already exists" + fi + + [ -z "${PG_MAX_CONNECTIONS}" ] && PG_MAX_CONNECTIONS="128" + einfo "Checking system parameters..." + + if ! use kernel_linux ; then + SKIP_SYSTEM_TESTS=yes + einfo " Tests not supported on this OS (yet)" + fi + + if [ -z ${SKIP_SYSTEM_TESTS} ] ; then + einfo "Checking whether your system supports at least ${PG_MAX_CONNECTIONS} connections..." + + local SEMMSL=$(sysctl -n kernel.sem | cut -f1) + local SEMMNS=$(sysctl -n kernel.sem | cut -f2) + local SEMMNI=$(sysctl -n kernel.sem | cut -f4) + local SHMMAX=$(sysctl -n kernel.shmmax) + + local SEMMSL_MIN=17 + local SEMMNS_MIN=$(( ( ${PG_MAX_CONNECTIONS}/16 ) * 17 )) + local SEMMNI_MIN=$(( ( ${PG_MAX_CONNECTIONS}+15 ) / 16 )) + local SHMMAX_MIN=$(( 500000 + ( 30600 * ${PG_MAX_CONNECTIONS} ) )) + + for p in SEMMSL SEMMNS SEMMNI SHMMAX ; do + if [ $(eval echo \$$p) -lt $(eval echo \$${p}_MIN) ] ; then + eerror "The value for ${p} $(eval echo \$$p) is below the recommended value $(eval echo \$${p}_MIN)" + eerror "You have now several options:" + eerror " - Change the mentioned system parameter" + eerror " - Lower the number of max.connections by setting PG_MAX_CONNECTIONS to a value lower than ${PG_MAX_CONNECTIONS}" + eerror " - Set SKIP_SYSTEM_TESTS in case you want to ignore this test completely" + eerror "More information can be found here:" + eerror " http://www.postgresql.org/docs/${SLOT}/static/kernel-resources.html" + die "system test failed" + fi + done + einfo "Passed." + else + einfo "Skipped." + fi + + einfo "Creating the data directory ..." + mkdir -p "${PGDATA}" + chown -Rf postgres:postgres "${PGDATA}" + chmod 0700 "${PGDATA}" + + einfo "Initializing the database ..." + + su postgres -c "/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb --pgdata \"${PGDATA}\" ${PG_INITDB_OPTS}" + + einfo + einfo "You can use the '${ROOT}/etc/init.d/postgresql-${SLOT}' script to run PostgreSQL instead of 'pg_ctl'." + einfo + + if [ "${PGDATA}" != "/var/lib/postgresql/${SLOT}/data" ] ; then + ewarn "You didn't install the database cluster in the standard location, please make sure that you set" + ewarn "PGDATA=\"${PGDATA}\" in the appropriate conf.d file (probably /etc/conf.d/postgresql-${SLOT})" + fi +} + +src_test() { + einfo ">>> Test phase [check]: ${CATEGORY}/${PF}" + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake -j1 check \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + NO_PGXS=0 USE_PGXS=1 SLOT=${SLOT} || die "Make check failed. See above for details." + + einfo "Yes, there are other tests which could be run." + einfo "... and no, we don't plan to add/support them." + einfo "For now, the main regressions tests will suffice." + einfo "If you think other tests are necessary, please submit a" + einfo "bug including a patch for this ebuild to enable them." +} diff --git a/dev-db/postgresql-server/postgresql-server-8.2.7.ebuild b/dev-db/postgresql-server/postgresql-server-8.2.7.ebuild index c72519b78ee3..bb1c12c8cc78 100644 --- a/dev-db/postgresql-server/postgresql-server-8.2.7.ebuild +++ b/dev-db/postgresql-server/postgresql-server-8.2.7.ebuild @@ -1,6 +1,6 @@ # Copyright 1999-2008 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/postgresql-server-8.2.7.ebuild,v 1.3 2008/06/04 21:44:07 dev-zero Exp $ +# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/postgresql-server-8.2.7.ebuild,v 1.4 2008/06/14 11:49:54 dev-zero Exp $ EAPI="1" @@ -113,8 +113,7 @@ src_install() { newinitd "${FILESDIR}/postgresql.init-${SLOT}" postgresql-${SLOT} || die "Inserting init.d-file failed" newconfd "${FILESDIR}/postgresql.conf-${SLOT}" postgresql-${SLOT} || die "Inserting conf.d-file failed" - # Workaround for paludis - [ -f "${ROOT}/var/run/postgresql/.keep" ] || keepdir /var/run/postgresql + keepdir /var/run/postgresql fperms 0770 /var/run/postgresql fowners postgres:postgres /var/run/postgresql } diff --git a/dev-db/postgresql-server/postgresql-server-8.2.9.ebuild b/dev-db/postgresql-server/postgresql-server-8.2.9.ebuild new file mode 100644 index 000000000000..3665f98b0d9c --- /dev/null +++ b/dev-db/postgresql-server/postgresql-server-8.2.9.ebuild @@ -0,0 +1,245 @@ +# Copyright 1999-2008 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/postgresql-server-8.2.9.ebuild,v 1.1 2008/06/14 11:49:54 dev-zero Exp $ + +EAPI="1" + +WANT_AUTOCONF="latest" +WANT_AUTOMAKE="none" +inherit eutils multilib toolchain-funcs versionator autotools + +KEYWORDS="~amd64 ~x86" + +DESCRIPTION="PostgreSQL server" +HOMEPAGE="http://www.postgresql.org/" +SRC_URI="mirror://postgresql/source/v${PV}/postgresql-${PV}.tar.bz2" +LICENSE="POSTGRESQL" +SLOT="$(get_version_component_range 1-2)" +IUSE_LINGUAS=" + linguas_af linguas_cs linguas_de linguas_es linguas_fa linguas_fr + linguas_hr linguas_hu linguas_it linguas_ko linguas_nb linguas_pl + linguas_pt_BR linguas_ro linguas_ru linguas_sk linguas_sl linguas_sv + linguas_tr linguas_zh_CN linguas_zh_TW" +IUSE="doc perl python selinux tcl xml nls kernel_linux ${IUSE_LINGUAS}" + +wanted_languages() { + for u in ${IUSE_LINGUAS} ; do + use $u && echo -n "${u#linguas_} " + done +} + +RDEPEND="~dev-db/postgresql-base-${PV}:${SLOT} + perl? ( >=dev-lang/perl-5.6.1-r2 ) + python? ( >=dev-lang/python-2.2 dev-python/egenix-mx-base ) + selinux? ( sec-policy/selinux-postgresql ) + tcl? ( >=dev-lang/tcl-8 ) + xml? ( dev-libs/libxml2 dev-libs/libxslt )" +DEPEND="${RDEPEND} + sys-devel/flex + xml? ( dev-util/pkgconfig )" +PDEPEND="doc? ( dev-db/postgresql-docs:${SLOT} )" + +S="${WORKDIR}/postgresql-${PV}" + +pkg_setup() { + enewgroup postgres 70 + enewuser postgres 70 /bin/bash /var/lib/postgresql postgres +} + +src_unpack() { + unpack ${A} + cd "${S}" + + epatch "${FILESDIR}/postgresql-${SLOT}-common.patch" \ + "${FILESDIR}/postgresql-${SLOT}-server.patch" + + if hasq test ${FEATURES}; then + sed -e "s|/no/such/location|${S}/src/test/regress/tmp_check/no/such/location|g" -i src/test/regress/{input,output}/tablespace.source + else + echo "all install:" > "${S}/src/test/regress/GNUmakefile" + fi + + eautoconf +} + +src_compile() { + # TODO: test if PPC really cannot work with other CFLAGS settings + # use ppc && CFLAGS="-pipe -fsigned-char" + + # eval is needed to get along with pg_config quotation of space-rich entities. + eval econf "$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --configure)" \ + --disable-thread-safety \ + $(use_with perl) \ + $(use_with python) \ + $(use_with tcl) \ + --with-includes="/usr/include/postgresql-${SLOT}/" \ + "$(built_with_use ~dev-db/postgresql-base-${PV} nls && use_enable nls nls "$(wanted_languages)")" \ + || die "configure failed" + + for bd in . contrib $(use xml && echo contrib/xml2); do + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake -C $bd -j1 LD="$(tc-getLD) $(get_abi_LDFLAGS)" \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + PGXS_IN_SERVER=1 PGXS_WITH_SERVER="${S}/src/backend/postgres" \ + NO_PGXS=0 USE_PGXS=1 docdir=/usr/share/doc/${PF} || die "emake in $bd failed" + done +} + +src_install() { + if use perl ; then + mv -f "${S}/src/pl/plperl/GNUmakefile" "${S}/src/pl/plperl/GNUmakefile_orig" + sed -e "s:\$(DESTDIR)\$(plperl_installdir):\$(plperl_installdir):" \ + "${S}/src/pl/plperl/GNUmakefile_orig" > "${S}/src/pl/plperl/GNUmakefile" + fi + + for bd in . contrib $(use xml && echo contrib/xml2) ; do + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake install -C $bd -j1 DESTDIR="${D}" \ + PGXS_IN_SERVER=1 PGXS_WITH_SERVER="${S}/src/backend/postgres" \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + NO_PGXS=0 USE_PGXS=1 docdir=/usr/share/doc/${PF} || die "emake install in $bd failed" + done + + rm -rf "${D}/usr/share/postgresql-${SLOT}/man/man7/" "${D}/usr/share/doc/${PF}/html" + rm "${D}"/usr/share/postgresql-${SLOT}/man/man1/{clusterdb,create{db,lang,user},drop{db,lang,user},ecpg,pg_{config,dump,dumpall,restore},psql,reindexdb,vacuumdb}.1 + + dodoc README HISTORY doc/{README.*,TODO,bug.template} + + dodir /etc/eselect/postgresql/slots/${SLOT} + cat >"${D}/etc/eselect/postgresql/slots/${SLOT}/service" <<-__EOF__ + postgres_ebuilds="\${postgres_ebuilds} ${PF}" + postgres_service="postgresql-${SLOT}" + __EOF__ + + newinitd "${FILESDIR}/postgresql.init-${SLOT}" postgresql-${SLOT} || die "Inserting init.d-file failed" + newconfd "${FILESDIR}/postgresql.conf-${SLOT}" postgresql-${SLOT} || die "Inserting conf.d-file failed" + + # Workaround for paludis + [ -f "${ROOT}/var/run/postgresql/.keep" ] || keepdir /var/run/postgresql + fperms 0770 /var/run/postgresql + fowners postgres:postgres /var/run/postgresql +} + +pkg_postinst() { + eselect postgresql update + [[ "$(eselect postgresql show)" = "(none)" ]] && eselect postgresql set ${SLOT} + [[ "$(eselect postgresql show-service)" = "(none)" ]] && eselect postgresql set-service ${SLOT} + + ewarn "Please note that the standard location of the socket has changed from /tmp" + ewarn "to /var/run/postgresql and you have to be in the 'postgres' group to access" + ewarn "the socket." + ewarn "This can break applications which have the standard location hard-coded." + ewarn "If such an application links against the libpq, please re-emerge it," + ewarn "if that doesn't help or the application accesses the socket without using libpq," + ewarn "please file a bug-report." + ewarn "You can set PGOPTS='-k /tmp' in /etc/conf.d/postgresql-${SLOT} to restore the original location." + + elog "Execute the following command to setup the initial database environment:" + elog + elog "emerge --config =${CATEGORY}/${PF}" + elog + elog "The autovacuum function, which was in contrib, has been moved to the main" + elog "PostgreSQL functions starting with 8.1." + elog "You can enable it in the clusters postgresql.conf." +} + +pkg_postrm() { + eselect postgresql update +} + +pkg_config() { + [[ -z "${PGDATA}" ]] && PGDATA="/var/lib/postgresql/${SLOT}/data" + + einfo "You can pass options to initdb by setting the PG_INITDB_OPTS variable." + einfo "More information can be found here:" + einfo " http://www.postgresql.org/docs/${SLOT}/static/creating-cluster.html" + einfo " http://www.postgresql.org/docs/${SLOT}/static/app-initdb.html" + einfo "Simply add the options you would have added to initdb to the PG_INITDB_OPTS variable." + einfo + einfo "You can change the directory where the database cluster is being created by setting" + einfo "the PGDATA variable." + einfo + einfo "PG_INITDB_OPTS is currently set to:" + einfo " \"${PG_INITDB_OPTS}\"" + einfo "and the database cluster will be created in:" + einfo " \"${PGDATA}\"" + einfo "Are you ready to continue? (Y/n)" + read answer + [ -z $answer ] && answer=Y + [ "$answer" == "Y" ] || [ "$answer" == "y" ] || die "aborted" + + if [[ -f "${PGDATA}/PG_VERSION" ]] ; then + eerror "The given directory \"${PGDATA}\" already contains a database cluster." + die "cluster already exists" + fi + + [ -z "${PG_MAX_CONNECTIONS}" ] && PG_MAX_CONNECTIONS="128" + einfo "Checking system parameters..." + + if ! use kernel_linux ; then + SKIP_SYSTEM_TESTS=yes + einfo " Tests not supported on this OS (yet)" + fi + + if [ -z ${SKIP_SYSTEM_TESTS} ] ; then + einfo "Checking whether your system supports at least ${PG_MAX_CONNECTIONS} connections..." + + local SEMMSL=$(sysctl -n kernel.sem | cut -f1) + local SEMMNS=$(sysctl -n kernel.sem | cut -f2) + local SEMMNI=$(sysctl -n kernel.sem | cut -f4) + local SHMMAX=$(sysctl -n kernel.shmmax) + + local SEMMSL_MIN=17 + local SEMMNS_MIN=$(( ( ${PG_MAX_CONNECTIONS}/16 ) * 17 )) + local SEMMNI_MIN=$(( ( ${PG_MAX_CONNECTIONS}+15 ) / 16 )) + local SHMMAX_MIN=$(( 500000 + ( 30600 * ${PG_MAX_CONNECTIONS} ) )) + + for p in SEMMSL SEMMNS SEMMNI SHMMAX ; do + if [ $(eval echo \$$p) -lt $(eval echo \$${p}_MIN) ] ; then + eerror "The value for ${p} $(eval echo \$$p) is below the recommended value $(eval echo \$${p}_MIN)" + eerror "You have now several options:" + eerror " - Change the mentioned system parameter" + eerror " - Lower the number of max.connections by setting PG_MAX_CONNECTIONS to a value lower than ${PG_MAX_CONNECTIONS}" + eerror " - Set SKIP_SYSTEM_TESTS in case you want to ignore this test completely" + eerror "More information can be found here:" + eerror " http://www.postgresql.org/docs/${SLOT}/static/kernel-resources.html" + die "system test failed" + fi + done + einfo "Passed." + else + einfo "Skipped." + fi + + einfo "Creating the data directory ..." + mkdir -p "${PGDATA}" + chown -Rf postgres:postgres "${PGDATA}" + chmod 0700 "${PGDATA}" + + einfo "Initializing the database ..." + + su postgres -c "/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb --pgdata \"${PGDATA}\" ${PG_INITDB_OPTS}" + + einfo + einfo "You can use the '${ROOT}/etc/init.d/postgresql-${SLOT}' script to run PostgreSQL instead of 'pg_ctl'." + einfo + + if [ "${PGDATA}" != "/var/lib/postgresql/${SLOT}/data" ] ; then + ewarn "You didn't install the database cluster in the standard location, please make sure that you set" + ewarn "PGDATA=\"${PGDATA}\" in the appropriate conf.d file (probably /etc/conf.d/postgresql-${SLOT})" + fi +} + +src_test() { + einfo ">>> Test phase [check]: ${CATEGORY}/${PF}" + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake -j1 check \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + NO_PGXS=0 USE_PGXS=1 SLOT=${SLOT} || die "Make check failed. See above for details." + + einfo "Yes, there are other tests which could be run." + einfo "... and no, we don't plan to add/support them." + einfo "For now, the main regressions tests will suffice." + einfo "If you think other tests are necessary, please submit a" + einfo "bug including a patch for this ebuild to enable them." +} diff --git a/dev-db/postgresql-server/postgresql-server-8.3.1.ebuild b/dev-db/postgresql-server/postgresql-server-8.3.1.ebuild index ce48f96ad431..c3bcbaf98b7e 100644 --- a/dev-db/postgresql-server/postgresql-server-8.3.1.ebuild +++ b/dev-db/postgresql-server/postgresql-server-8.3.1.ebuild @@ -1,6 +1,6 @@ # Copyright 1999-2008 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/postgresql-server-8.3.1.ebuild,v 1.4 2008/06/04 21:44:07 dev-zero Exp $ +# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/postgresql-server-8.3.1.ebuild,v 1.5 2008/06/14 11:49:54 dev-zero Exp $ EAPI="1" @@ -52,7 +52,7 @@ src_unpack() { cd "${S}" epatch "${FILESDIR}/postgresql-${SLOT}-common.patch" \ - "${FILESDIR}/postgresql-${SLOT}-server.patch" + "${FILESDIR}/postgresql-${SLOT}.1-server.patch" if hasq test ${FEATURES}; then sed -e "s|/no/such/location|${S}/src/test/regress/tmp_check/no/such/location|g" -i src/test/regress/{input,output}/tablespace.source diff --git a/dev-db/postgresql-server/postgresql-server-8.3.3.ebuild b/dev-db/postgresql-server/postgresql-server-8.3.3.ebuild new file mode 100644 index 000000000000..add04bd25a48 --- /dev/null +++ b/dev-db/postgresql-server/postgresql-server-8.3.3.ebuild @@ -0,0 +1,249 @@ +# Copyright 1999-2008 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/dev-db/postgresql-server/postgresql-server-8.3.3.ebuild,v 1.1 2008/06/14 11:49:54 dev-zero Exp $ + +EAPI="1" + +WANT_AUTOCONF="latest" +WANT_AUTOMAKE="none" +inherit eutils multilib toolchain-funcs versionator autotools + +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~sh ~sparc ~x86 ~x86-fbsd" + +DESCRIPTION="PostgreSQL server" +HOMEPAGE="http://www.postgresql.org/" +SRC_URI="mirror://postgresql/source/v${PV}/postgresql-${PV}.tar.bz2" +LICENSE="POSTGRESQL" +SLOT="$(get_version_component_range 1-2)" +IUSE_LINGUAS=" + linguas_af linguas_cs linguas_de linguas_es linguas_fa linguas_fr + linguas_hr linguas_hu linguas_it linguas_ko linguas_nb linguas_pl + linguas_pt_BR linguas_ro linguas_ru linguas_sk linguas_sl linguas_sv + linguas_tr linguas_zh_CN linguas_zh_TW" +IUSE="doc perl python selinux tcl uuid xml nls kernel_linux ${IUSE_LINGUAS}" + +wanted_languages() { + for u in ${IUSE_LINGUAS} ; do + use $u && echo -n "${u#linguas_} " + done +} + +RDEPEND="~dev-db/postgresql-base-${PV}:${SLOT} + perl? ( >=dev-lang/perl-5.6.1-r2 ) + python? ( >=dev-lang/python-2.2 dev-python/egenix-mx-base ) + selinux? ( sec-policy/selinux-postgresql ) + tcl? ( >=dev-lang/tcl-8 ) + uuid? ( dev-libs/ossp-uuid ) + xml? ( dev-libs/libxml2 dev-libs/libxslt )" +DEPEND="${RDEPEND} + sys-devel/flex + xml? ( dev-util/pkgconfig )" +PDEPEND="doc? ( dev-db/postgresql-docs:${SLOT} )" + +S="${WORKDIR}/postgresql-${PV}" + +pkg_setup() { + enewgroup postgres 70 + enewuser postgres 70 /bin/bash /var/lib/postgresql postgres +} + +src_unpack() { + unpack ${A} + cd "${S}" + + epatch "${FILESDIR}/postgresql-${SLOT}-common.patch" \ + "${FILESDIR}/postgresql-${SLOT}-server.patch" + + if hasq test ${FEATURES}; then + sed -e "s|/no/such/location|${S}/src/test/regress/tmp_check/no/such/location|g" -i src/test/regress/{input,output}/tablespace.source + else + echo "all install:" > "${S}/src/test/regress/GNUmakefile" + fi + + eautoconf +} + +src_compile() { + # TODO: test if PPC really cannot work with other CFLAGS settings + # use ppc && CFLAGS="-pipe -fsigned-char" + + # eval is needed to get along with pg_config quotation of space-rich entities. + eval econf "$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --configure)" \ + --disable-thread-safety \ + $(use_with perl) \ + $(use_with python) \ + $(use_with tcl) \ + $(use_with xml libxml) \ + $(use_with xml libxslt) \ + $(use_with uuid ossp-uuid) \ + --with-system-tzdata="/usr/share/zoneinfo" \ + --with-includes="/usr/include/postgresql-${SLOT}/" \ + "$(built_with_use ~dev-db/postgresql-base-${PV} nls && use_enable nls nls "$(wanted_languages)")" \ + || die "configure failed" + + for bd in . contrib $(use xml && echo contrib/xml2); do + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake -C $bd -j1 LD="$(tc-getLD) $(get_abi_LDFLAGS)" \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + PGXS_IN_SERVER=1 PGXS_WITH_SERVER="${S}/src/backend/postgres" \ + NO_PGXS=0 USE_PGXS=1 docdir=/usr/share/doc/${PF} || die "emake in $bd failed" + done +} + +src_install() { + if use perl ; then + mv -f "${S}/src/pl/plperl/GNUmakefile" "${S}/src/pl/plperl/GNUmakefile_orig" + sed -e "s:\$(DESTDIR)\$(plperl_installdir):\$(plperl_installdir):" \ + "${S}/src/pl/plperl/GNUmakefile_orig" > "${S}/src/pl/plperl/GNUmakefile" + fi + + for bd in . contrib $(use xml && echo contrib/xml2) ; do + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake install -C $bd -j1 DESTDIR="${D}" \ + PGXS_IN_SERVER=1 PGXS_WITH_SERVER="${S}/src/backend/postgres" \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + NO_PGXS=0 USE_PGXS=1 docdir=/usr/share/doc/${PF} || die "emake install in $bd failed" + done + + rm -rf "${D}/usr/share/postgresql-${SLOT}/man/man7/" "${D}/usr/share/doc/${PF}/html" + rm "${D}"/usr/share/postgresql-${SLOT}/man/man1/{clusterdb,create{db,lang,user},drop{db,lang,user},ecpg,pg_{config,dump,dumpall,restore},psql,reindexdb,vacuumdb}.1 + + dodoc README HISTORY doc/{README.*,TODO,bug.template} + + dodir /etc/eselect/postgresql/slots/${SLOT} + cat >"${D}/etc/eselect/postgresql/slots/${SLOT}/service" <<-__EOF__ + postgres_ebuilds="\${postgres_ebuilds} ${PF}" + postgres_service="postgresql-${SLOT}" + __EOF__ + + newinitd "${FILESDIR}/postgresql.init-${SLOT}" postgresql-${SLOT} || die "Inserting init.d-file failed" + newconfd "${FILESDIR}/postgresql.conf-${SLOT}" postgresql-${SLOT} || die "Inserting conf.d-file failed" + + keepdir /var/run/postgresql + fperms 0770 /var/run/postgresql + fowners postgres:postgres /var/run/postgresql +} + +pkg_postinst() { + eselect postgresql update + [[ "$(eselect postgresql show)" = "(none)" ]] && eselect postgresql set ${SLOT} + [[ "$(eselect postgresql show-service)" = "(none)" ]] && eselect postgresql set-service ${SLOT} + + ewarn "Please note that the standard location of the socket has changed from /tmp" + ewarn "to /var/run/postgresql and you have to be in the 'postgres' group to access" + ewarn "the socket." + ewarn "This can break applications which have the standard location hard-coded." + ewarn "If such an application links against the libpq, please re-emerge it," + ewarn "if that doesn't help or the application accesses the socket without using libpq," + ewarn "please file a bug-report." + ewarn "You can set PGOPTS='-k /tmp' in /etc/conf.d/postgresql-${SLOT} to restore the original location." + + elog "Execute the following command to setup the initial database environment:" + elog + elog "emerge --config =${CATEGORY}/${PF}" + elog + elog "The autovacuum function, which was in contrib, has been moved to the main" + elog "PostgreSQL functions starting with 8.1." + elog "You can enable it in the clusters postgresql.conf." +} + +pkg_postrm() { + eselect postgresql update +} + +pkg_config() { + [[ -z "${PGDATA}" ]] && PGDATA="/var/lib/postgresql/${SLOT}/data" + + einfo "You can pass options to initdb by setting the PG_INITDB_OPTS variable." + einfo "More information can be found here:" + einfo " http://www.postgresql.org/docs/${SLOT}/static/creating-cluster.html" + einfo " http://www.postgresql.org/docs/${SLOT}/static/app-initdb.html" + einfo "Simply add the options you would have added to initdb to the PG_INITDB_OPTS variable." + einfo + einfo "You can change the directory where the database cluster is being created by setting" + einfo "the PGDATA variable." + einfo + einfo "PG_INITDB_OPTS is currently set to:" + einfo " \"${PG_INITDB_OPTS}\"" + einfo "and the database cluster will be created in:" + einfo " \"${PGDATA}\"" + einfo "Are you ready to continue? (Y/n)" + read answer + [ -z $answer ] && answer=Y + [ "$answer" == "Y" ] || [ "$answer" == "y" ] || die "aborted" + + if [[ -f "${PGDATA}/PG_VERSION" ]] ; then + eerror "The given directory \"${PGDATA}\" already contains a database cluster." + die "cluster already exists" + fi + + [ -z "${PG_MAX_CONNECTIONS}" ] && PG_MAX_CONNECTIONS="128" + einfo "Checking system parameters..." + + if ! use kernel_linux ; then + SKIP_SYSTEM_TESTS=yes + einfo " Tests not supported on this OS (yet)" + fi + + if [ -z ${SKIP_SYSTEM_TESTS} ] ; then + einfo "Checking whether your system supports at least ${PG_MAX_CONNECTIONS} connections..." + + local SEMMSL=$(sysctl -n kernel.sem | cut -f1) + local SEMMNS=$(sysctl -n kernel.sem | cut -f2) + local SEMMNI=$(sysctl -n kernel.sem | cut -f4) + local SHMMAX=$(sysctl -n kernel.shmmax) + + local SEMMSL_MIN=17 + local SEMMNS_MIN=$(( ( ${PG_MAX_CONNECTIONS}/16 ) * 17 )) + local SEMMNI_MIN=$(( ( ${PG_MAX_CONNECTIONS}+15 ) / 16 )) + local SHMMAX_MIN=$(( 500000 + ( 30600 * ${PG_MAX_CONNECTIONS} ) )) + + for p in SEMMSL SEMMNS SEMMNI SHMMAX ; do + if [ $(eval echo \$$p) -lt $(eval echo \$${p}_MIN) ] ; then + eerror "The value for ${p} $(eval echo \$$p) is below the recommended value $(eval echo \$${p}_MIN)" + eerror "You have now several options:" + eerror " - Change the mentioned system parameter" + eerror " - Lower the number of max.connections by setting PG_MAX_CONNECTIONS to a value lower than ${PG_MAX_CONNECTIONS}" + eerror " - Set SKIP_SYSTEM_TESTS in case you want to ignore this test completely" + eerror "More information can be found here:" + eerror " http://www.postgresql.org/docs/${SLOT}/static/kernel-resources.html" + die "system test failed" + fi + done + einfo "Passed." + else + einfo "Skipped." + fi + + einfo "Creating the data directory ..." + mkdir -p "${PGDATA}" + chown -Rf postgres:postgres "${PGDATA}" + chmod 0700 "${PGDATA}" + + einfo "Initializing the database ..." + + su postgres -c "/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb --pgdata \"${PGDATA}\" ${PG_INITDB_OPTS}" + + einfo + einfo "You can use the '${ROOT}/etc/init.d/postgresql-${SLOT}' script to run PostgreSQL instead of 'pg_ctl'." + einfo + + if [ "${PGDATA}" != "/var/lib/postgresql/${SLOT}/data" ] ; then + ewarn "You didn't install the database cluster in the standard location, please make sure that you set" + ewarn "PGDATA=\"${PGDATA}\" in the appropriate conf.d file (probably /etc/conf.d/postgresql-${SLOT})" + fi +} + +src_test() { + einfo ">>> Test phase [check]: ${CATEGORY}/${PF}" + PATH="/usr/$(get_libdir)/postgresql-${SLOT}/bin:${PATH}" \ + emake -j1 check \ + PGXS=$(/usr/$(get_libdir)/postgresql-${SLOT}/bin/pg_config --pgxs) \ + NO_PGXS=0 USE_PGXS=1 SLOT=${SLOT} || die "Make check failed. See above for details." + + einfo "Yes, there are other tests which could be run." + einfo "... and no, we don't plan to add/support them." + einfo "For now, the main regressions tests will suffice." + einfo "If you think other tests are necessary, please submit a" + einfo "bug including a patch for this ebuild to enable them." +} |